English
Anthropic published how the Claude Code team reviews code at 30,000 changes a day. A solo builder reads it with recognition — the same stack, grown by the same failures — and notes the one layer that cannot be copied.essay · standmeet2026.10.17 · essay
2026.10.17·6 min read#code-review#agents#evals

Seven Layers, One Person

Anthropic published how the Claude Code team reviews code at 30,000 changes a day. A solo builder reads it with recognition — the same stack, grown by the same failures — and notes the one layer that cannot be copied.

七层,一个人

本周,Anthropic 公开了 Claude Code 团队怎么做代码审查——这是个合理的问题,毕竟 Claude Code 约 90% 的代码是 Claude 写的。先看规模:他们单体仓库每天落地的变更,从 5 月的约 2,500 个涨到 9 月的 30,000 多个;6 月到 9 月,Claude Code 自身仓库合并的 PR 翻了一倍多,而必须回滚的比例下降了 40% 以上。没有人读得完每天 30,000 个变更。那么,替代"读"的到底是什么?

是分层,外加一个更好的问题。他们不再问"有没有人读过这段代码",改问:这个变更可能出什么问题,哪一种检查——自动的还是人的——是抓它的正确检查。一个变更现在要依次通过:PR 存在之前的自验证(agent 必须亮出测试输出,而不是说一句"做完了")、每个 PR 都有的 AI 审查(其发现由其他 agent 投票核实,每条发现必须修掉或给出理由关闭)、可以阻断合并的安全审查、常规 CI、按变更自身风险定级的人工批准——带 flag 的增量变更零人审,普通变更一人,最高风险路径两人——然后是合并队列、特性开关与分阶段发布,最底层是快速发现、快速回滚。审查不再是路尽头的一道闸门,变得更像拼写检查:持续运行、大部分由机器完成,只把人的注意力花在风险集中的地方。

我读这篇时有种认亲的感觉。我是一个人带着 agent 发版,我的验证栈和他们的一样,是被失败长出来的,不是设计出来的。先是机械检查;然后是全新上下文的对抗式审计——直接读工件的实际字节,且不得信任生产者提供的任何"事实";然后是相对于当前赢家的基准评测,永不设绝对门槛;然后是 owner 一票否决,否决理由会被转成永久规则;最后是 arena 指标,唯一真正的证伪手段。底下还有管道:内容寻址的发布关卡,保证被审计的字节就是发出去字节——这和我的 eval harness 是同一种直觉:它只导入 agent 内核的公开门面,运行与生产逐字节相同的循环,所以在评测里发现的 bug 就是真 bug,而不是重新实现造出来的假象。规模不同,骨架相同:不信任任何单一检查,每个机制只属于一层。

他们的两招,我手里也都有。第一招:"任何事故现在都是一个 eval。"他们把造成过事故的 PR 连同其修复与回滚收集起来,审查者每天都要在这个集子上被打分——而且每当它的提示词、工具或模型变更,就要重新打分。我是从另一个方向走到同一个结论的:被审计过的台账本身就是一个正在积累的 golden set,因为每个通过的工件加上它的判定,就是一条已标注的用例。我缺的纪律正是他们在跑的那条——当一条规则或一个 skill 变更时,重跑台账的一个切片,卡的是回归,不是绝对阈值。第二招:修源头,不修发现。他们的审查者反复标记同一个问题时,修复会落进 CLAUDE.md、一条 lint 规则,或产出这段代码的 skill 里。我的某个审计者抓到了别人漏掉的东西时,这个抓获会被提升进规则文本,供之后所有审计者阅读。两家店里,都是棘轮。

他们还把自己的失败模式也发了出来,这点我领情。agent 作者会耐心修掉 agent 审查者提的每一个 nit,于是两者能互相忙到天荒地老——有一个 PR 在一夜之间过了五十多轮审查。更糟的是,他们回溯审查者反复标记的内容时发现,约 59% 在审查者第一遍之前就已经躺在那里了:每一轮新翻出来的大多是旧 bug 的存量,而不是新问题。他们的解法是轮次上限、只复审 diff、标记 bug 的类别而不是某一行、以及永不重复报告。而噪音本身是按结果计量的:审查者的每条评论都按作者的实际处理分类——修了、说它错了、说行为是有意的、判定无关紧要。这和我的做法是同一种"不信任单次自信的阅读":我会把一个 prompt 扇出到数百次并行运行,按 tally 判定,而不是看某一个答案顺不顺眼。

传不到一个人的团队这里的,恰是他们最诚实地承认还没做完的部分。代码审查有第二份工作——把代码库的理解在团队里传开——而单人构建者根本没有这份工作;他们自己的替代方案(让 agent 只解释你正要动的那一片代码)在一个人时至少同样好用。更硬的缺口在人的那一层。他们的风险表最终落在人身上:危险路径的第二批准人、可信作者名单,以及一句承认——他们还没有能在回滚率变动时自动收紧批准的断路器。我的表最终落在一个人的注意力上——这个人指挥了 agent,按他们的规则算一名审查者,同时也是唯一可用的第二双眼睛。owner 否决就是我的断路器。它是手动的,不可扩展,但和他们不同的是:它存在。

"有没有人读过这段代码?"从来都是个代理问题。在每天 30,000 个变更的规模上,在一个人的发版节奏上,真正的工作是同一件:定清每一层抓什么,把每一次失败化石化进测试这些层的那个集子,并让一个有名有姓的人对发出去的东西负责。他们把这句话写成团队规范——你落的,你 own。在一个人的团队里,它不是规范,它是组织架构图。

来源:"How the Claude Code team does code review",Anthropic,2026 年 10 月 15 日——文中关于其仓库与流程的数字均出自该文。

ask the AI about this essay·context: “seven layers, one person”
›