🤖 Agentic 全难度 📦 Obra

systematic-debugging

systematic-debugging Skill 深度评测:根因优先的调试方法论

9.2 /10 ★★★★★
📅 2026-06-15 · 🕒 4 分钟阅读 · 最后更新 2026-06-15 · 来源: Obra · 分析测评
#debugging#root-cause#tdd#superpowers#5-whys
📄 相关文章

📊 评分明细

功能完备度
9.2 核心功能齐全
🎯 易用性
8.9 安装即用
🔧 可扩展性
9 声明式配置
🔗 生态协同
9.1 可链式调用
🛡️ 稳定性
9.5 内置验证流程

🎯 适用场景

debuggingroot-causetddsuperpowers5-whys

systematic-debugging 快速入门

superpowers 套件里的”调试方法论” Skill,逼着 AI 在改任何代码前先证明自己找到了根因。

这是什么?解决什么问题?

systematic-debugging 是 obra/superpowers 仓库里的核心子 Skill,专注”根因优先”的调试流程。它把业界经典的 5 Whys(五个为什么)、复现-定位-简化-修复-验证(Replicate-Localize-Simplify-Fix-Verify)、FMEA 失效分析等方法论打包成可被 AI 严格执行的协议。

对小白来说,这个 Skill 解决的是”我反复改代码但 bug 不消失”的问题。普通 AI 调试时倾向于”先试一个方案,不行就换下一个”,这是低效的”瞎试循环”;装了 systematic-debugging,AI 会先要求你提供最小复现(MRE),再用二分法定位,修复后必须跑回归测试,且要求解释”为什么这个修复一定解决根因”。它把”经验式调试”升级成”工程化调试”。

准备工作

  • 支持 Agent:Claude Code(主推)、支持 Skills 协议的 Agent。
  • 运行环境:Claude Code 0.2+;调试语言对应的工具链(Chrome DevTools、gdb、pdb、lldb 等)。
  • 目标项目:任意有 bug 的代码仓库,Python/Node/Go/Rust 都行。
  • 配套 Skills:建议同时启用 using-superpowers 元 Skill,让协议自动调度。

3 步快速上手

第 1 步:确认 Skill 已安装

ls ~/.claude/skills/superpowers/skills/systematic-debugging/
# 应看到 SKILL.md

如果用的是 addyosmani/agent-skills 仓库,这个 Skill 也叫 systematic-debugging,功能类似。

第 2 步:提供最小复现

在 Claude Code 中:

有个 bug:用户上传大于 10MB 的图片,后端返回 500。完整日志在 bug-report.log,最小复现脚本是 repro.py。请用 systematic-debugging Skill 排查。

第 3 步:跟着 AI 的 5 Whys 走

AI 会拒绝直接改代码,而是先问:

  1. 这个 bug 是否能在本地 100% 复现?
  2. 错误堆栈指向哪一行?
  3. 这个错误是因还是果?
  4. 同样的代码路径在哪些输入下不报错?
  5. 改动一行代码是否会让回归测试全部通过?

回答完 5 个问题,AI 才会给出修复方案。

常见踩坑

  1. 跳过复现直接修:很多人嫌麻烦,直接贴代码让 AI 改。Skill 会拒绝,要先有 MRE。
  2. 混淆症状与根因:“500 报错”是症状,根因可能是”未捕获 Promise rejection”。Skill 强制你把症状-根因链画清楚。
  3. 修复后没跑回归测试:Skill 要求修复后必须跑全部测试通过,不能只跑相关那一个。
  4. 不写回归测试:Skill 强调”bug 修复必带回归测试”,防止下次回归。
  5. 在生产环境直接试错:Skill 会强烈反对”先在 prod 改一下试试看”的做法,要求本地必须先重现。
  6. 拒绝承认”我不确定”:Skill 要求 AI 表达确定性程度,如果证据不足必须说”unknown”,不能瞎给方案。

初级用法

  • 接 bug 即开 Skill:任何”我有个 bug”开头的对话,都默认挂 systematic-debugging。
  • PR 携带调试报告:把 Skill 给出的 5 Whys 分析作为 PR 描述的一部分。
  • 结对调试:人和 AI 一起用 Skill 排查,作为团队调试规范。

高级玩法

  • 结合静态分析:Skill 定位根因后,接入 trailofbits 的 static-analysis 做二次确认。
  • 可观测性整合:把 APM 工具(Datadog/Sentry)链接喂给 AI,让它直接看 trace。
  • 事后复盘模板:用 Skill 的输出作为 incident postmortem 的根因分析章节。

小技巧

  • 提供 bug 时尽量附”我已尝试的方案”清单,避免 AI 重复劳动。
  • 用 Skill 评审代码,有时它能从”已知的崩溃点”反推潜在 bug。
  • 配合 git bisect 一起用,二分定位特别快。
  • 不要让 AI 改 5 处以上地方再观察结果,这违反 Skill 的”单变量修改”原则。
  • 把 Skill 输出的 5 Whys 存到 docs/postmortems/,团队知识沉淀。

常见问题 FAQ

Q1: 这个 Skill 跟 systematic-debugging 有什么关系?必须装吗?

A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。

Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?

A: systematic-debugging 来自 Obra,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。

Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?

A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。

Q4: 怎么验证 Skill 装对了?

A: 在 Agent 中输入”列出已加载的 Skill”或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。

Q5: 这个 Skill 有许可证吗?能商用吗?

A: 取决于 systematic-debugging 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。

参考链接

系统化调试的方法论根源

systematic-debugging 的方法论根基可以追溯到软件工程早期的几个经典思想:5 Whys(丰田生产方式)要求追根问底直到找到根本原因;FMEA(Failure Mode and Effects Analysis)是制造业的质量分析工具;Scientific Method(科学方法)强调”先假设后验证”;Occam’s Razor(奥卡姆剃刀)提醒不要把问题想复杂。

Skill 把这些思想打包成 AI 可执行的协议,让模型在面对 bug 时不再”瞎试”,而是有方法地排查。这种”工程化调试”思路比”经验式调试”高效得多,特别是面对陌生代码库或复杂分布式系统。

进一步阅读

  • 《The Pragmatic Programmer》中关于调试的章节,讲”rubber ducking”和”bisection”技巧。
  • 《Debugging: The 9 Indispensable Rules for Finding Even the Most Elusive Software Problems》是一本专门讲调试的经典书籍。
  • SRE 手册(https://sre.google/sre-book/) 里有大量 incident response 与 postmortem 实战经验。
  • Kent Beck 的 TDD 思想间接支持 systematic-debugging:有测试覆盖才能复现 bug,有复现才能定位。
  • Hacker News 上关于”最难调试 bug”的讨论帖有大量实战经验分享。

实战建议

  1. 接 bug 即开 Skill:任何”我有个 bug”开头的对话,都默认挂 systematic-debugging。
  2. PR 携带调试报告:把 Skill 给出的 5 Whys 分析作为 PR 描述的一部分,让 reviewer 理解根因。
  3. 结对调试:人和 AI 一起用 Skill 排查,作为团队调试规范,新人快速上手。
  4. 结合静态分析:Skill 定位根因后,接入 trailofbits 的 static-analysis 做二次确认。
  5. 可观测性整合:把 APM 工具(Datadog、Sentry、Honeycomb)链接喂给 AI,让它直接看 trace、metrics、logs。
  6. 事后复盘模板:用 Skill 的输出作为 incident postmortem 的根因分析章节,沉淀团队知识。

本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。

systematic-debugging Skill 多维度简评

综合评分:9.2 / 10 ⭐⭐⭐⭐⭐ 类别:调试 / 根因分析 仓库:obra/superpowers 维护者:Jesse Vincent / Prime Radiant


一、核心定位与价值

systematic-debugging 是 Superpowers 14 个 Skills 中最反直觉、收益最高的。它解决一个根本问题:AI 写代码 80% 的”修复”是瞎猜——看到错误就开始改,改了 3 个地方都没用,然后放弃。

核心原则:“NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST”(没有根因调查,不修复) 一次只做一个改动(ONE CHANGE) 先建失败测试再修复(Failing Test First)

关键洞见:首次修复成功率从 40% 提升到 95%,调试时间从 2-3 小时缩短到 15-30 分钟。

适用场景

  • 任何 bug / 测试失败 / 意外行为
  • 性能突然下降
  • 间歇性问题(flaky test)
  • 集成后系统不稳定
  • 生产事故

不适用场景

  • 已知原因的简单错误(拼写错误、配置错误)
  • 用户体验问题(非 bug)
  • 性能调优(用 profiling 工具)

二、4 阶段流程

2.1 Phase 1:症状分析(Symptom Analysis)

目标:收集所有相关信息

[1] 错误的完整信息
  - 错误信息(含 stack trace)
  - 错误码
  - 出现的时间 / 频率
  - 触发条件(用户操作 / 时间 / 数据)

[2] 环境信息
  - OS / 浏览器 / 版本
  - 依赖版本
  - 环境变量
  - 网络状态

[3] 复现步骤
  - 最小复现路径
  - 复现率(必现 / 偶现)

[4] 影响范围
  - 受影响用户 / 功能
  - 是否数据丢失
  - 是否可降级

示例

## Bug 报告:登录后页面空白

### 错误信息
TypeError: Cannot read property 'user' of undefined
  at Dashboard.render (Dashboard.tsx:42:18)
  at Dashboard.componentDidMount

### 复现步骤
1. 打开 https://app.example.com
2. 输入 user@example.com / password
3. 点击"登录"
4. 跳转到 /dashboard → 白屏

### 复现率
100%(必现)

### 环境
Chrome 120 / Windows 11
React 18.2 / Next.js 14.0

### 影响
所有新登录用户都受影响

2.2 Phase 2:生成假设(Hypothesis Generation)

目标:列出所有可能的根本原因

假设 1(H1):登录 API 返回的 user 字段是 null
假设 2(H2):前端没正确解析 JWT
假设 3(H3):后端 session 没设置
假设 4(H4):路由守卫提前跳转
假设 5(H5):CORS 阻止了 cookie 设置
假设 6(H6):localStorage 被清空

技巧

  • 不要只列 1-2 个假设,至少 5 个
  • 从最可能到最不可能排序
  • 包含”显眼的”和”深藏的”

2.3 Phase 3:验证假设(Hypothesis Verification)

对每个假设,设计实验逐个排除

### H1: 登录 API 返回的 user 字段是 null
- 实验:在 Network 标签查看 /api/login 响应
- 期望:响应是 {"user": {...}, "token": "..."}
- 实际:响应是 {"user": null, "token": "..."}
- 结论:✅ H1 确认

### 进一步追问:为什么 user 是 null?
- 检查后端日志:TypeError in user service line 42
- 原因:数据库查询没找到该邮箱的用户
- 但前端发送的是合法邮箱...

### H2: 前端发送的请求被修改
- 实验:查看前端发送的 body
- 期望:{"email": "user@example.com", "password": "..."}
- 实际:{"email": "USER@EXAMPLE.COM", "password": "..."}
- 结论:❌ H2 错误,邮箱是合法的(小写化处理)

### 回到 H1:为什么数据库查不到 USER@EXAMPLE.COM?
- 检查数据库:所有用户都是小写存储
- 但查询条件是大写 "USER@EXAMPLE.COM" 不匹配
- 根因:用户输入 "user@example.com"(小写),但前端某个库自动转大写

2.4 Phase 4:实施修复(Fix)

前提:根因已明确

  • ✅ 创建一个失败的测试用例
  • ✅ 写最小化代码让测试通过
  • ✅ 运行完整测试套件
  • ✅ 检查是否引入新 bug

一次只改 ONE THING——不要”顺便改进”其他东西。

// 修复:在 API 调用前归一化邮箱
const normalizedEmail = email.toLowerCase().trim()
const response = await api.login(normalizedEmail, password)

三、真实案例研究

案例 1:登录白屏(前面示例完整版)

症状:登录后 dashboard 空白 表面原因:Dashboard 拿不到 user 真正根因:邮箱未归一化(大写查询不匹配数据库) 修复:1 行代码 email.toLowerCase().trim()

如果没 systematic-debugging:

  • 试 1:把 null 改成 {} → 失败
  • 试 2:加 loading 状态 → 失败
  • 试 3:换 JWT 库 → 失败
  • 试 4:重启服务 → 失败
  • 浪费:3 小时

案例 2:偶发 504 Gateway Timeout

症状:生产环境每 1000 次请求有 1 次 504 传统做法

  • 调高 timeout(治标)
  • 重启服务(治标)
  • 增加实例(浪费钱)

systematic-debugging

  • Phase 1: 504 出现前 1 秒,请求里有什么?→ 大文件上传
  • Phase 2: 假设 H1: 上传超时 / H2: 数据库慢 / H3: 网络
  • Phase 3: 跑慢查询日志 → 没慢查询
    • 看 nginx access log → 上传文件 1.5GB
    • 默认 body size 限制 1MB → 触发了
  • Phase 4: 加 client_max_body_size 10m

根因:客户端上传文件超过 nginx 默认限制 修复:1 行 nginx 配置

案例 3:Flaky Test 间歇失败

症状:CI 上 100 次跑有 5 次失败 传统做法

  • 加 retry(治标)
  • 忽略这个测试(逃避)
  • 重跑(浪费时间)

systematic-debugging

  • Phase 1: 失败时间戳:3:42 AM, 7:15 AM, 11:30 AM, 4:00 PM
  • Phase 2: 假设:时间相关?并发相关?资源相关?
  • Phase 3: 失败时 5 分钟前都有 deploy / 大流量 / 内存 spike
    • 看 test output → 失败前都有 “GC pause 2.3s”
    • 是 GC 引起
  • Phase 4: 给测试加 warmup + timeout 30s

根因:JVM 偶发 GC 暂停 修复:测试 JVM 参数 + 业务无关测试用 mock

案例 4:上线后 P99 延迟 10 倍

症状:v2 上线后 P99 从 100ms 升到 1s 传统做法

  • 回滚(逃避)
  • 扩容(浪费钱)

systematic-debugging

  • Phase 1: 看监控,CPU 100%,DB 慢查询多
  • Phase 2: 假设:H1 新 SQL / H2 缺少索引 / H3 同步阻塞
  • Phase 3: 慢查询日志发现 N+1 查询
    • v2 加了新功能,每次 fetch user 单独查 posts
    • 没加 JOIN
  • Phase 4: 用 Prisma include 一次性查

根因:N+1 查询 修复:一行 Prisma include


四、与其他 Skill 配合

Skill配合方式
test-driven-development根因明确后,先写失败测试
verification-before-completion修复后必须验证
using-git-worktrees调试时在独立 worktree 改
requesting-code-review修复后请团队审查
finishing-a-development-branch合并 / 保留 / 丢弃

完整工作流

[1] Bug 出现
   ↓
[2] systematic-debugging (4 阶段)
   ↓
[3] test-driven-development (RED → GREEN → REFACTOR)
   ↓
[4] verification-before-completion (跑测试)
   ↓
[5] requesting-code-review (重要 bug)
   ↓
[6] finishing-a-development-branch (合并)

五、5 大反模式(禁止)

5.1 边试边修(Shotgun Debugging)

表现:随便改 5 个地方看哪个有效。 禁止:浪费时间,可能掩盖真正问题。 正确做法:先 systematic-debugging。

5.2 表面修复(Surface Fix)

表现:症状消失就宣称修复。 禁止:根因没解决,下周又出现。 正确做法:追到根本原因。

5.3 顺带改进(Drive-by Improvement)

表现:修 bug 时顺便重命名变量、加日志、换库。 禁止:让 PR 难 review。 正确做法ONE CHANGE 一个 PR 一个事。

5.4 改测试匹配代码(Move the Goalposts)

表现:测试失败就改测试。 禁止:测试是真理,改测试 = 撒谎。 正确做法:改代码让测试通过。

5.5 跳过根因直接修

表现:“看着像是 X 问题,先试一下”。 禁止:高概率失败,浪费时间。 正确做法:至少 5 Whys 一次。


六、5 Whys 分析法

经典工具——丰田生产方式。

问题:网站首页打不开
Why 1:服务器没响应
Why 2:CPU 100%
Why 3:某个查询占满 CPU
Why 4:这个查询是全表扫描
Why 5:表里数据是 1 亿行,没有索引

根因:缺索引 修复CREATE INDEX idx ON t (col)(30 秒) 预防:所有大表加索引审计流程


七、压力测试中的根因分析

7.1 内存泄漏

[症状] 跑 24h 后 OOM
[根因定位]
1. 监控 → heap 持续上升
2. heap dump → 发现 Cache 对象占 80%
3. 代码 search → Cache.put 后没 remove
[修复] 加 TTL + 定期清理

7.2 CPU 100%

[症状] 凌晨 3 点告警
[根因定位]
1. pprof → 99% 在某个函数
2. 函数内容:sync.Map.Range 内有 time.Sleep
3. 死循环 + Map 不断增长
[修复] 改用 channel-based queue

7.3 数据库连接池耗尽

[症状] 应用报 "connection timeout"
[根因定位]
1. db stats → 100 连接全在用
2. db.query log → 一个长查询占 80 连接
3. EXPLAIN → 这个查询扫了 1 亿行
[修复] 加索引 + 改 LIMIT 分批

八、Q&A

Q: 跟传统 debugger 区别? A: 传统 debugger 看执行流;systematic-debugging 看因果链

Q: 浪费时间吗? A: 首次修复时间 +15 分钟,但总调试时间 -83%。

Q: 适用所有 bug 吗? A: 适用 ≥ 90%。简单 typo 不用。

Q: 团队怎么学? A: 一次 retrospective 分享一个案例。

Q: 中文支持? A: 完全支持。Skill 逻辑与语言无关。

Q: 跟 pair programming 关系? A: 是 pair debugging 的方法论基础。

Q: 跟生产事故复盘关系? A: 完美对齐。复盘就是 systematic-debugging + 5 Whys + action items。


九、Prompt 模板

模板 1:完整 bug 报告

[触发条件] 何时触发这个 bug
[复现步骤]
1. ...
2. ...
[错误信息] 完整 stack trace
[期望行为] 应该是什么
[实际行为] 实际是什么
[环境] 浏览器 / OS / 版本
[已尝试] 我自己试过什么
[业务影响] 多少用户 / 多少损失

模板 2:要求 systematic-debugging

用 systematic-debugging 流程排查这个 bug:
1. 先 Phase 1 收集所有症状
2. Phase 2 列出 5+ 个假设
3. Phase 3 设计实验逐个验证
4. Phase 4 找到根本原因再修复
5. 先写失败测试再改代码
6. 一次只改 ONE CHANGE

模板 3:生产事故复盘

用 systematic-debugging + 5 Whys 复盘这次生产事故:
- 时间 / 影响 / 根因
- 我们做对了什么
- 我们可以改进什么
- Action items(每条有 owner + 截止日期)

十、真实踩坑案例

案例 1:看着像是数据库问题其实是前端问题

症状:报表加载慢,怀疑 SQL。 根因:前端 N 次 API 调用,每次 50ms。 修复:批量 API。 教训:先 systematic-debugging,别凭直觉。

案例 2:fix 了一个 bug 引入 3 个新 bug

症状:登录 bug 修好,但其他功能挂了。 根因:改了公共函数,没跑全测试。 修复:每个 PR 跑全量测试。 教训ONE CHANGE 原则。

案例 3:以为缓存问题,其实是配置问题

症状:缓存命中率 0%。 根因:Redis 连接串配错,连到测试环境。 修复:修正 .env。 教训:Hypothesis Verification 看真实数据。

案例 4:用户没复现就宣称”应该好了”

症状:bug 报告说支付失败,工程师改了 1 小时说”应该好了”。 根因:没跑测试,没让用户复现。 修复:verification-before-completion 强制验证。 教训:evidence before assertions。

案例 5:5 小时内改 50 个地方

症状:性能差。 根因:工程师东改一处西改一处。 修复:rollback + 重新 systematic-debugging。 教训ONE CHANGE + 测量 + 验证。

案例 6:测试改了让代码”过”

症状:CI 绿了但用户报 bug。 根因:改了测试的 assertion 让 assert 永远 true。 修复:恢复 assertion,修复代码。 教训:测试是真理,绝不改测试匹配坏代码。

案例 7:fix 在错的环境

症状:本地好,生产坏。 根因:本地用 SQLite,生产用 Postgres,SQL 不兼容。 修复:用 Knex / Prisma 跨数据库 ORM。 教训:先验证生产环境配置。

案例 8:监控没开,看不到根因

症状:用户报慢,但监控没数据。 根因:生产没开 tracing。 修复:接 OpenTelemetry。 教训:systematic-debugging 第 1 步是数据,没有数据寸步难行。


十一、安装

# Claude Code
/plugin marketplace add obra/superpowers
/plugin install superpowers@claude-plugins-official

# 通用
npx skills add obra/superpowers --skill systematic-debugging

# Codex / Cursor / Copilot CLI 也支持

十二、总结

核心价值

  • 4 阶段结构化调试流程
  • 5 Whys 根因分析
  • “NO FIXES WITHOUT ROOT CAUSE” 铁律
  • ONE CHANGE 原则
  • 失败测试先于修复

适用人群

  • 所有写代码的工程师
  • SRE / DevOps(生产事故)
  • QA 工程师
  • Tech Lead(带团队调试)

投入产出比:⭐⭐⭐⭐⭐(5/5)—— 所有项目必装。

何时不要用

  • 已知 typo
  • 简单配置错误(“忘了保存”)
  • 用户体验问题(不是 bug)

配套文档:using-superpowers 元技能 | TDD | verification-before-completion


参考资料

  1. obra/superpowers GitHub 仓库
  2. Toyota 5 Whys 分析法官方指南
  3. Google SRE Book — 事故复盘方法论
  4. CSDN: Superpowers Skills 完整探索