FRONTIER · 译文 · 2026-10-17

Claude Code 团队怎样做代码评审

我们说过,Claude Code 自己的代码大约九成是 Claude 写的。那我们怎么审这个量?还有没有人在读代码?出事谁拦住?这篇按 Claude Code 团队 2026 年 10 月 15 日的原文译完。

原文:How the Claude Code team does code review

从 6 月到 9 月,合进 Claude Code 代码库的拉取请求翻了一倍以上,必须回退的比例掉了四成以上。

我们没有拿掉评审。我们把大部分阅读交给机器,按人的时间和注意力来优化,并且花了很多力气,让犯错之后撤起来又快又容易。

1重新想代码评审是干什么的

代理写代码的时候,改动量涨得很快。Anthropic 的单体仓库里,每天落地的改动从今年 5 月大约 2,500 条涨到 9 月超过 30,000 条。

Claude Code 住在自己的仓库里,跟单体仓库分开,压力也很大。发得这么快,一行一行人工审,极其难,近乎做不到。

代码评审干两件事:

  1. 发出去之前找出问题并修好
  2. 在团队里建立共享的上下文,以及对代码库的理解

这篇文章主要写找出问题并修好。第二件我们快结束时再回来。

我们觉得,「有没有人读过这段代码」测不准「这次改动会出什么错,哪一种检查——自动的还是人的——适合拦住它」。

这个问题也改了评审发生的时间。以前,评审是路尽头的一道闸:写代码,开拉取请求,等同事。现在,评审一直在跑,更像你写字时的拼写检查。请人看之前,大多数改动已经被 Claude 审过并修过至少一次。常规错误大多在这里拦住,团队的注意力留给更高一层的问题和细看。

2稀缺的是人的时间和注意力

我们想把人的时间和注意力留给只有人能解的问题,其余交给自动检查。按我们现在的改动速度,人要做的事仍然多得吓人,团队几乎每天都会碰上新的、没见过的难题。

人的时间覆盖评审成本的两边:人花在审上的时间,以及人花在修坏代码弄出来的麻烦上的时间。砍掉前一块,如果时间只是出现在后一块,并不算帮到忙。

所以目标是:Claude Code 这些仓库(命令行、桌面和网页应用、移动应用)里,大多数拉取请求合并时最多一个人在场,这个人可以是作者,同时回退和事故不增加。为了量人的时间,我们跟踪每条拉取请求的人工批准数(中位数和 95 分位)、人工评论,以及一条拉取请求等人的时长。回退率和事故率是护栏:这两项涨了,我们就没有省下人的时间,只是把它挪了地方。

3一层一层

一条典型的改动,从工程师的电脑(或者 Slack 里的一次 Claude 会话)出发,经过多层代码评审。路径的大部分是自动的;人的注意力去风险所在的地方。

一层一层,不是一道闸 每一层拦住一些,漏掉一些。漏过全部的,交给回退 1 提交前 能跑的测试、构建或截图对照;新上下文的子代理审 diff 2 每条 PR Claude 对照整仓和声明意图审一遍;发现要投票,够票才贴 3 安全 单独的自动安全评审。发现还开着,不能合并 4 CI lint、类型、各平台测试、构建。模板要写怎么测过、怎么撤 5 人 低风险 0 人,中风险 1 人,高风险 2 人。档位看这次改动,不看作者 6 发布 合并队列对 main 再跑一遍。新行为先开关给内部 7 回退 开关可关,不必重新部署。周值班。事故复盘问哪一层该拦住
图 六层检查,回退垫在底下。对应原文 FIG B。

1. 别人看之前,工作已经验证过

现在大多数评审发生在拉取请求出现之前。我们给 Claude 一件它能跑的东西——测试、构建,或者一张对照设计的截图——然后要它出示输出,而不是说做完了。再让一个子代理带着新的上下文审 diff。这两条习惯来自我们的 best-practices。

开拉取请求之前,我们很多人还会跑几项内部技能:一个找 bug,一个简化 diff,一个从头到尾检查行为。界面改动还会对照设计规范检查。

Claude Code 的作者 Boris Cherny 说过,给 Claude 一个验证自己工作的办法,大概是最重要的一件事,才能拿到好结果。他估计最终结果会好两到三倍,并且写:「验证在每个领域长得不一样。它可能只是跑一条 bash,或者跑一套测试,或者在浏览器、手机模拟器里试这个应用。」

自动评审反复标出同一件事,我们就在源头修:技能里、一条 lint 规则里,或者改说明文件,例如:

  • CLAUDE.md 告诉 Claude 这个项目是什么:技术栈、约定、目标和非目标。每次评审都会加载,所以在大代码库里我们写短,从那里指向别的文档。评审也会标出违反其中约定的代码,以及让其中一行过时的改动。
  • REVIEW.md 由代码负责人写,告诉评审在他们这块代码里什么要紧。我们另外检查评审是不是真的照着做。好的那些很短。它们说出这个仓库里失败长什么样(文档是「它撒谎」,配置是「它指错路」),限制挑剔的数量,列出可跳过的路径,并且要求文件和行号作证据,不要凭名字猜。它们还要求摘要以计数开头,没事可修就直说。

2. 每条拉取请求都有 AI 评审

每条拉取请求在人看之前都过一遍 Claude 评审。它对照整仓和这条请求声明的意图读 diff,并且问:这次改动解没解决问题、合不合系统、有没有弄坏别处?

修 bug 时,它找根因。公开版本是 Code Review for Claude Code,现在 Team 和 Enterprise 方案已经正式可用。本地的 /code-review 跑一个更轻的版本。

我们 发布研究预览 的时候,内部拉取请求拿到实质评论的比例从 16% 到 54%。超过 1,000 行的大多数会有发现,小的大多数干净回来。管理员按仓库设 Quick、Standard 或 Deep。漏一个 bug 比多花评审时间更贵的地方,Deep 值得。

发现贴给人看之前,要过别的代理验证。几个代理同时找 bug。然后另一组对每条发现投票,够票才贴。只谈风格、诊断或清理的丢掉。这些过滤器我们在自己的拉取请求上做过 A/B 才留下。剩下的按严重程度排成行内评论。每条标 Important、Nit 或 Pre-existing,这条请求没引入的 bug 不会看起来像作者的错。

每条发现都要答复。你要么修,要么关掉线程并写原因。常常有代理夜里接着修,作者回来时这条拉取请求已经又过了一轮。

3. 能挡住合并的安全评审

安全也有自己的自动评审。bug 评审或安全评审还有发现开着,拉取请求不能合并。你要么修,要么用一句短原因关掉线程,假阳性就是这样清掉的。

后面的提交修好了这个问题,发现会自己清掉。你可以用开源的安全评审 GitHub Action,或者 /security-review 命令,搭出同样的东西。搭法写在 Claude Code 的自动安全评审。

4. 能挡住合并的自动检查

老一套:lint、类型检查、每个平台的测试、构建。(我们写过 这个量级下怎样扩 CI。)一条典型的命令行拉取请求,在任何人看它之前,可能跑几十项检查。拉取请求模板问这次改动怎么测过、怎么撤。Claude 可以填,但要这次改动的那个人签字。

5. 人的批准,按风险缩放

改文档和改自动更新器,带着不一样的风险,所以它们得到不一样的评审。

风险例子要几个人批准
低文档、文案、仅内部功能、开关后面的增量改动自动评审和安全检查绿了,可以不要人
中普通产品改动,以及对缓存、自动更新器、系统提示这类敏感区的改动一个人
高最高风险的代码,外加一小批路径永远要两个人两个人

档位由这次改动定,不由作者定。一个分类器读这次改动,挑它的风险档。第二个分类器再问:即便档位说不用,这一次要不要再叫一个人。有些路径永远要人:负责人列为敏感的任何东西,以及任何 CI 工作流文件。

更轻的路径只给受信任的作者。只有仓库信任名单上的作者能走更轻的路径,多半是拥有这块代码的团队。其他人都要第二个人批准。代理的批准也永远不算人的。自动评审可以放行低风险改动,填不了「必须有人」的那个空位。

谁提示了这次改动,谁就对它负责。代理写的拉取请求上,指挥代理的人算一个必需的评审人,和自己敲代码一样。

一次批准覆盖一个具体提交。如果落到系统无法担保的新提交,比如代理再推一次,或者有人手工解决了合并冲突,批准要重给。

6. 合并队列、开关、逐步发布

合并队列把每项检查对着已经打上这次改动的 main 再跑一遍,这样两条各自通过的拉取请求合不到一条坏掉的 main 上。新行为通常先开关给 Anthropic 员工,我们自己用得重,常常在用户之前就把回归顶出来。公开发布先走 latest 通道。stable 跟着它。

7. 发现得快,撤得快

有些错还是会漏过去,所以最后一层是尽快抓住它们。开关可以关,不必重新部署。Claude Code 有每周值班,事故复盘会问哪一层该拦住这个问题。

发现一次坏合并,仍然靠作者和值班,以及回退和事故看板。我们还没有在这些数字动起来时收紧批准的断路器;这里的工程师希望先有它们,再把更多代码放到零人工合并。

有同事说,放慢确实会把错误率压下去,多半是因为你每件事都做得更少。我们宁可在发现和修好问题上变得更快。

4我们怎样让评审变得更好

我们的代码评审一直在一个循环里改进。

事故现在变成评测。团队收集了过去导致事故的拉取请求,连同后续修复和回退,让熟悉那块代码的工程师确认每个 bug 和它所在的位置。评审每天对着这套跑。

噪声我们按人对评论做了什么来量。多抓 bug 很容易,只要你不在乎标出一大堆不是 bug 的东西,所以我们需要一项检查顶住这个。我们把评审留下的每条评论,按拉取请求上的人怎么回应来分类:他们修了、说标错了、说行为是故意的,或者觉得无所谓。我们也把评审跑在已知干净的拉取请求上,数它报出会让人做出有害改动的次数。写下来的优先级是:先抓真 bug,再减评审轮次。

作者是代理的时候,噪声更贵。人几秒就能挥掉一条挑剔。代理会去修,于是又一次提交、又一轮评审。

评审必须收敛。代理作者和代理评审可以互相喂活,停不下来。有一条命令行拉取请求夜里修了五十多轮,作者才叫停。

我们对评审一直在标的东西跑了 git blame,大约 59% 是评审第一轮就已经在的代码。评审很少在找新 bug,每一轮多找出几个旧的。

这有我们自己的份。我们习惯了默认多跑几轮,因为每轮总能再抓到一点。风险高的改动值得,每条拉取请求都这么跑不值得。团队现在同时盯「过关要几轮」和召回,并且改了复审:

  • 轮次上限。三轮之后,评审请作者停下来,重新考虑做法。
  • 前几轮之后,只审新增的 diff。
  • 标出这一类 bug,让作者修每一处,不是修一行。
  • 已经贴过的发现不再重复。

评审代理夜里也会在现有代码上跑,帮我们在旧 bug 出现在别处之前抓住它们。

5人还留在哪些地方

把资深工程师从深入的工作里拉出来抓一个常规错误,比自动评审贵得多。在 Anthropic,我们的工作已经从读每一份 diff,挪到机器做不好的决定:

  • 该不该做这件事?方向、口味、范围。有个团队宣称评审瓶颈已经解开,对外来改动仍留人审,好有人问「我们到底该不该做」。
  • 风险高的代码,比如账单、自动更新器、CI 工作流。
  • 会被别人照着抄的架构。
  • 读证据。测试输出、跑过的命令和它返回了什么、截图、评审的发现。你说不出这些检查会漏什么,就去要一次真审,不要快速批准。
  • 对结果负责。发出去的每一条改动都有人对它负责,不管字是谁敲的。

6在团队里共享上下文

代码评审的第二份工作,一直是把对代码库的理解摊开。读同事的 diff,是你知道改了什么、各块怎么接上的办法。如果大多数阅读由机器做,人怎么学代码?

我们没有正式流程。团队里没有人在脑子里装着完整的 Claude Code,我们也不认为需要。有人想搞懂某一块,就让 Claude 只给那一块写一份说明。几分钟,对着今天的代码。

机器读了大多数 diff 之后,人怎样学代码
原文配图。左边是代码库,你只取出想搞懂的那一块;问 Claude 只要这一片。一份说明几分钟就能写出来,对着今天的代码。有人还会让 Claude 做一个小物件,按自己习惯的方式教。

我们有些人还会再往前一步,让 Claude 做一个小物件,把那一块画出来,按那个人喜欢的方式教。

如果目标是把人的注意力花好,这比一行一行读琐碎的 diff 强。一行文案改动几乎什么也教不到。你正要改的那个模块的说明,能教到很多。我们默认在公开 Slack 频道里干活也帮了忙,别人在建什么,你在他们建的时候就看得见。

7「你合进去,你接着」

你合进去一条小的或中等的改动,后面还是出了问题,团队规范是:通常由你来修。几件事让这条规范不至于走歪:

  • 改动小,所以好审、好查、好撤。
  • 每件事都能撤。开关、回退、分批发布,多数错误几分钟就能解开。
  • 爆炸半径定门槛。贵的代码,要更多人和更多检查。
  • 回归冒得快,靠遥测和内部使用。
  • 这不是问责。拥有一次修复,是因为你上下文最多;事故复盘看系统。

所有权也是分担的。团队很大一部分在 公开频道 里干活,谁都能看见别人在建什么、接过一个线程、或者把 Claude 指到一个缺口上,反馈也来自并不拥有这块代码的人。质量能在没有「每一行都有闸」的情况下站住,这种敞开是很大一块。

8方向改了怎么办

代理让开工变便宜,所以有些活不该合进去。通常频道里会有人问为什么、指到更早的决定、或者提出更简单的路,作者关掉或改形状。

代码写得快,关掉拉取请求不像亏了一笔。窍门是尽早在线程里提出另一个方向,不要等成品上再当阻塞评论。

9你可以怎样把这套接过来

和你的团队一起做这件事,大多数零件今天已经有了。

拉取请求之前

  • 给你的代理能跑的检查,写进一份短的 CLAUDE.md,再加上跑格式化和 lint 的钩子。
  • 本地跑 /code-review 和 /security-review,或者一个新上下文的子代理评审。
  • 加一份 REVIEW.md,把反复出现的评审评论搬进去。

每条拉取请求上

  • 要求 CI,并在模板里加上「怎么测的」「风险」「怎么撤」。
  • 加一个 AI 评审(Code Review for Claude Code,或 Claude Code GitHub Action)到一个仓库,把 REVIEW.md 调几周,再铺开。
  • 加自动安全评审,并且要求合并前每一条评审线程都关掉。
  • 让评审力度跟风险匹配:常规改动快速过,漏一个 bug 很贵的地方用深的(Code Review 里的 Quick、Standard 或 Deep)。
  • 给评审轮次设上限;前几轮之后,只复审新增的 diff。

批准

  • 写下风险分档,由这次改动定,不由作者定;先严,有证据再松。
  • 更轻的批准路径只留给你信任的作者。
  • 用 CODEOWNERS 和分支保护,让鉴权、账单、CI 和发布工作流、安装器永远要人。
  • 永远不要让机器人的批准顶掉一个必需的人的批准;新提交上来就撤掉旧批准。

合并之后

  • 用合并队列、功能开关、先内部用、分批发布、一步回退。
  • 把事故和回退收成评测集,评审的提示、工具或模型一改,就重新打分。
  • 量人的时间,回退率和事故率当护栏。

10这套东西在往哪走

Code Review 的发布说明说过,批准一条拉取请求仍然是人的决定;产品贴的是发现,不是批准。我们自己的仓库走得更远,允许负责人决定哪些低风险改动只靠自动检查合并,那条线还在往前挪。

评审漏了什么的时候,我们问模型当时眼前少了什么,再把修补写进 CLAUDE.md、一项技能,或一条新检查。目标没变:每条改动少用人的时间,回退不比以前多。

如果你的团队让代理开拉取请求,我们想听听你们把哪些检查自动化了、哪些仍然要人,以及你觉得我们哪里说错了。

感谢 Emma Webb、Michael Segner 和 Amie Rotherham 审过原文。

11出处

这篇是译文。原文 Claude Code 团队,How the Claude Code team does code review,2026-10-15。16% 到 54% 写在 2026-03-09 的 Code Review 发布说明,口径是当时内部拉取请求。日合并 2,500 到 30,000 写在 Redesigning source control,口径是 Anthropic 单体仓库,不是 Claude Code 这个仓。约九成代码由 Claude 写,是原文「我们说过」的说法,这篇没有新的测量。回退掉四成以上没有绝对条数。59% 和五十多轮只在原文里,我没有核过分母。

文中「一层一层」那张图按原文 FIG B 重画,中文标注。学习代码那张图来自原文。