War Room Skill
A war room runs personas through a structured two-phase session:
-
Phase 1 — Ideation (5 rounds max): personas debate the research idea question by question.
Ends early on consensus (all [AGREE] or [PASS], no [OBJECT]) or two consecutive all-[PASS] rounds.
Output: memory/war-room/idea-snapshot.md
-
Phase 2 — Proposal (5 rounds max): personas collaboratively draft each proposal section.
Output: memory/war-room/proposal-draft.md
Configurations
Defined in skills/war-room/personas/agents.json under the configurations key.
| Name | Participants | Use when |
|---|
full | Creative, Senior Prof, Young Faculty, Industry Liaison | Deep ideation, novel directions, full proposal needed |
1on1 | Senior Professor, Young Faculty | Quick feasibility check, tight scope |
The configuration is specified in PROJECT.md frontmatter under war_room.configuration. Default: full.
Consensus Protocol
Every persona response must end with one of:
| Tag | Meaning |
|---|
[AGREE] | I accept the current position |
[PASS] | No strong view either way |
[OBJECT: reason] | I reject — give specific reason |
Do not embed tags mid-response. They must be the final line.
Single-Agent Fallback (Codex / no subagent spawning)
If you cannot spawn subagents, run the same loop inline. For each persona turn:
- Print a clear header:
--- [Round N] <Persona Name> ---
- Adopt that persona fully for your response — voice, stance, debate style, red lines.
- End with the consensus tag (
[AGREE], [PASS], or [OBJECT: reason]).
- Return to moderator role between turns to write the log entry and check consensus.
Drift detection still applies: before each turn, re-read the persona definition and note whether your previous response for that persona drifted from their stance.
Playbook
Follow this sequence exactly. You are the moderator/orchestrator throughout.
Setup
-
Spawn the monitor in a new terminal window so the user can watch the session live:
- macOS:
osascript -e 'tell application "Terminal" to do script "cd '"'"'<repo_root>'"'"' && python skills/war-room/monitor.py --project <project_path>"'
- Linux (with display):
xterm -title "War Room Monitor" -e "python skills/war-room/monitor.py --project <project_path>" &
- If the spawn fails, continue silently — the monitor is optional.
Replace <repo_root> with the absolute path to this repo and <project_path> with the active project folder path. The monitor requires rich (pip install rich).
-
Read skills/war-room/personas/agents.json. Load the selected configuration's participant list and synthesiser index.
-
For each participant, read their persona file (e.g. skills/war-room/personas/senior-professor.md).
-
Read skills/persistent-persona/SKILL.md and skills/memory-checkpoint/SKILL.md — you will apply these every turn.
-
Check if memory/war-room/discussion-log.md exists.
- If yes: load it — you are resuming a session. Read
memory/SUMMARY.md for current phase and round.
- If no: create
memory/war-room/discussion-log.md with a header block (project name, configuration, timestamp).
-
Ensure memory/.private/ folder exists for persona memos.
Phase 1 — Ideation
For each round (up to 5):
For each participant in configuration order:
a. Prepare persona context
b. Call Agent subagent with this SI (in order):
first-principles content
- Persona definition (full persona file content)
persistent-persona skill instructions
- (if drift) PERSONA RESET block
- The discussion log so far
User message: "It's your turn. Respond to the discussion. End your response with [AGREE], [PASS], or [OBJECT: reason]."
c. Append to log
d. Write persona memo
After all participants have spoken in a round:
e. Check consensus
- If all responses end with
[AGREE] or [PASS] and no [OBJECT]: Phase 1 ends early.
- If two consecutive rounds were all
[PASS]: Phase 1 ends early.
f. Checkpoint
- Write
memory/checkpoints/<timestamp>/agent-0.md (your moderator state: current round, phase, next action).
- Update
memory/SUMMARY.md.
g. Synthesiser snapshot (after round 3 or on early exit)
- Call a subagent with the synthesiser persona + discussion log.
- Task: "Summarise the agreed research idea so far in 3-5 bullet points."
- Write output to
memory/war-room/idea-snapshot.md.
Phase 2 — Proposal
Read skills/research-proposal/SKILL.md now. The proposal has 6 sections.
Assign one section per round (or pair related sections). Run the same per-turn loop as Phase 1, but each subagent's task is:
"Draft your contribution to Section N: <section name>. Build on what others have written. End with [AGREE], [PASS], or [OBJECT: reason]."
After each round, the synthesiser appends the agreed section draft to memory/war-room/proposal-draft.md.
Finalization
- Call a final subagent with the synthesiser persona + full
proposal-draft.md.
Task: "Produce the final clean research proposal. Follow the research-proposal skill format exactly. 2 pages max."
- Write output to
memory/war-room/proposal-draft.md (overwrite with final version).
- Copy
discussion-log.md, idea-snapshot.md, and proposal-draft.md to <sandbox_root>/results/.
- Write final checkpoint and update
memory/SUMMARY.md with status: complete.
Outputs
<project>/
├── memory/
│ ├── SUMMARY.md ← current phase, round, resume point
│ ├── war-room/
│ │ ├── discussion-log.md ← full turn-by-turn transcript (live)
│ │ ├── idea-snapshot.md ← synthesised agreed idea (written after round 3+)
│ │ └── proposal-draft.md ← accumulated proposal sections → final output
│ ├── .private/
│ │ ├── agent-1-memo.md ← persona drift memo (private, append-only)
│ │ ├── agent-2-memo.md
│ │ ├── agent-3-memo.md
│ │ └── agent-4-memo.md
│ └── checkpoints/
│ └── <timestamp>/
│ └── agent-0.md ← orchestrator state (phase, round, next action)
└── results/ ← copied here at session end
├── discussion-log.md
├── idea-snapshot.md
└── proposal-draft.md
The monitor (skills/war-room/monitor.py) reads memory/war-room/discussion-log.md, memory/SUMMARY.md, memory/war-room/idea-snapshot.md, and memory/.private/ in real time.