t1djani/war-room
GitHub: t1djani/war-room
一个 Claude Code 决策推演插件,通过多智能体委员会与强制异议者机制,为艰难决策产出带失败分析的可审计战略档案。
Stars: 0 | Forks: 0

# war-room
**为你的艰难决策进行兵棋推演。**
一个由不串谋的军官组成的委员会——加上一名*必须*反驳你的异议者——会得出获胜的战略,以及什么会导致它失败。
*五位军官,五种对你的问题产生误判的方式。*
[](LICENSE)
[](https://docs.claude.com/en/docs/claude-code)
[](#roadmap)
## 快速开始
```
/plugin marketplace add t1djani/war-room
/plugin install war-room@war-room
```
然后,针对任何艰难的决策:
```
/war-room "Postgres or a graph DB for the relationship features?"
```
你会得到一份**战略 (STRATEGY)**、一份**作战计划 (BATTLE-PLAN)** 以及**我们如何落败 (HOW-WE-LOSE)** —— 即那些可能击溃该计划的失败情境,每一种都基于真实的参考或被标记为推测性内容。没有评分。没有虚假的共识。
**可选操作——安排能够阅读*你*代码库的军官。** 运行一次此命令,将默认的五位通用军官替换为映射到你项目真实领域的军官:
```
/war-room-roster
```
它会(浅层地)扫描项目,*提议*一份名单,并且只有在确认后才会写入 `.war-room/roster.yaml`。如果你只想快速运行,可以跳过这一步——默认的 `/war-room` 从不扫描。
## 理念
大多数“询问多个 LLM”的工具都为**共识**而优化:轮询 N 个模型,取平均值,让主持人进行综合。取平均值恰恰丢弃了这项演练旨在产生的唯一价值——桌上所有人都没有关注到的视角。
war-room 为**有理有据的分歧**而优化。这里的“战争”指的是你的决策;“作战室”是一个由军官组成的委员会,每位军官以不同的方式对问题进行建模,为达成战略而辩论,还有一名强制要求的异议者——即**第十人**——其职责就是构建出该战略宣告失败的情境。
## 为什么与众不同
在提示词中加入“一个异议者”只需一行字;任何人都能做到。真正的壁垒在于**这套组合拳**,缺少其中任何一个环节,都会让你退回到普通的“辩论与裁决”模式:
- **第十人轮换并最后发言。** 他在多数派形成*之后*才被指派,被设定为一位*曾认同*该共识而现在必须反驳的人(真正的赎罪日原则——你要反驳自己曾经持有的观点)。他会提供一份**带有日期的预演尸检**——即“六个月过去了,这事儿搞砸了,机制在此”——而不是简单的反命题。
- **他可以保持沉默。** “没有有理有据的反驳意见 → 一切顺利”是一种有效且不会受罚的输出。一个*永远*闭不上嘴的异议者就是一台误报生成器。这是核心支撑规则;没有它,委员会就只会制造噪音。
- **他的异议会被进行可预测性评分。** 一名强制要求的异议者往往会抓取*最有可能*的反对意见——也就是最平庸、大家早就预料到的盲点。因此,在第十人发言之前,一个独立的 agent(对他保密)会记录下**任何人都能预料到的前 3 条反对意见**。如果他的反对意见属于该基准,就会被评分为 `predictable`(可预测的)——这是共同的盲点,而不是分歧——并且会被退回一次,要求其提供*不明显的*失败机制。该评分不是一个数字;而是一种基于记录的基准线的分类,事后可被审计。没有其他人会去衡量这种分歧是否*显而易见*。
- **溯源是外部性的。** 每条反对意见都会指向一个可打开的参考(`file:line`、清单条目、文档行)或被标记为 `speculative`(推测性)。用与编写时相同的上下文重新阅读工作成果来进行检查,只是一种表演——因此,一个确定性的 [hook](hooks/validate-dossier.sh) 会验证其结构,并确保每个参考都*能被解析*。(它不会判断该参考是否*支持*该论点——这部分交由人类处理,并坦诚其具有随机性。)
- **输出是一份冻结的档案。** 多 agent 辩论具有随机性;war-room 绝不会假装其结论在重演时完全一致。产出物是一份*冻结的、可审计的记录*——立场、有理有据的反对意见,以及指挥官的最终封板定论。
## 委员会
人类是**指挥官**:主持会议,听取委员会意见,并做出最终决定。军官负责提供建议;最终由指挥官一锤定音。
| 军官 | 将问题建模为 | 标志性问题 |
|---|---|---|
| **侦察兵** | 事实与假设 | “我们到底是*知道*这一点,还是在*假设*它?” |
| **战略家** | 选项空间 | “第三种选择是什么?” |
| **元帅** | 回报与机会成本 | “哪个选项会胜出,如果我们什么都不做会失去什么?” |
| **军需官** | 可行性,何处会崩溃 | “哪一环会最先断裂?” |
| **第十人** | 反驳共识本身 | “假设我们已经输了——是什么击溃了我们?” |
每位军官都是对问题的*独特建模*,而不是一种情绪——在相同模型下改变语气只是表面上的多样性,war-room 拒绝这种做法。完整的推理和来源详见 [docs/roster.md](docs/roster.md)。
## 产出示例
```
STRATEGY: Postgres now; revisit a graph DB only if traversal depth > 3 becomes a hot path.
why-it-wins: ships the relationship features on the stack the team runs, with a named exit condition.
BATTLE-PLAN:
- model relationships as adjacency tables; add recursive CTEs behind a repository port.
- put a benchmark gate on traversal latency so the exit condition is measurable.
BASELINE: # the obvious objections, recorded before the Tenth Man, blind to him
- "a graph DB would be faster for deep traversal"
- "migrating later will be expensive"
- "the team has no graph experience"
HOW-WE-LOSE:
- by: The Quartermaster
axis: feasibility
claim: recursive CTEs degrade past ~4 hops on the current instance size.
grounding: docs/benchmarks/traversal.md:12
status: not-defused
- by: The Tenth Man
axis: refuting the consensus
claim: "we lock into adjacency tables, then the product pivots to graph-native features and the migration costs a quarter."
grounding: speculative
failure-world: "Q4 — recommendations need 6-hop traversal; we rewrite the data layer under deadline."
predictability: novel # not in the baseline — a real blind spot, not the obvious risk
status: bet-accepted
```
### 在真实决策中查看
**▶ [查看实时渲染的报告](https://t1djani.github.io/war-room/examples/sample-dossier.html)** —— 或阅读 [源文件](examples/sample-dossier.md)。
这是一次针对“*小团队的两项服务,应该用 monorepo 还是两个独立的仓库?*”的真实 war-room 运行。四位军官在“两个仓库优先契约”上达成了一致。然后,第十人在基准线遗漏的某处被评分为 `novel`(新颖的):一项 schema 契约测试检查了列名和类型,但这个边界会在*值内部*断裂——绿色的 CI 检查认证了一个实际上已损坏的契约,直到产品发布了自信满满却错误的答案。该异议重塑了作战计划(测试数据的不变性,而不是 schema 结构)。这就是整个闭环的运作方式:强制性的分歧改变了决策。
## 运作机制
**成本随利害关系而调整。** `quick`(默认)让军官们运行在快速模型上,而将强大的模型预留给第十人(他的任务最艰难)。对于不可逆的、逆转成本高昂的或对安全敏感的决策,`thorough` 会让每位军官都在强大的模型上运行。
**一个文件即可使其适应你的项目。** 放入一个 `.war-room/roster.yaml` 文件,将通用军官替换为你真实领域的军官——每个人保留其人格设定,其负责的切片就成为你代码库的真实切片。其他一切都是通用的。请参阅 [examples/roster.example.yaml](examples/roster.example.yaml)。不想手动编写?只需运行一次 `/war-room-roster`——它会扫描项目,*提议*一份名单,并且只有在确认后才会写入文件。这是可选操作:默认的 `/war-room` 从不扫描,因此常规运行保持即时完成。
**它知道什么时候不该运行。** 如果某个具名的权威依据——一项测试、一份规范、一项不变性——能够解决问题,war-room 就会指出这一点并停止运行。对一个已有定论的事实进行辩论只是走过场;取而代之的做法是去验证它。
**文本优先,HTML 按需提供。** 报告是一个纯文本文件——可审计、可进行 diff 对比、可被 hook 检查。当你需要分享或截图时,`/war-room-render` 会将其转换为一个带有样式、无依赖的 HTML 页面(文本始终是事实的唯一来源;页面只是一个视图)。
**插件布局**
```
war-room/
├── .claude-plugin/{plugin.json, marketplace.json}
├── skills/war-room/ # the council and the procedure — markdown, this is the core
├── commands/ # /war-room, /war-room-roster, /war-room-render
├── hooks/ # validate-dossier.sh — deterministic structure + grounding check
├── scripts/ # render-dossier.py — dossier → self-contained HTML (stdlib)
├── examples/ # a roster to copy
└── docs/ # the roster reference + sources
```
## 开发
war-room 是 markdown 优先的:技能靠散文实现,名单是 YAML 格式,结构检查是 bash。不需要构建——编辑技能,重新加载插件,就完成了。
## 许可证
[MIT](LICENSE) © t1djani
## 路线图
- [x] **委员会** · 五位军官,每位都是基于决策科学的问题独特建模者。
- [x] **第十人** · 轮换制、带日期的预演尸检,并有权保持沉默。
- [x] **档案** · 战略 / 作战计划 / 基准线 / 我们如何落败,并附带确定性的结构检查。
- [x] **可预测性评分** · 落入已记录的前 3 条明显反对意见中的异议,会被评分判定为共同的盲点,而非分歧。
- [x] **名单发现** · 可选操作 `/war-room-roster` 扫描项目并提议特定领域的名单——默认运行从不扫描。
标签:AI辅助决策, Claude Code插件, 多智能体, 应用安全, 思维框架, 防御加固