
写代码的人都知道,最难的不是写新功能,是修那些藏得极深的 Bug。尤其是那种时好时坏、无法稳定复现的“幽灵 Bug”——你盯着屏幕看了半天,改了几处代码,问题还在;又改了几处,问题好像没了,但过两天又冒出来了。
Matt Pocock 开发的 diagnosing-bugs 技能,正是为了解决这类问题而生的。它不是传统意义上的 IDE 插件,而是一个可以加载到 Claude Code、Cursor、Windsurf 等 AI 编程助手里的工作流技能。截至目前,它在 GitHub 上已经获得了超过 18 万 Star。
这篇文章会把 diagnosing-bugs 是什么、怎么装、怎么用,以及它到底能解决什么问题,一次性讲清楚。
一、Diagnosing-Bugs 是什么
diagnosing-bugs 是一套结构化的调试流程规范。它把调试硬 Bug 和性能回归的过程拆解成六个强制阶段,AI 助手在它的引导下,会按顺序执行:构建反馈环、复现并最小化、提出假设、添加日志定位、修复并添加回归测试、清理与复盘。
这个技能的核心原则只有一句话:在没有一个能稳定复现 Bug 的命令之前,不要开始猜原因。
很多开发者(包括 AI 助手)看到报错后的第一反应是“这段代码可能有问题”,然后直接动手改。但 diagnosing-bugs 会强制你停下来,先做一个能准确捕获当前 Bug 的反馈环——可以是一条失败的测试、一段 curl 命令、一个 Playwright 脚本,或者任何能让 Bug 稳定“现形”的东西。
反馈环是 diagnosing-bugs 里最核心的概念——一个能稳定复现 Bug、输出明确“红/绿”信号的命令或脚本。有了它,后面的二分查找、假设验证、添加日志都只是机械操作;没有它,盯着代码看再多也没用。
这个技能的独特之处在于:它拒绝在反馈环建立之前做任何假设。用作者 Matt Pocock 的原话说:“If you catch yourself reading code to build a theory before this command exists, stop — jumping straight to a hypothesis is the exact failure this skill prevents.”
二、主要功能
2.1 六阶段调试流程
diagnosing-bugs 把调试过程划分为六个清晰的阶段,每个阶段都有明确的目标和产出:
Phase 1 — 构建反馈环(Build a feedback loop)
这是整个技能的重中之重。你需要创建一个能稳定复现 Bug 的“红/绿”信号——一个命令或脚本,运行后能明确告诉你 Bug 是否还存在。构建方式有很多种,按推荐顺序包括:
编写一个会失败的测试(单元测试、集成测试或端到端测试)
写一段 curl/HTTP 脚本,对运行中的开发服务器发起请求
使用 CLI 命令配合固定输入,对比输出与已知正确的快照
用 Playwright 或 Puppeteer 编写无头浏览器脚本
回放捕获的流量或事件日志
反馈环建立之后还要持续优化:能不能让它跑得更快?能不能让信号更精确?能不能让它更稳定(固定时间、固定随机数种子、隔离文件系统)?作者的说法很直接:“一个 30 秒且不稳定的反馈环,和没有差不多;一个 2 秒且确定性的反馈环,就是调试的超能力。”
Phase 2 — 复现并最小化(Reproduce + minimise)
有了反馈环之后,反复运行它,观察失败模式。然后逐步缩小范围——减少无关的初始化步骤、缩小测试范围、去掉不必要的依赖。目标是把复现 Bug 所需的条件压缩到最小。
Phase 3 — 提出假设(Hypothesise)
基于已有的观察,列出所有可能的根因假设,并按可能性排序。这些假设必须是可证伪的——也就是说,你能通过修改代码或添加日志来验证或推翻它们。
Phase 4 — 添加日志定位(Instrument)
在关键路径上添加调试日志(统一标记为 [DEBUG-...]),运行反馈环,观察日志输出,验证或排除假设。
Phase 5 — 修复并添加回归测试(Fix + regression test)
确认根因后实施修复,然后把反馈环转换成回归测试,确保同一个 Bug 不会再回来。
Phase 6 — 清理与复盘(Cleanup + post-mortem)
移除调试日志,提交代码。如果发现根本问题是代码架构缺少合适的“接缝”来锁定 Bug,可以将发现反馈给架构改进流程。
2.2 适用场景
用户说“diagnose”或“debug this”
用户报告功能损坏、程序报错、运行失败或性能缓慢
它特别适合那些“看一眼猜不出原因”的硬 Bug:间歇性出现的 flaky test、在两个已知正常状态之间悄悄引入的性能回归。
三、如何安装
diagnosing-bugs 是一个 Agent Skill,可以安装到多种 AI 编程助手中,包括 Claude Code、Cursor、Windsurf、GitHub Copilot、Cline 等。
3.1 最简安装方式
npx skills add https://github.com/mattpocock/skills --skill diagnosing-bugs
这条命令需要 npx(随 Node.js 一起安装)。运行后,技能会被安装到当前项目的对应目录中。
3.2 为特定 Agent 安装
如果你想安装到 Claude Code:
npx -y skills add mattpocock/skills --skill diagnosing-bugs --agent claude-code
这会把技能安装到当前项目的 .claude/skills 目录下。
3.3 全局安装
使用 SkillsAuth 可以全局安装:
npx skillsauth add mattpocock/skills diagnosing-bugs全局安装后,所有项目都可以使用这个技能。
3.4 通过 Claude Code 对话安装
如果你已经在使用 Claude Code,可以直接在对话中说:
“装一下 diagnosing-bugs 这个技能”
Claude Code 会自动获取并安装,不用离开聊天界面。
3.5 手动安装
你也可以手动从 GitHub 克隆仓库,然后把 SKILL.md 文件复制到项目目录中:
git clone https://github.com/mattpocock/skills.git3.6 验证安装
安装完成后,在 AI 助手中输入 /diagnosing-bugs,如果能正常唤起技能说明安装成功。
四、应用场景
4.1 间歇性出现的 Flaky Test
这是 diagnosing-bugs 最擅长的场景之一。一个测试有时候过、有时候挂,你跑十次能绿六次。传统的做法是“再跑一次试试”,但 diagnosing-bugs 的做法完全不同——它不会去猜原因,而是先构建一个能提高复现率的反馈环。比如把测试循环跑 100 次、增加并发压力、缩小时间窗口,直到 flaky 变得可调试。
4.2 线上性能回归
某个接口的响应时间从 200ms 涨到了 800ms,但代码最近没什么大改动。 diagnosing-bugs 会引导你构建一个差分反馈环——用相同的输入分别跑旧版本和新版本,对比输出和性能数据,精准定位是哪个 commit 引入了回归。
4.3 复杂业务逻辑 Bug
用户报告了一个“偶尔出现”的数据错误,但开发环境无法复现。 diagnosing-bugs 会建议你保存真实的网络请求或事件日志到本地,然后在隔离环境中回放。把“线上偶尔发生”变成“本地稳定复现”,问题就解决了一大半。
4.4 AI 辅助编程中的调试
这是 diagnosing-bugs 最实际的应用场景。很多开发者用 AI 写代码时遇到的问题是:AI 看到报错就开始“猜”原因、改代码,越改越乱。装上 diagnosing-bugs 之后,AI 会被强制先建立反馈环再动手,调试效率明显提升。
五、使用案例
案例一:修复一个偶发的空指针异常
背景:一个电商项目的订单处理服务偶尔抛出 NullPointerException,但日志里看不出规律,大约每 50 笔订单出现一次。
使用 diagnosing-bugs 的过程:
复现并最小化:运行后发现异常集中在“使用优惠券且订单金额小于 10 元”的场景。把测试数据缩小到这个范围,复现率从 2% 提升到了 80%。
提出假设:列出三个可能的原因——优惠券折扣计算返回了 null、金额校验逻辑有边界问题、数据库查询返回了空值。
添加日志定位:在三个关键位置加了
[DEBUG-...]日志。运行反馈环,发现是优惠券折扣计算在特定条件下返回了 null。修复并添加回归测试:修复了折扣计算的边界条件,把反馈环脚本转换成了单元测试。
清理与复盘:移除调试日志,提交代码。整个调试过程用了大约 20 分钟,如果靠“看代码猜原因”可能得花一两个小时。
案例二:定位一个前端性能回归
背景:一个 React 应用的首屏加载时间从 1.2 秒涨到了 2.8 秒,但最近两周的代码提交有 40 多个,不知道是哪个引起的。
使用 diagnosing-bugs 的过程:
定位根因:
git bisect定位到了某个合并请求——里面引入了一个大型第三方库的同步加载。修复:把同步加载改为动态 import,首屏时间回到了 1.3 秒。
添加回归测试:把 Playwright 脚本保留为性能回归测试,确保以后不会再变慢。
这个案例的关键在于: diagnosing-bugs 的反馈环可以和 git bisect 无缝配合,实现自动化定位。
六、常见问题
Q:diagnosing-bugs 是免费的还是付费的?
A:技能本身是开源的(MIT 协议),免费使用。但运行它需要 AI 编程助手,部分助手有使用费用。
Q:必须按六个阶段严格执行吗?
A:技能文档里写了“Skip phases only when explicitly justified”——只有在明确说明理由的情况下才能跳过某个阶段。这不是死板,而是因为跳过阶段往往会回到“猜 Bug”的老路上。
Q:和 TDD 技能有什么区别?
A:TDD(测试驱动开发)是在写代码之前先写测试,确保代码有反馈信号。diagnosing-bugs 是在 Bug 已经存在之后,用类似的思路去定位和修复它。两者可以搭配使用。
Q:支持哪些编程语言?
A: diagnosing-bugs 不限制编程语言。它是一套调试方法论,可以用在任何语言、任何框架的项目中。
Q:安装后怎么用?


◯ 评论 0