
Claude写代码,测试报错,你解释哪里出问题,它修好了,又把别的地方搞坏。每次开新会话,同样的循环重来一遍。
Boris Cherny(Claude code创始人)最新采访爆料cc团队内部已经停止人为修复 Claude 的错误,他们现在让 Claude 自己修复它们
有一套配置能让Claude自动发现错误、自动修复、并且记住不再犯同样的错,Boris Cherny详细解释了这套配置。

根本原因是Claude没有跨会话记忆。每次新会话都从零开始,昨天花20分钟修的bug,明天照样会出现。
CLAUDE.md能解决这个问题。Anthropic官方的使用指南里直接写了:每当Claude做错了什么,把它加进CLAUDE.md,让它知道不要再重复这个错误。
每次纠正完,在消息末尾加一句:更新你的CLAUDE.md,这样你就不会再犯这个错了。
Claude很擅长给自己写规则,问题是大多数人从来没让它这么做。
CLAUDE.md应该随着每次错误不断扩充。不是写人格设定,而是写具体的、可执行的规则。
## 规则
- 绝对不要重构、重命名或清理无关代码
- 所有数据库查询走 services/,不要写在组件里
- 每次改完代码运行 npx tsc --noEmit
- 每次改完跑测试,失败了先修好再继续
- 提交前缀规范:feat:、fix:、docs:、refactor:、test:、chore:
- 绝对不用 enum,用字面量联合类型代替
- 绝对不要 force push,会覆盖共享历史
- 先跑 migration 再跑测试,顺序不能反
## 从错误中学到的
- 不要在 packages/ui 里装本该装在 apps/web 的包
- 不要把两种现有模式平均一下,选一种跟到底
- 不确定文件夹结构时,先查现有文件
- stop-loss 函数必须返回数字,不是布尔值(2026-05-12 生产环境出过问题)
关键是"从错误中学到的"这一节。每次纠正Claude之后,都加一句:更新CLAUDE.md,这样你就不会再犯这个错了。
坚持一个月,CLAUDE.md会积累下项目里Claude犯过的所有错误。错误率下降,因为Claude在开始工作之前会读一遍这份"不该做的事情清单"。
研究表明甜蜜点是12条规则、200行以内。超过这个范围,执行率会明显下降。
钩子会在特定时机自动触发。PostToolUse在Claude写完或编辑完文件后立即运行,在问题扩散之前把它抓住。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write(*.ts)",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $file"
}
]
},
{
"matcher": "Write(*.ts)",
"hooks": [
{
"type": "command",
"command": "npx tsc --noEmit 2>&1 | head -20"
}
]
},
{
"matcher": "Write(*.tsx)",
"hooks": [
{
"type": "command",
"command": "npx eslint --fix $file"
}
]
}
]
}
}
每个 .ts 文件:先用 Prettier 自动格式化,再做类型检查。每个 .tsx 文件:ESLint 自动修复。
Claude在同一轮对话里就能看到类型报错,立刻修掉再继续。
没有钩子的情况:Claude写完5个文件,你跑类型检查,3个文件共12个报错,你逐一解释。
有钩子的情况:每个文件写完就立刻检查,错误实时修复。
这是最关键的钩子。Stop钩子在每次Claude说"我完成了"的时候触发,在Claude真正结束之前验证工作是否达标。
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "npm test 2>&1 | tail -5; echo \"Exit code: $?\""
}
]
}
]
}
}
如果测试失败,Claude看到失败输出后会自动继续工作修复,不需要人工干预。
对于更复杂的验证,可以用 prompt 类型的钩子让Claude自己评估工作结果:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "检查所有任务是否已完成。检查代码改动中是否有bug、遗漏的边界情况和测试覆盖。如果有未完成或有问题的地方,继续工作。如果一切正常,确认完成。"
}
]
}
]
}
}
有一条关键规则必须记住:Stop钩子里一定要检查 stop_hook_active。
当这个值为 true,说明Claude已经因为前一个Stop钩子在继续工作,直接 exit 0 退出。不加这个检查,钩子会让Claude永远卡在循环里出不来。
PreToolUse在Claude执行工具之前运行,用来过滤输入、阻止代价高昂的操作。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash(cat *log*)",
"hooks": [
{
"type": "command",
"command": "grep -n 'ERROR\\|WARN' $file | head -50"
}
]
},
{
"matcher": "Write(**/.env*)",
"hooks": [
{
"type": "command",
"command": "echo 'BLOCKED: Cannot write to .env files' && exit 1"
}
]
}
]
}
}
Claude要读一个1万行的日志文件?钩子先过滤,只给它50行错误。Claude要写 .env 文件?直接拦截,操作根本不会发生。
对于需要多次尝试的任务,可以加上重试次数限制:
修复这些失败的测试。最多尝试3次。
每次尝试之后:
1. 跑测试
2. 如果通过,完成
3. 如果失败,读错误信息,换一种思路
4. 如果3次都失败,说明你尝试了什么、还有什么没修好
不要尝试同一个修法两次。
配合第三步的Stop钩子,这构成一个自我修复的闭环:Claude写代码,测试运行,失败了就读错误重新来,直到通过或者耗尽尝试次数。
必须设置次数上限。没有上限,Claude可能陷入无限重试,烧掉大量token。
钩子解决单次会话内的错误。记忆系统解决跨会话的重复错误。
# 查看Claude已记住的内容
/memory
# 手动添加规则
/memory add "这个项目用 pnpm,不是 npm"
/memory add "auth 模块在5月15日重构了,新模式在 src/lib/auth/v2/"
开启 Dreaming 功能后,Claude会在后台处理历史会话、自动积累持久知识,不需要手动添加。
三层组合:CLAUDE.md 捕获项目级规律,/memory 捕获会话级学习,Dreaming 每晚自动整合。
{
"permissions": {
"allow": [
"Read", "Glob", "Grep", "LS", "Edit", "MultiEdit",
"Write(src/**)", "Write(tests/**)",
"Bash(npm test *)", "Bash(npx tsc *)", "Bash(npx prettier *)",
"Bash(npx eslint *)", "Bash(git add *)", "Bash(git commit *)"
],
"deny": [
"Read(**/.env*)", "Write(**/.env*)",
"Bash(rm -rf *)", "Bash(git push *)"
],
"defaultMode": "acceptEdits"
},
"hooks": {
"PostToolUse": [
{
"matcher": "Write(*.ts)",
"hooks": [
{ "type": "command", "command": "npx prettier --write $file" },
{ "type": "command", "command": "npx tsc --noEmit 2>&1 | head -20" }
]
},
{
"matcher": "Write(*.tsx)",
"hooks": [
{ "type": "command", "command": "npx prettier --write $file" },
{ "type": "command", "command": "npx eslint --fix $file" }
]
}
],
"PreToolUse": [
{
"matcher": "Bash(cat *log*)",
"hooks": [
{ "type": "command", "command": "grep -n 'ERROR\\|WARN' $file | head -50" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "command": "npm test 2>&1 | tail -10; echo \"Exit: $?\"" }
]
}
]
}
}
配置之前:
配置之后:
文章来自于微信公众号 "AI寒武纪",作者 "AI寒武纪"