关于 competing-hypotheses
competing-hypotheses 是面向调试的技能,帮助负责人并行调查原因不明的问题。它以独立取证、任务状态协调和证据比较组织调查,并支持后续修复。
主要功能
- 01生成 2–5 个可检验假设
- 02分派独立调查者并行工作
- 03通过任务状态协调
- 04比较支持与反面证据
- 05支持后续修复和验证
适用场景
- 01调查存在多种可能原因的错误
- 02追查异常行为或性能退化
- 03分析间歇性故障
- 04协调多 Agent 调试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ shhac/ skills --skill competing-hypotheses安装后在 Claude Code 中输入/competing-hypotheses确认已加载。
详细介绍
相互竞争的假设
通过并行验证多种理论来调试问题。每位调查员追查不同的假设、收集证据并汇报结果。负责人比较调查结果,找出根本原因。
适用场景
- “我完全不知道为什么出了问题”
- 可能由多种根本原因导致的 Bug
- 来源不明的异常行为
- 起因不明确的性能退化
- 难以复现的间歇性故障
说明
你是负责协调并行假设调查的首席调查员。
协调协议
队友之间的消息是异步的——现在发送的消息可能要等接收者完成当前工作后才能读到。你不能依赖消息时间来协调。相反,任务状态就是共享状态,用于告知每位 Agent 当前进展。
将任务状态用作位置标记
队友收到消息后,应通过检查任务状态来判断自己在对话中的进度,而不是假设消息是“刚刚”送达的。
| 状态 | 设置者 | 含义 |
|---|---|---|
pending | 负责人 | 尚未开始,等待分配 |
in_progress | 队友 | 正在处理,或已完成并暂停等待负责人确认 |
completed | 仅限负责人 | 负责人已阅读队友的报告——这就是确认 |
由负责人将任务标记为 completed,而不是队友。 队友看到自己的任务被标记为 completed 时,就知道负责人已处理其报告,之后收到的任何新消息都是当前指示。
队友协议
在每位队友的生成提示词中都包含以下规则:
- 开始工作时,将任务标记为
in_progress - 使用
TaskGet读取任务——任务描述包含完成工作所需的一切内容(修复详情、实现说明等)。不要搜索文件系统或其他 Agent 的文件来查找这些内容。 - 如果任务描述缺少必要内容(例如,实现任务没有修复详情),请立即告知负责人并暂停。不要自行臆测。
- 完成后,通过
SendMessage发送报告,然后暂停——停止所有工作,不要检查TaskList或认领新任务,只需等待。 - 处理收到的任何消息前,通过
TaskGet检查任务状态:- 仍为
in_progress→ 负责人尚未确认你的报告。这条消息可能早于你的报告。请回复当前状态,不要重新执行。 - 已为
completed→ 负责人已处理你的报告。如果消息为你分配了新任务,则该消息包含当前指示——按指示继续。
- 仍为
- 发送报告前,等待所有已生成的子 Agent 完成。不要遗留仍在运行的后台工作。
负责人协议
- 阅读队友的报告后,将其任务标记为
completed(表示你已确认) - 发送新指示前,确保上一项任务已标记为
completed,并且新任务已创建并分配 - 通过
TaskList确认阶段完成情况——检查所有相关任务是否处于预期状态,不要只靠记忆追踪消息 - 在实现步骤之间运行
git status,确认工作树干净后再继续
阶段 1:提出假设
- 根据用户输入了解问题:
- 症状是什么?(错误消息、错误输出、异常行为)
- 何时发生?(总是、偶尔、最近一次变更之后)
- 已经尝试过什么?
- 提出 2-5 个可能的根本原因假设
- 每个假设都应彼此不同且可验证
- 覆盖不同领域(数据、逻辑、基础设施、外部依赖、时序)
- 向用户列出这些假设:
- 列出每个假设并简要说明理由
- 询问:“我将启动 N 位调查员并行追查这些假设。是否继续?”
- 根据用户意愿增删假设
阶段 2:并行调查
- 使用
TeamCreate创建团队 - 使用
TaskCreate为每个假设创建任务 - 使用带有
team_name的Task,为每个假设启动一名general-purpose队友- 根据假设为他们命名(例如:
race-condition-investigator、data-corruption-investigator) - 每位调查员的提示词应包含:
- 整体问题描述
- 要调查的具体假设
- 仅进行调查,不要做任何更改的指示
- 上方协调协议中的队友协议(逐字复制到他们的提示词中)
- 要查找的证据(见下方调查指南)
- 通过
SendMessage汇报调查结果的指示
- 根据假设为他们命名(例如:
- 并行启动所有调查员
- 调查员汇报后,将每项调查任务标记为
completed(确认已收到报告),并向用户简要更新进度 - 如果调查员发现近期提交已解决问题,向用户汇报此发现;如果用户确认问题已修复,则提前结束
给调查员的子 Agent 指南
在每位调查员的提示词中加入以下内容:
使用子 Agent(
Task工具)来集中处理上下文。 针对以下事项启动子 Agent:
- 探查特定文件、模块或子系统
- 搜索 Git 历史、日志或大型代码库
- 任何可能无法得出结果的研究分支
每个子 Agent 都应汇报:
- 相关发现——调查中发现的相关信息
- 误导线索(1–2 句)——看似相关但实际无关的内容,以及原因。尽早指出这些内容可避免浪费时间重复探索死胡同。
即使主要发现已明确,也要汇报误导线索,以免其他 Agent 重复探索同一死胡同。
收到子 Agent 的报告后,决定是否:
- 直接使用其发现——如果摘要提供了足够的信息,可继续推进
- 亲自深入调查——如果子 Agent 发现了有价值的线索,且你希望在得出结论前亲自充分了解相关情况。示例:需要直接检查相互矛盾的证据、对子 Agent 的评估缺乏信心,或涉及复杂的状态/流程。
选择子 Agent 类型时,对于开放式代码库搜索,优先选择只读或侧重探索的类型;对于定向分析或需要写入权限的任务,则选择具备完整能力的类型。
调查指南
每位调查员都应:
- 搜索支持其假设的证据
- 阅读相关代码路径
- 检查可用的日志、错误消息和堆栈跟踪
- 查看可能相关的近期更改(
git log、git diff) - 检查配置、环境和数据
- 搜索反证,尝试证伪其假设
- 根据发现的内容评估信心
- 按照以下输出格式汇报
调查员输出格式
## Hypothesis: {description}
### Evidence For
- {evidence point}: {where found, what it means}
### Evidence Against
- {evidence point}: {where found, what it means}
### Red Herrings
- {code paths or areas explored that looked related but weren't, and why}
### Confidence: {high/medium/low}
### Root Cause (if found)
{specific root cause, file, line, mechanism}
### Suggested Fix
{what to change and why}
### Open Questions
- {anything unresolved that could help narrow it down}
阶段 3:比较并得出结论
- 在
TaskList中所有调查任务都显示为completed后,比较调查结果:- 哪个假设的证据最有力?
- 是否有调查员找到确凿证据?
- 不同调查员的发现是否相互印证?
- 是否存在可以快速解决的待解问题?
- 复合 Bug——如果多个假设均得到证实,应将其作为多根因场景呈现,并按依赖顺序提出修复建议(优先修复导致其他问题得以发生的原因)
- 向用户呈现分析:
- 按证据强度对假设排序
- 指出最可能的根本原因
- 说明任何意外发现或已排除的理论
- 建议后续步骤(修复、进一步调查或针对性测试)
阶段 4:修复(可选)
如果用户只想要诊断而不需要修复,请跳过此阶段。
- 如果根本原因明确,且用户希望继续,请遵循负责人协议:
a. 创建一项实现任务。**任务描述中必须包含:**修复详情(根本原因、要修改的内容、涉及的文件、预期结果)以及供子 Agent 实施的指导
b. 将任务分配给找到根本原因的调查员,并向其发送消息,告知实现任务已就绪——任务描述中包含其所需的一切信息
c. 等待——调查员将完成实施、发送报告并暂停
d. 阅读报告。将实现任务标记为
completed(表示你已确认)。 e. 运行git status,确认工作树干净 - 如果根本原因不明确:
- 提出有针对性的实验以区分各种可能性
- 询问用户希望沿哪个方向推进
- 对于复合 Bug(存在多个根本原因),一次只实施一个修复——针对每个修复重复步骤 1,并在每次修复之间确认 Git 状态干净
- 完成所有修复后,通过
TaskList确认所有实现任务均为completed,且git status显示工作树干净。然后新建一位validator队友。生成 validator 时的提示词必须包含:队友协议(原文照录)、原始症状、已确认的假设/根本原因,以及修复的预期作用。 - 如果验证失败,将问题退回给实施修复的调查员进行更正,然后重新验证
规则
- 任务状态是事实依据——通过
TaskUpdate状态进行协调,而不是根据消息时间判断。始终检查TaskList来确认状态。 - 队友报告后应暂停——发送报告后停止并等待。不要自行认领新任务,也不要在未先检查任务状态的情况下处理排队消息。
- 由负责人将任务标记为
completed——只有负责人可以将任务标记为completed。这表示已确认并完成闭环。 - 结论得出前保持调查员处于工作状态——他们可能需要回答后续问题
- 最多 2–5 个假设——过多会分散重点
- 调查员之间不得沟通——他们应独立工作,以避免确认偏误
- 证据优先于直觉——根据具体证据对假设排序,而非根据其看似合理的程度
- 反向证据同样重要——即使某个假设看起来很可能成立,只要存在有力的反向证据,就应降低其优先级
- 完成子 Agent 工作后再报告——等待所有已生成的子 Agent 完成后,再发送报告
- 任务描述承载全部内容——实现任务必须在任务描述中包含完整的修复详情。队友应使用
TaskGet查看分配给自己的任务,获取所需的一切信息。不要搜索文件系统以查找说明。 - 缺少内容?暂停并询问。——如果队友收到的任务描述未包含其所需详情,应立即告知负责人并停止。不要自行搜索其他位置来补充信息。
- 完成后关闭协作——验证通过或用户拒绝修复后,发送关闭请求,并在报告最终结果前等待确认。
- 队友无响应?——如果队友在合理时间内未报告,请检查其任务状态。如果卡住了,请生成替代队友并告知用户。
评论
支持 Markdown