t1djani/war-room

GitHub: t1djani/war-room

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

Stars: 0 | Forks: 0

war-room # war-room **为你的艰难决策进行兵棋推演。** 一个由不串谋的军官组成的委员会——加上一名*必须*反驳你的异议者——会得出获胜的战略,以及什么会导致它失败。 *五位军官,五种对你的问题产生误判的方式。* [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-d97757.svg)](https://docs.claude.com/en/docs/claude-code) [![status: alpha](https://img.shields.io/badge/status-alpha-orange.svg)](#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插件, 多智能体, 应用安全, 思维框架, 防御加固