Claude 写代码,测试报错,然后把错误扔回给你处理。
而一个自修复 Agent 不会这样:它会读取自己的失败,修补原因,然后重新运行直到通过。
只需设置一次,你就再也不用当自己 Agent 的免费调试员了。
以下是完整的设置步骤 👇
在深入之前,我每天会在我的 Telegram 频道分享关于 AI 和 Vibe Coding 的日常笔记: https://t.me/zodchixquant🧠

为什么一次不够
默认情况下,Claude 只运行一次任务。测试失败,它报告错误并等待。你阅读错误,把它粘贴回去,告诉它再试一次。你正在做调试工作,它只是在打字。
而自修复 Agent 则翻转了这种模式。它会读取自己的失败,弄清楚是哪类错误,修复原因,然后重新运行,就像调试器思考的方式一样。你只在它通过测试或真正卡住时才介入。
文件 1:修复命令
这是你实际运行的循环。将其放入 .claude/commands/fix.md 中:
1---2description: 运行一个任务并自修复,直到所有测试通过3argument-hint: <task>4allowed-tools: Read, Write, Edit, Glob, Grep, Bash5model: sonnet6---78任务:$ARGUMENTS910循环:111. 实现任务。122. 运行测试套件:`npm test`(或 pytest、cargo test)。133. 如果所有测试通过:停止并向显示结果。144. 如果测试失败:对错误类型进行分类,指明根本原因,15 修复该原因,然后返回步骤 2。165. 最多尝试 5 次。每轮都公布尝试次数。1718先分类后修复的顺序是整个方案的关键。每轮都是先诊断后编辑。19绝不要为了通过测试而削弱测试,要修复代码本身。
你输入 /fix add pagination to the users endpoint,Agent 就会编写代码、测试并自我修复,直到测试套件全部通过。
文件 2:自动检查钩子
上面的命令是按需工作的。而这个钩子能让每次编辑都自动进行自我检查。
将其添加到 .claude/settings.json 中:
1{2 "hooks": {3 "PostToolUse": [4 {5 "matcher": "Write|Edit",6 "hooks": [7 { "type": "command", "command": "npm test --silent 2>&1 | tail -5 || echo 'TESTS FAILING, fix before continuing'" }8 ]9 }10 ]11 }12}
现在,每次 Claude 编辑文件后,测试都会运行,并且结果会返回到它的视图里。
失败会立即显示出来,所以 Agent 会在同一个流程中修复问题,而不是继续进行并在已损坏的代码上堆叠更多更改。
文件 3:教会它读取错误
这个文件是真正调试器与猜测者的分水岭。大多数 Agent 看到“测试失败”就开始随机编辑。
一个好的 Agent 会首先读取错误类型,因为每种类型都指向不同的原因。将其放入 CLAUDE.md 中:
1## 如何在修复前读取错误23始终先指明错误类型。每种类型都有不同的含义:45- 断言失败(期望 X,得到 Y):逻辑错误。6 从断言点回溯到构建该值的位置。7 修复计算逻辑,而不是测试的期望值。89- 类型错误 / undefined is not a function:形状不匹配。10 某个值为 null,或者错误类型到达了这行代码。11 找到该值的来源,在那里进行保护或修正。1213- 超时 / 挂起:缺少 await,或者 Promise 从未 resolve。14 查找没有 await 的异步调用,或者一个永远不会翻转的条件。1516- 导入 / 模块未找到:路径或依赖问题,不是逻辑错误。17 修复路径或进行安装,不要修改使用该模块的代码。1819- 不稳定(有时通过):共享状态或时序问题,绝不是随机。20 查找顺序依赖的测试或未模拟的时间/网络。2122规则:在编辑之前,口头说出类型和一句话的根本原因。23如果无法指出原因,你就是在猜测。停止。
类型错误和断言失败需要相反的操作:一个是上游的数据形状问题,另一个是当前点的逻辑错误。先进行分类,Agent 就能修复正确的问题。
跳过分类,它就会随机编辑直到红灯消失,这会导致你得到一个看似通过但实际已悄悄损坏的测试套件。
你实际会看到的效果
你只需输入一行:
1/fix the date formatter returns wrong timezones
然后它就会自主工作:
1Attempt 12 ran tests → FAILED3 type: assertion (expected 5, got 11)4 cause: page size not applied to the query5 fixed the LIMIT clause67Attempt 28 ran tests → FAILED9 type: type error (offset is undefined)10 cause: page 1 sends no offset, defaulted wrong11 added offset = (page-1)*size1213Attempt 314 ran tests → ALL GREEN (7/7)1516Fixed in 3 attempts. Review the diff?
你从未粘贴过错误信息回来。它读取了自己的失败,指出了每个原因,并不断修复直到测试套件通过。
常见错误
在诊断之前就进行修复。 这是最大的错误。在指明错误类型之前就进行编辑的 Agent 是在猜测,而猜测把红灯变绿靠的是运气,不是靠修复。先分类的规则是唯一的防御手段。
以同样的方式对待每个错误。 超时和断言失败毫无共同之处,但如果没有错误类型指南,Agent 会把两者都当作“出了问题”并编辑最近的代码行。你一半的修改都会落在错误的文件里。
只修补症状。 在抛出的调用外包裹 try/catch 能让测试通过,但会留下 bug。协议禁止为了这个原因而压制错误。
让它削弱测试。 允许编辑测试的 Agent 最终会删除失败的测试以达到全绿。一个不能证明任何东西的通过套件是最糟糕的结果,所以这条规则没有商量余地。
5 分钟设置
2 分钟:创建 .claude/commands/fix.md。
1 分钟:将 PostToolUse 钩子添加到 settings.json。
1 分钟:将自调试协议添加到 CLAUDE.md。
1 分钟:在已知 bug 上运行 /fix,观察它如何一次次地修复根本原因。
你不再是那个传递错误信息的人类。Agent 会读取自己的红灯,并不断修复直到变绿。它并没有变得更聪明,它只是不再把问题抛回给你。
感谢阅读!
我每天在我的 Telegram 频道分享关于 AI、金融和 Vibe Coding 的日常笔记:https://t.me/zodchixquant






