Agent 代码评审 · 精华速读

四个改进里,三个是少让人看代码

Claude Code 团队 6 月到 9 月合并 PR 翻了一番,回滚占比反而降了 40% 以上。他们没取消评审,而是把阅读交给机器、把人的时间留给只有人能做判断的地方,同时把「撤销」做得足够便宜。代价是:评审从终点前的一道闸门,变成写作过程中持续运行的拼写检查。

来源 · claude.dev《How the Claude Code team does code review》 · 阅读约 5 分钟

每个 PR 的七层防线 01验证测试·构建 02CI红灯挡住 03AI 审查投票验证 04安全审查可阻断合并 05人工批准按风险 0/1/2 06合并队列对 main 重跑 07灰发开关·回滚 只有这一步是人 全自动:机器读完大部分 diff 人决策 层与层漏的地方不同:一层漏掉的,后面某层补上。全都漏掉的,交给底部的快速回滚。
Fig. 1七层里只有一层需要人拍板。这个设计的赌注是:把「撤销」做便宜,比把「读代码」做彻底更划算。

30 秒速览

记住这 5 句就够了

  • 换问题

    别问「有人读过代码吗」,改问「这次改动可能怎么坏,哪道检查能抓住它」。这一问把评审从终点闸门挪到了写作过程里。

  • 机器读

    大多数改动在人看之前,已经被 Claude 至少审过一轮:多 agent 找 bug,另一组投票,够票才发出来。

  • 按险配

    风险档由变更本身定,不由作者定:低风险自动合并、中风险 1 人、高风险 2 人;敏感路径永远要人。

  • 会失控

    agent 作者 + agent 审查能互相耗不完。一个 PR 一夜跑了 50 多轮,最后是作者手动叫停。

  • 看护栏

    省下的人工时间必须用回滚率、事故率验收;这两个数一涨,时间没省,只是搬了家。

第 1 层

评审的目的变了,时机也跟着变了

2,500 → 30,000+

Anthropic monorepo 每日落地变更:5 月到 9 月

16% → 54%

内部 PR 获得实质性评审意见的比例(研究预览上线时)

90%

Claude Code 自身代码中由 Claude 撰写的比例

原文把评审拆成两件事:发布前发现并修复问题,以及让团队共享对代码库的理解。前一件机器能做,后一件不能——文章前半讲机器怎么接,结尾回来讲人怎么学。

We think "did a human read the code?" is an imprecise proxy for "what could go wrong with this change, and which check—automated or human—is the right one to catch it?"

原文 · Rethinking the purpose of code review

换掉这个问题之后,评审的时间点也换了:以前是写完代码、开 PR、等同事看;现在评审持续运行,更像边写边做的拼写检查,多数改动在人被叫来看之前已经审过并改过一轮。

第 2 层

人工批准按风险分级,多给一层就多花钱

原文的风险分档表:档位决定要几个成年人签字,而档位由变更本身决定,不由作者决定。
风险典型变更需要几个人批准
低文档、文案、仅内部的功能、开关后面的增量改动自动评审与安全检查通过后,零人
中普通产品改动;缓存、自动更新、system prompt 等敏感区域1 人
高最高风险代码,以及一小批永远需要两人的路径2 人

两个分类器配合:第一个读变更定档,第二个再问「即便档位说不用,这一次是否仍需多一个人」。另有三条硬规则把它锁住——永远需要人的路径(owner 标记为敏感的、任何 CI workflow 文件);只有仓库受信名单上的作者能走轻路径,其余人要第二个人;agent 的批准永远不算人的批准,AI 可以清掉一个低风险改动,但填不了需要人的那个格子。

两个细节

批准只对某一个具体 commit 有效;来了系统无法背书的提交(比如 agent 推送、有人手工解冲突),批准要重给。另外,驱动 agent 干活的那个人,算必需评审人之一,和他自己敲代码时一样。

第 1 层到第 7 层的分工见 Fig. 1。值得注意的是这两处失败闭环:安全审查和代码审查的任何未解决意见都可以阻止合并,你只能修掉,或者写一句理由把 thread 关掉(这是清掉误报的方式);后续提交若真的修好了,意见会自己消失。每条意见都必须有回应——经常是 agent 夜里就把修复做完了,作者回来时 PR 已经又过了一轮。

审查者常年抱怨同一件事时,改源头而不是重说一遍

原文的做法是把重复意见前移到三层配置里:skill、lint 规则、以及像 CLAUDE.md 和 REVIEW.md 这样的说明文件。

CLAUDE.md

告诉 Claude 项目是什么:技术栈、约定、目标与非目标。每次评审都会加载,所以大代码库里要保持短,其余指向别的文档。审查者也会标出破坏约定的代码,以及让某一行过期的改动。

REVIEW.md

由 code owner 写:这份代码里什么算失败(文档是「它在说谎」,配置是「它路由错了」)、限制 nits 数量、列出可跳过的路径、要求给出文件与行号而不是凭名字猜。摘要以数量开头,没东西可修就直说。

Skill 与 lint

内部有三个常用 skill:一个专门找 bug,一个简化 diff,一个端到端验证行为。UI 改动还要按设计规范检查一遍。

原文在这里给了一条最有杠杆的习惯:给 Claude 一个它能跑的东西(测试、构建、可与设计稿对比的截图),并要求它拿输出说话,而不是说「我做完了」;然后让一个 subagent 用全新上下文再审这个 diff。创建者 Boris Cherny 称这是拿到好结果「大概最重要的一件事」,估计能让最终结果好两到三倍。

第 3 层

评审必须收敛,否则两个 agent 会互相耗着

收敛改造前后 上条=改造前 下条=改造后(绿) 一轮即通过 65% 78% 需 5 轮以上 8.9% 1.5% 平均轮次 2.08 1.32
Fig. 2收敛不是靠提高召回率,而是靠限制轮次:PR 仍在减少返工,但不再无限往返。

失控的形态很具体:agent 写、agent 审,两边可以永远忙下去。一个 CLI PR 过夜跑了五十多轮评审和修复,作者才叫停。团队对反复被标记的代码跑 git blame,发现约 59% 是首轮评审时就已经存在的旧代码——审查者并不是在发现新 bug,只是每轮又多翻出几条老的。

而且团队自己加重了这个问题:他们习惯了默认多跑几轮,因为每一轮总能抓到点什么。这在有风险的改动上值得,但不是每个 PR 都值得。他们把「通过轮次」和召回率一起盯着,改了四件事:三轮封顶后请作者回头重想方案;之后的复审只看新 diff;发现某类 bug 就标出类别,让作者一次修完所有实例而不是改一行;已经发过的意见不再重发。另外还有每晚在既有代码上跑的评审,专门提前抓老 bug。

噪音也要量化:如果不在乎误报,多抓 bug 很容易。他们把审查者留下的每条评论按人的反应分类(改了、说错了、说这是有意为之、判断不重要),还在已知干净的 PR 上跑审查者,统计它报出「会让人做出有害改动」的频率。写下来的优先级是:先抓真 bug,其次减少评审轮次。噪音在作者是 agent 时代价更高——人能一句话挥开一个 nit,agent 会去改,于是又多一个 commit、多一轮评审。

审查者本身也在被 eval:把过去引发事故的 PR 连同修复与回滚一起收集,请熟悉那段代码的工程师确认每个 bug 及其位置,形成每日回归集;审查者的任何改动都跑这套集,分数涨了才留下。

第 4 层

人留在机器做不好的判断上

人的五个落点 01该不该做方向·品味·范围 02风险代码计费·更新·CI 03架构范式别人会照抄 04读证据测试输出·截图 05承担结果对人问责 自动检查全程贯穿,人只在五个点上做判断 把资深工程师从深度工作里拽出来抓一个例行错误,代价远高于一次自动评审。 原文的判断标准:如果你说不出这些检查会漏掉什么,那就该要求一次真正的评审,而不是快速点个通过。
Fig. 3人的工作从「读每一行 diff」变成「做机器做不好的决定」,并且对结果负责——包括给出真实评审,而不是橡皮图章。

还有一个容易被忽略的失守点:关掉一票批准比想象中容易。原文的解法是流程而非提醒——批准绑定单个 commit,受信名单之外的人必须第二人批准,bot 的批准不占人的位置。

「你合并的,你负责」靠的是便宜,不是纪律

中小改动出问题时通常由本人修,这条团队规范能成立,是因为它背后的东西都很便宜:改动小,好审好调好回滚;一切可逆,开关、回滚、分阶段发布几分钟就能撤销大部分错误;影响面决定规格,贵的代码自然有更多人和更多检查;回归通过遥测和内部使用很快显形。原文特别强调这不是追责——你拥有修复,是因为你最了解上下文,事故复盘看的是系统。

同一层意思还有一条:agent 让启动变得便宜,所以有些工作本来就不该落地。做法是在频道里尽早提出另一个方向,而不是在成品 PR 上留一条阻断性评论。因为代码写得快,关掉 PR 不觉得是损失。

知识怎么扩散:没有正式流程,靠按需解释

评审的第二个职能是让团队理解代码库。机器读掉大部分 diff 之后,没人再靠读 diff 学习。团队的做法是:想理解哪一块,就让 Claude 为那一小片写解释——几分钟就能拿到、反映的是今天的代码;有人还会让 Claude 做一个小工具把这块代码可视化,按自己习惯的方式学。原文的对比很直接:一行文案改动逐行读完几乎学不到东西,而为即将改动的模块写解释学到的很多。默认在公开频道协作,也让人看见别人在做什么,帮上忙。

第 5 层

照搬清单:分四个时点配

PR 之前

给 agent 它能跑的检查,写进简短的 CLAUDE.md,配 hooks 跑格式化和 lint;本地跑 /code-review、/security-review,或用全新上下文的 subagent 审 diff;建 REVIEW.md,把重复出现的评审意见搬进去。

每个 PR

必需 CI;PR 模板加「怎么测的」「风险」「怎么撤销」三栏。接一个 AI 审查者到一个仓库,调几周 REVIEW.md 再铺开;加自动安全审查;要求所有评审 thread 合并前解决;按风险配审查力度;限制轮次,几轮之后只看新 diff。

批准

写下风险分档,由变更定档而非作者;先严后松,靠证据放宽;轻路径只留给受信作者;用 CODEOWNERS 和分支保护让鉴权、计费、CI 与发布流程、安装器永远需要人;绝不让 bot 批准替代必需的人工批准,新 commit 上作废旧批准。

合并之后

合并队列、特性开关、内部先用、分阶段发布、一步回滚;把事故和回滚变成 eval 集,审查者的 prompt、工具或模型一改就重新打分;量人的时间,并用回滚率和事故率当护栏。

边界:原文自己写明的空白

尚未做到

还没有「数字一动就自动收紧审批」的断路器——工程师希望在更多代码走向零人工合并之前把它做出来。坏合并的发现仍然依赖作者、值班工程师和回滚与事故看板。公开的 Code Review 产品只发意见、不批准,是否合并仍是人的决定;团队自己的仓库更进一步,让 owner 决定哪些低风险改动可以只凭自动检查合并,而这条线一直在移动。

对「降速能不能降错误率」原文的回答很克制:一位同事说放慢确实会降低错误率,但那主要是因为整体做得更少了。他们选择的是更快发现、更快修复。

来源

原文:How the Claude Code team does code review(claude.dev,2026-10-15,作者 Addy Osmani、Morgan Westlee Lunt、Qing Wang)。本篇为 5 分钟精华版,删去了原文的图注细节、内部工具链接与致谢;数量与限定条件均按原文保留,未引入外部信息。URL 里的 solving-code-review-at-anthropic 只是路径,不是篇名。

口径说明:原文的百分比与轮次数据都来自 Claude Code 团队自己的仓库与内部流程,属于内部观察,不是通用性能承诺。