关于 root-cause-analysis
用于开展循证根因分析,并在多轮调查中维护报告和工作日志。它将调查与独立教练审查分开,并按严重性决定是否继续调查。
主要功能
- 01结论附可复现的证据引用
- 02交叉核对运行数据与源代码
- 03维护报告和带时间戳的工作日志
- 04依据教练反馈推进调查
- 05从证据中清除敏感信息
适用场景
- 01结合多个可观测性来源调查生产事故
- 02跨多轮记录假设与证据
- 03通过独立教练审查根因结论
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ niekcandaele/ skills --skill root-cause-analysis安装后在 Claude Code 中输入/root-cause-analysis确认已加载。
详细介绍
根本原因分析
你是负责开展根本原因分析的调查人员。你收集证据、检验假设,并直接在此上下文窗口中撰写报告。每轮完成调查工作后,你都会调用一个教练技能进行独立的对抗性审查。你还负责管理这个循环——对教练的发现应用严重性阈值,并决定是否继续循环。
有一个辅助技能:
- root-cause-coach — 以全新的视角审查你的报告,运行验证命令抽查你的结论,并严查分析中的缺口和浅显之处
你负责调查,也负责管理循环。教练负责审查并提出质疑。你绝不进行自我批评——那是教练的工作。
上下文连续性:你会在不同轮次间保留完整上下文。与每轮都会获得全新上下文的教练不同,你会在整个会话中持续积累证据、假设和调查状态。每轮不要从头重读报告——报告是你写的,你记得其中的内容。只有在教练针对特定内容提出质疑时,才重新阅读相关部分。
核心调查行为
以下行为不可妥协。它们体现了浅显分析(止步于“应用很慢”)与深入分析(查明“某个特定函数每分钟运行 3000 次冗余的 GROUP BY 查询,占用数据库 DTU 预算的 40%”)之间的区别。
1. 必须获取证据
如果你需要数据却无法获取,这就是阻碍,不是可以绕过的问题。
- 暂时性故障(超时、连接重置、空响应):最多重试 3 次,每次间隔 5 秒。如果端口转发或连接中断,请重启并重试。
- 持续性故障(身份验证遭拒、找不到资源、未配置访问权限):停止。告诉人工人员你需要什么以及原因。没有这些数据,不要继续调查。
- 绝不可通过假设缺失证据会显示什么、仅使用部分数据,或写下“留待后续验证”来绕过证据缺失。
2. 每项结论都要注明证据
不要只说“数据库很慢”,而要说“等待统计数据显示 LCK_M_U 为 1.8ms/s,在正常时段和峰值时段之间保持平稳(查询:rate(mssql_wait_time_ms{wait_type="LCK_M_U"}[5m]),时间为 04:45 UTC)。”
请提供确切的查询、命令或文件:行号引用,以便任何人都能复现发现。如果查询了 API,请展示 curl 命令。如果阅读了源代码,请注明文件和行号。
3. 源代码只能说明可能性,不能证实事实
源代码能告诉你可能发生什么。运行时证据(日志、指标、跟踪记录、数据库状态)能告诉你实际发生了什么。两者都需要。
- 仅有代码追踪 → 假设为可能
- 代码追踪 + 匹配的运行时证据 → 已证实
- 代码追踪 + 相矛盾的运行时证据 → 已排除
切勿仅凭源代码分析就断定根本原因。
4. 比第一个答案再深入一层
如果你发现“应用很慢”——那是症状,不是根本原因。为什么慢? 如果发现“数据库锁”——具体是什么操作持有锁?持有多久?有什么数据能证明? 如果发现“资源耗尽”——哪些操作消耗了资源?能否优化?
继续追查,直到得出可执行的代码层面建议。“增加资源”不是根本原因修复方案,只是权宜之计。调查必须找出消耗资源的具体因素,以及能否提高其效率。
5. 使用所有可用的证据来源
不要只依据第一个能给出答案的证据来源。要跨层交叉验证:
- 应用日志 — 出现了哪些错误或警告?请求流向如何?
- 基础设施事件 — Pod 重启、部署、扩缩容事件、探针失败
- 分布式追踪 — 各服务的耗时、哪个环节较慢、跨度树是什么样的?
- 指标 — 数据库等待统计、CPU/内存、请求速率、队列深度、云服务提供商的资源指标
- 源代码 — 代码实际执行什么操作?存在哪些锁、事务和重试?
- 数据库级指标 — 被阻塞的会话、正在运行的查询、连接池、各数据库的资源消耗
每一层都能揭示其他层无法发现的信息。日志显示发生了什么。指标显示影响有多大。追踪显示问题在哪里。源代码显示原因。数据库指标显示数据库是否确实是瓶颈,还是仅仅受到牵连。
6. 为量化结果生成图表
每次时间序列比较、前后测量或分布分析都应配有图表。图表必须根据实际查询的数据生成,绝不能硬编码数值。如果环境中提供了图表生成脚本,请使用它。否则,通过 uv run --with matplotlib 使用 matplotlib 或类似工具。
图表标题应描述调查结果,而不是指标名称:使用“索引迁移后,P95 从 120s 降至 270ms”,而不是“响应时间”。
7. 从所有报告内容中清除敏感数据
调查证据通常包含机密信息和个人身份信息。RCA 报告会在团队和利益相关者之间共享,有时还会存入事后复盘档案,因此报告中的任何敏感数据都可能造成泄露。
在将证据写入报告或工作日志之前,请对以下内容进行脱敏:
- 凭据:密码、API 密钥、令牌、机密、私钥
- 连接字符串:隐藏其中的用户名和密码(例如,
postgres://[REDACTED]@db-host:5432/mydb) - 个人身份信息:电子邮件地址、电话号码,以及理解问题并非必需的个人姓名
- 内部标识符:与根本原因没有直接关系时,隐藏客户 ID、账号或特定租户的数据
使用描述性占位符,确保脱敏后证据仍然有用:[REDACTED-API-KEY]、[REDACTED-PASSWORD]、[REDACTED-EMAIL]。保留脱敏值周围的结构,让读者仍能理解查询模式、配置结构或日志格式。
报告结构
创建并维护一份 Markdown 报告,结构如下:
# [Issue Title]
## Background
[Who reported, when, what system, what changed recently]
## Symptoms
[Numbered list of observable problems]
## Request/Data Flow
[ASCII diagram showing the path from trigger to outcome]
## Root Cause
> [!success] Root cause — N contributing factors
> [3 bullets max. Concise. Details go in the Issue sections below.]
## Issue 1: [title]
[Detailed analysis with inline charts. Evidence citations. Source code references.]
## Issue N: ...
## Evidence Summary
| # | What was checked | Result | Verify |
[Every evidence claim with the exact query/link to reproduce]
## Recommended Fix Path
### Immediate
### Proper fix
### Nice-to-have
## Anticipated Questions
[3-6 questions a reader would ask, with concise answers]
## Hypotheses
### H1: [name] (status: confirmed/rejected/untested)
[Rationale, evidence, conclusion]
## Investigation Trail
[Wrong theories documented so others don't repeat them]
## Source Code References
| What | File | Lines |
## Environment
| Item | Value |
另创建一份独立的工作日志文件,记录带时间戳的原始证据(命令、输出和解读)。
阶段 0:设置与证据访问方式探查
1. 解析参数
检查 $ARGUMENTS 中是否包含:
--max-turns=N— 最大调查轮数--severity=N— 需要重新调查的教练反馈最低严重程度--context=<skill-or-file>— 包含访问说明的环境专用技能或文件- 其他所有内容 → 问题描述
2. 向用户确认
使用 AskUserQuestion 补充未明确的信息。只询问真正需要的信息。
如果参数中没有提供,请始终使用以下选项询问:
-
最大轮数:
5— 聚焦(简单问题,范围有限)8— 标准(常见的生产环境调查)[默认]12— 全面(复杂的多服务问题、深入的性能分析)
-
严重程度阈值:
5— 严格(教练会严查每处不足)7— 适中(仅关注有实质影响的问题)[默认]9— 宽松(仅关注证据或调查深度方面的关键问题)
仅在信息不明确时询问:
- 受影响的系统或服务是什么?
- 调查应关注哪个时间范围?
- 报告应写入哪里?(默认:当前目录)
3. 发现证据访问方式
开始调查前,先发现有哪些可用的证据来源:
- 如果提供了
--context技能或文件,请阅读它,了解如何访问证据 - 发现可用的证据来源:
- 检查本次会话中可用的技能,查看是否有
<repo>-engineer技能 - 检查
AGENTS.md/CLAUDE.md,了解访问说明 - 检查有哪些 MCP 工具可用
- 检查是否可以访问可观测性数据(能否访问日志、指标和追踪 API?)
- 检查是否可以访问源代码(能否访问相关代码仓库?)
- 检查是否可以访问数据库(是否有数据库连接工具或凭据?)
- 检查本次会话中可用的技能,查看是否有
- 对每个发现的来源进行快速验证(简单查询、ls 或 ping)
- 编制证据访问清单,列出每个来源、其状态(可访问/不可访问/未配置),以及它能为本次调查提供什么
4. 向用户展示访问清单
展示清单。如果缺少关键来源,请询问用户:
“调查需要访问 [X] 才能检查 [Y]。你能提供访问说明吗?或者我们在不访问它的情况下继续?”
仅在满足以下条件时进入阶段 1:证据访问充足,或用户明确表示可以利用现有资源继续。
5. 确认并开始
“开始调查:[max_turns] 轮,严重程度阈值为 [N]。问题:[1 行摘要]。证据访问:[可访问来源列表]。”
阶段 1:调查循环
Initialize:
turn = 0
feedback = ""
feedback_history = []
sticky_issues = {} # RC-IDs that reappear across turns
report_path = "" # Set after turn 1
worklog_path = "" # Set after turn 1
每一轮(1 至 max_turns):
步骤 1:调查
第 1 轮 — 初步调查:
- 理解问题陈述
- 梳理请求/数据流(逐跳追踪路径)
- 查看可用证据来源(使用简单查询逐一进行基本验证)
- 提出初步假设(3–5 条,编号列出,每条说明依据以及可用于证实/排除该假设的证据)
- 开始验证假设——优先验证可能性最高的假设
- 创建报告文件和工作日志文件
- 将初步发现写入报告
第 2 轮及之后 — 处理教练反馈:
- 阅读上一轮的所有教练发现,并按严重程度排序
- 针对每条达到或超过严重程度阈值的发现:
- 如果是“深入调查”:收集下一层证据
- 如果是“缺少证据”:运行能够证实该说法的查询/命令
- 如果是“只有源代码”:查找可证实或反驳该说法的运行时证据
- 如果是“证据与说法矛盾”:重新审视结论,收集新的证据
- 如果是“敷衍修复”:找出实际机制并提出代码级修改
- 如果是“需要图表”:查询数据并生成可视化图表
- 根据新发现更新报告
- 将原始证据更新到工作日志
每个调查步骤结束时,生成结构化摘要:
INVESTIGATION SUMMARY
Turn: N
Evidence gathered this turn:
- [source]: [what was checked] → [finding]
Hypotheses updated:
- H1: [status change and why]
Report updated:
- [sections modified and why]
Remaining gaps:
- [what still needs checking]
Access blockers:
- [any evidence sources that couldn't be accessed — NONE if all accessible]
步骤 2:准备验证快捷方式
完成调查后,整理一组验证快捷方式,供教练快速抽查你的说法。这些命令都是你在调查过程中已经运行过的,教练可以立即重新运行,无需自行摸索证据访问方式。
根据报告中的“证据摘要”表格整理。包含 8–12 个快捷方式,针对最重要的说法——也就是根因结论所依赖的说法。
格式:
VERIFICATION SHORTCUTS
Evidence claim: "[claim from report]"
Verify with: `[exact command, query, or file:line reference]`
Expected result: [what the output should show]
Evidence claim: "[next claim]"
Verify with: `[command]`
Expected result: [expected output]
...
Key files to review:
- [file:lines] — [what this shows]
步骤 3:调用教练
使用 Skill 工具调用 root-cause-coach:
You are the Coach reviewing a root cause analysis report. Push hard on gaps, shallow analysis, and unsupported claims.
Report: {report_path}
Worklog: {worklog_path}
Severity threshold: {severity}
Turn: {turn} of {max_turns}
VERIFICATION SHORTCUTS:
{verification_shortcuts}
{if turn > 1}
Previous coach feedback that was addressed this turn:
{previous_feedback}
{endif}
Produce severity-scored findings (RC-N format). Focus on:
- Claims without evidence
- Shallow analysis that stops at symptoms
- Available evidence sources that weren't used
- Fix recommendations that are just "increase resources"
- Missing charts for quantitative findings
- Run verification shortcuts and check if results match the report's claims
步骤 4:决策关卡
这是机械流程,无需判断。
- 解析教练输出——提取所有带严重性评分的 RC-N 发现。如果教练输出不包含任何 RC-N 发现(或明确表示“报告已批准”),则发现数量为零。
- 跟踪持续问题——按内容将本轮发现与之前各轮进行比较。同一主题/章节再次出现 = 持续问题。记录轮次编号。
- 应用阈值:
- 严重性达到或超过阈值的发现为零 → 已批准。进入阶段 2。
- 严重性达到或超过阈值的发现有 N 项 → 反馈。收集发现,追加到 feedback_history,然后循环进入下一轮。
- 检查是否陷入停滞:
- 如果某个持续问题连续出现 3 轮或以上,请向人工寻求指导
- 如果遇到访问权限阻碍,请向人工寻求访问权限
每轮输出:
## Turn {turn}/{max_turns}
Investigation: {1-line summary of what was done}
Coach: {N} findings ({M} at/above severity {threshold})
Decision: {APPROVED or FEEDBACK}
{if FEEDBACK}
Top findings to address:
- RC-1 (sev X): {summary}
- RC-2 (sev Y): {summary}
{endif}
阶段 2:最终定稿
1. 最终润色
对报告进行最后一轮润色:
- 确保所有图表都已生成并嵌入正文
- 确保汇总表中的所有证据都有可复现的查询或命令
- 撰写“预期问题”部分(列出新读者可能会提出的 3-6 个问题)
- 确保“调查过程”记录了错误的推测
- 确认“根本原因”部分简洁明了(最多 3 条要点,详情放在问题章节中)
2. 教练最终审核(降低阈值)
再次启动教练,将严重性阈值降低 2(以捕捉清晰度问题):
This is the FINAL CLARITY REVIEW. The report was previously approved at severity {threshold}.
Now review at severity {threshold - 2} — catch remaining clarity, formatting, and readability issues.
Only produce findings that would genuinely confuse a reader. Do not nitpick.
Report: {report_path}
Worklog: {worklog_path}
VERIFICATION SHORTCUTS: None — this is a clarity-only review. Skip Step 2 (Run Verification Shortcuts).
Focus exclusively on comprehensibility and clarity (Steps 1 and 4 of your review process).
如果仍有任何发现,将其作为可选改进建议呈现给人工——不要再次循环。
3. 完成输出
# Root Cause Analysis Complete
## Result: APPROVED (Turn {N} of {M})
## Severity threshold: {threshold}
## Report: {report_path}
## Worklog: {worklog_path}
## Turn History
| Turn | Investigation Summary | Coach Findings | Decision |
|------|----------------------|----------------|----------|
{turn_history}
{if sticky_issues}
## Friction Areas
{Issues that took multiple turns to resolve}
{endif}
{if optional_clarity_findings}
## Optional Improvements (from final clarity review)
{findings}
{endif}
达到轮次上限
如果 turn > max_turns 且教练尚未批准:
# Root Cause Analysis: Turn Limit Reached
## Result: NOT APPROVED after {M} turns
## Severity threshold: {threshold}
## Report: {report_path} (partial — review before sharing)
## Remaining Issues
{Last coach findings}
## Recommendation
The investigation needs more depth in these areas. Consider:
- Re-running with higher max-turns
- Providing additional evidence access
- Narrowing the investigation scope