Install
openclaw skills install auto-research-proposalMulti-agent research war room. Personas debate in sequential turns through two phases — ideation and proposal writing. Persona persistence and drift detection are enforced every turn via the persistent-persona skill.
openclaw skills install auto-research-proposalA 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
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.
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.
If you cannot spawn subagents, run the same loop inline. For each persona turn:
--- [Round N] <Persona Name> ---[AGREE], [PASS], or [OBJECT: reason]).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.
Follow this sequence exactly. You are the moderator/orchestrator throughout.
Spawn the monitor in a new terminal window so the user can watch the session live:
osascript -e 'tell application "Terminal" to do script "cd '"'"'<repo_root>'"'"' && python skills/war-room/monitor.py --project <project_path>"'
xterm -title "War Room Monitor" -e "python skills/war-room/monitor.py --project <project_path>" &
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.
memory/SUMMARY.md for current phase and round.memory/war-room/discussion-log.md with a header block (project name, configuration, timestamp).Ensure memory/.private/ folder exists for persona memos.
For each round (up to 5):
For each participant in configuration order:
a. Prepare persona context
memory/.private/agent-<index>-memo.md if it exists.Drift flag. If yes, prepend a PERSONA RESET block to the subagent SI:
PERSONA RESET: I am <persona name>. My core stance: <one-line from persona file>.
I may have drifted last round. I am recommitting before engaging.
I will not update positions without new evidence.
b. Call Agent subagent with this SI (in order):
first-principles contentpersistent-persona skill instructionsUser message: "It's your turn. Respond to the discussion. End your response with [AGREE], [PASS], or [OBJECT: reason]."
c. Append to log
memory/war-room/discussion-log.md in this format:
---
**[Round N] <Persona Name>**
<response text>
d. Write persona memo
memory/.private/agent-<index>-memo.md:
## <YYYYMMDD_HHMMSS>
**Persona**: <name>
**Session summary**: <one sentence>
**Position changes**: <what changed, what evidence caused it>
**Pressure events**: <did the persona hold under pressure?>
**Mental state**: <reasoning from own stance or mirroring group?>
**Drift flag**: <yes | no>
After all participants have spoken in a round:
e. Check consensus
[AGREE] or [PASS] and no [OBJECT]: Phase 1 ends early.[PASS]: Phase 1 ends early.f. Checkpoint
memory/checkpoints/<timestamp>/agent-0.md (your moderator state: current round, phase, next action).memory/SUMMARY.md.g. Synthesiser snapshot (after round 3 or on early exit)
memory/war-room/idea-snapshot.md.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.
proposal-draft.md.
Task: "Produce the final clean research proposal. Follow the research-proposal skill format exactly. 2 pages max."memory/war-room/proposal-draft.md (overwrite with final version).discussion-log.md, idea-snapshot.md, and proposal-draft.md to <sandbox_root>/results/.memory/SUMMARY.md with status: complete.<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.