译文|Claude Code 团队如何进行代码审查
Anthropic 如何用多层自动审查、风险分级审批、事故评测与快速回滚,在代码产量增长时减少人工审查时间。附原文六幅插图与中文说明。
文章目录
原文:How the Claude Code team does code review
作者:Addy Osmani、Morgan Westlee Lunt、Qing Wang。原文发表于 2026 年 10 月 15 日,阅读时间约 14 分钟。
以下为中文翻译,文中的“我们”指原作者及其团队。插图取自原文,保留英文标注,并附中文说明;插图版权归原权利人所有。
面对智能体生成代码的速度和规模,我们该如何进行审查?在 Claude Code 团队实现了广泛覆盖、深入细致的审查之后,我们开始优化另一个目标:在不增加回滚和事故的前提下,尽可能减少人工审查时间。
我们之前提到过,Claude Code 自身约 90% 的代码由 Claude 编写。那么,面对这样的代码产量,我们如何进行审查?还有人在读代码吗?如果出了问题,谁来发现?
本文介绍 Claude Code 团队的代码审查流程,以及这套流程的演变。从 6 月到 9 月,Claude Code 代码库中合并的拉取请求(PR)数量增长了一倍以上,而需要回滚的 PR 比例下降了超过 40%。
我们没有取消审查,而是把大部分阅读工作交给机器,将人的时间和注意力用在更有价值的地方,同时大力投入,让撤销错误变得快速、方便。
重新思考代码审查的目的
当智能体开始编写代码时,变更数量会迅速增长。今年 5 月,Anthropic 单体代码库每天合入约 2,500 次变更;到了 9 月,这个数字已经超过 30,000。
Claude Code 使用独立的代码库,与单体代码库分开,但也面临着很大的压力。当交付速度达到这种程度时,人工逐行审查代码会变得极其困难,甚至不可能。
代码审查承担两项任务:
- 在发布前发现并修复问题。
- 在团队中建立共同的上下文,加深大家对代码库的理解。
本文主要讨论第一项任务,不过我们会在接近结尾时回到第二项。
我们认为,用“有没有人读过这段代码”来代替下面这个问题,并不够准确:
“这次变更可能出什么问题?应该用哪一种检查——自动检查还是人工检查——来发现它?”
提出这个问题,也改变了审查发生的时机。过去,审查是开发流程末尾的一道关卡:写完代码,提交 PR,然后等待同事审查。
现在,审查持续进行,更像写作时的拼写检查。大部分变更在交给人查看之前,已经至少经过一轮 Claude 的审查和修复。这能发现大多数常见错误,让团队把注意力留给更高层次的问题和更深入的检查。
稀缺的资源:人的时间和注意力
我们希望把人的时间和注意力留给只有人才能解决的问题,其余问题则由自动检查发现。按照我们目前的变更速度,仍然有大量工作需要人来完成,团队几乎每天都会遇到新的挑战。
人的时间包含审查成本的两个方面:一方面是审查代码花费的时间,另一方面是修复有问题的代码所造成的破坏花费的时间。如果节省的审查时间只是转移到了后续修复上,那就没有意义。
因此,我们的目标是:Claude Code 各代码库——包括命令行工具、桌面应用、网页应用和移动应用——中的大部分 PR,最多只需一人参与即可合并,这个人可以就是作者本人,同时不增加回滚或事故。
为了衡量人的时间,我们追踪每个 PR 的人工批准次数,包括中位数和第 95 百分位数,以及人工评论数量、PR 等待人工处理的时长。
回滚率和事故率是约束指标:如果它们上升了,我们就没有节省人的时间,只是把时间成本转移到了别处。
一次变更的完整历程
一次典型的变更,无论起点是工程师的电脑,还是 Slack 中的一次 Claude 会话,都会经过多层代码审查。
图 A|一次变更的完整历程。 提交前验证 → 每个 PR 的 CI、AI 审查和安全审查 → 按风险决定人工审批人数 → 合并队列重新验证 → 内部先行使用 → 逐步发布 → 监控、修复或回滚。大部分步骤由自动化完成,人的注意力投入到存在风险的地方。
逐层检查
图 B|多层防线,而非单一关卡。 六层检查,下方还有回滚机制兜底。每一层都能发现一些问题,也会漏掉一些问题。能穿过全部防线的问题很少,剩下的由回滚处理。
1. 在交给其他人查看之前,先验证工作
现在,大部分审查发生在 PR 创建之前。
我们会给 Claude 一种可以实际执行的验证方式,比如测试、构建,或者用于与设计稿比较的截图,并要求它展示执行结果,而不是只说“完成了”。随后,再由一个拥有全新上下文的子智能体审查代码差异。这两种做法都来自我们的最佳实践指南。
在创建 PR 之前,我们中的许多人还会运行几项内部技能:一项寻找缺陷,一项简化代码改动,一项检查端到端行为。界面变更还要对照设计规范进行检查。
Claude Code 的创建者 Boris Cherny 曾表示,给 Claude 一种验证自己工作的方式,可能是获得良好结果最重要的一件事。他估计,这能让最终结果的质量提高到原来的两到三倍。他写道:
不同领域的验证方式不同。它可能只是运行一条命令,也可能是运行测试套件,或在浏览器、手机模拟器中测试应用。
如果自动审查器不断指出同一类问题,我们就从源头解决:改进技能、增加静态检查规则,或者更新以下指导文件:
CLAUDE.md告诉 Claude 这个项目是什么,包括技术栈、约定、目标和非目标。每次审查都会加载它,因此在大型代码库中,我们会让它保持简短,并通过链接指向其他文档。审查器也会指出违反其中约定的代码,以及导致其中某条说明过时的变更。REVIEW.md由代码负责人编写,告诉审查器在他们负责的代码中,哪些事情最重要。我们还会单独检查审查器是否真的遵守了它。好的REVIEW.md都很简短:明确说明这个代码库中什么算失败,例如文档的失败是“内容不实”,配置的失败是“路由错误”;限制细枝末节类评论的数量;列出应跳过的路径;要求提供文件和行号作为证据,而不是根据名称猜测。它还会要求审查摘要先给出问题数量,并在没有需要修复的问题时直说。
2. 每个 PR 都接受 AI 审查
每个 PR 在交给人查看之前,都会先经过 Claude 审查。它会结合整个代码库和 PR 声明的意图阅读代码差异,并提出这些问题:这次变更解决了它要解决的问题吗?是否适合现有系统?是否会破坏其他功能?
对于缺陷修复,它会寻找根本原因。公开版本 Code Review for Claude Code 现已向 Team 和 Enterprise 套餐正式开放,而 /code-review 可以在本地运行一个更轻量的版本。
在我们推出研究预览版时,内部 PR 中收到实质性审查意见的比例,从 16% 提高到了 54%。大多数超过 1,000 行的 PR 都会被发现问题,而大多数小型 PR 则会顺利通过。管理员可以为每个代码库选择 Quick、Standard 或 Deep 模式。如果漏掉一个缺陷的代价高于额外的审查时间,Deep 模式就是值得的。
在人工查看之前,其他智能体会先验证审查发现的问题。多个智能体同时寻找缺陷,随后由另一组智能体对每项发现投票。只有足够多的智能体认定问题确实存在,它才会被发布出来。
仅涉及风格、诊断信息或代码清理的问题会被过滤掉。在保留这些过滤规则之前,我们先在自己的 PR 上进行了 A/B 测试。最终留下的问题会以行内评论的形式展示,并按严重程度排序。
每项问题都会标记为“重要”(Important)、“细节”(Nit)或“既有问题”(Pre-existing),这样就不会让一个并非由当前 PR 引入的缺陷,看起来像是作者的责任。
每项发现都必须得到回应:要么修复,要么说明理由并将讨论标记为已解决。很多时候,智能体会在夜间接手修复,因此作者第二天回来时,PR 已经又完成了一轮修改和审查。
3. 能够阻止合并的安全审查
安全问题也有独立的自动审查。
只要缺陷审查或安全审查中仍有未解决的问题,PR 就不能合并。你需要修复问题,或者简要说明原因并关闭讨论;误报就是通过后一种方式处理的。
如果后续提交修复了问题,对应的发现会自动清除。你可以使用开源的安全审查 GitHub Action,或者 /security-review 命令,建立同样的机制。具体设置方法见 Claude Code 自动安全审查文档。
4. 能够阻止合并的自动检查
这些都是常规检查:静态检查、类型检查、所有平台上的测试,以及构建。我们之前也介绍过如何扩展持续集成系统,以应对这样的变更规模。
一个典型的命令行工具 PR,在任何人查看之前,可能就会运行数十项检查。PR 模板要求说明变更是如何测试的,以及如何撤销。Claude 可以填写这些内容,但提出变更要求的人必须确认认可。
5. 根据风险安排人工批准
修正文档和修改自动更新器的风险不同,因此它们需要不同程度的审查。
| 风险 | 示例 | 人工批准要求 |
|---|---|---|
| 低 | 文档、文案、仅内部使用的功能、置于功能开关之后的新增功能 | 自动审查和安全检查通过后,无须人工批准 |
| 中 | 一般产品变更,以及缓存、自动更新器、系统提示词等敏感区域的变更 | 一人批准 |
| 高 | 风险最高的代码,以及少量始终要求两人审批的路径 | 两人批准 |
风险等级由变更内容决定,而不是由作者决定。
一个分类器会阅读变更并确定其风险等级。第二个分类器则会判断:即使按照该等级不需要额外审批,这次具体变更是否仍然需要另一个人参与。
有些路径始终需要人工参与,包括代码负责人列为敏感的部分,以及任何持续集成工作流文件。
只有受信任的作者才能使用较宽松的审批路径。这些作者必须位于代码库的信任名单中,通常主要是负责该代码库的团队成员。其他所有人都需要第二个人批准。
智能体的批准也绝不会被算作人工批准。自动审查可以放行低风险变更,但不能填补明确要求由人承担的审批名额。
谁发出指令要求进行变更,谁就要为它负责。对于智能体编写的 PR,指挥智能体的人会被计入所需的审查人员,就像代码是他亲手编写的一样。
一次批准只覆盖某个特定提交。如果出现系统无法担保的新提交,例如智能体推送的提交,或由人手动解决冲突后的合并提交,就必须重新批准。
6. 合并队列、功能开关和逐步发布
合并队列会把变更应用到主分支上,然后重新运行所有检查,防止两个单独测试都通过的 PR,组合起来却破坏主分支。
新行为通常会先置于功能开关之后,向 Anthropic 员工发布。内部高强度使用经常能在用户遇到问题之前发现回归。
公开版本先进入 latest 渠道,stable 渠道则会稍晚一些。
7. 快速发现,快速回滚
仍然会有一些错误穿过所有检查,因此最后一层防线的重点是迅速发现问题。
功能开关无需重新部署就能关闭。Claude Code 实行按周轮换的值班制度,事故复盘会追问:这个问题本应由哪一层发现?
目前,发现有问题的合并,仍然需要依靠作者、值班人员,以及回滚和事故监控面板。
我们还没有实现这样的熔断机制:当这些指标发生变化时,自动收紧审批要求。团队中的工程师希望,在更多代码进入无需人工参与的合并流程之前,先建立这类机制。
一位同事说,放慢速度确实能降低错误率,但主要原因是你做的所有事情都变少了。我们更希望提高发现和修复问题的速度。
我们如何改进审查器
我们的代码审查流程始终处于持续改进的循环中。
现在,每次事故都会成为一个评测案例。团队收集过去引发事故的 PR,以及对应的后续修复和回滚,再请熟悉相关代码的工程师确认每个缺陷及其所在位置。审查器每天都会在这组数据上运行。
图 C|事故就是我们的评测数据。 评测集由历史事故和回滚案例构成,每天运行;每次事故都会扩充评测集,审查器的每次变更都要在完整评测集上评分。
我们通过观察人们如何处理审查评论来衡量噪声。如果不介意报告大量并非缺陷的问题,那么发现更多缺陷并不难,因此我们需要约束这种情况。
我们根据 PR 参与者的回应,对审查器留下的每条评论进行分类:他们修复了问题、认为评论有误、说明该行为是有意设计的,或者判断它无关紧要。
我们还会让审查器检查已知没有问题的 PR,统计它报告的问题中,有多少会诱导别人做出有害修改。
我们明确写下的优先级是:首先发现真实缺陷,其次减少审查轮数。
当作者是智能体时,噪声的成本更高。人可以在几秒钟内忽略一个细枝末节的问题,智能体却会动手修复,进而产生一个新提交和新一轮审查。
审查必须能够收敛。智能体作者和智能体审查器可能让彼此无限忙碌下去。有一个命令行工具 PR,在一夜之间经历了超过 50 轮审查和修复,最后才被作者叫停。
我们对审查器不断指出的代码运行 git blame,发现其中约 59% 的代码从第一轮审查时就已经存在。审查器很少发现新的缺陷,而是在每一轮中再找出一些旧缺陷。
我们自己的习惯也加剧了这个问题。因为每轮审查都会发现新问题,我们已经习惯默认运行多轮审查。对高风险变更来说,这可能值得,但不该用于每一个 PR。
现在,团队除了追踪召回率,也会追踪通过审查所需的轮数,并调整了重复审查的方式:
- 限制轮数。 三轮之后,审查器会要求作者退一步,重新考虑实现方案。
- 最初几轮之后,只重新审查新增的代码差异。
- 指出缺陷所属的类别,让作者修复所有同类情况,而不是只改一行。
- 不重复报告已经发布过的问题。
审查智能体还会每晚检查现有代码,帮助我们在旧缺陷于其他地方暴露之前发现它们。
图 D|能够收敛的审查。 调整前后内部 PR 的对比显示,改进收敛机制后,每个 PR 所需的审查轮数减少了。
| 图中指标 | 改进前 | 改进后 |
|---|---|---|
| 一轮审查与修复后通过的比例 | 65% | 78% |
| 需要五轮及以上的比例 | 8.9% | 1.5% |
| 通过审查所需的平均轮数 | 2.08 | 1.32 |
哪些环节仍然需要人
让一名资深工程师从深度工作中抽身,去发现一个常见错误,其代价远高于一次自动审查。
在 Anthropic,我们的工作已经从阅读每一份代码差异,转向机器不擅长的决策:
- 我们究竟该不该做这件事? 包括方向、品味和范围。有个团队宣布审查瓶颈已经解决,但仍然保留了对团队外部变更的人工审查,确保有人会问:“我们到底该不该做这个?”
- 高风险代码。 例如计费、自动更新器和持续集成工作流。
- 会成为后续范例的架构。 因为其他人会模仿这些设计。
- 阅读证据。 包括测试输出、执行的命令及其返回结果、截图,以及审查器发现的问题。如果你说不清这些检查会漏掉什么,就应该要求一次真正深入的审查,而不是快速批准。
- 对结果负责。 无论代码是谁写的,每次上线变更都必须有人承担责任。
图 E|由人作决定的地方。 五类决策仍由人负责,其他地方则广泛运行自动检查。人的工作从阅读每份代码差异,转向机器不擅长的判断。
在团队中共享上下文
代码审查的第二项任务,一直是传播对代码库的理解。阅读同事的代码差异,是了解发生了什么变更、各部分如何配合的一种方式。
如果大部分阅读工作都由机器完成,人又该如何学习代码?
我们没有为此建立正式流程。团队里没有人会在脑海中保留 Claude Code 完整的心智模型,我们也不认为有人需要这样做。
当某人想理解代码库中的某个部分时,就让 Claude 针对那个具体部分写一份说明。只需几分钟,而且说明反映的是代码当前的实际状态。

图解|机器读代码,人如何学习? 先确定想理解的部分,例如托管设置,再向 Claude 提问:“Claude Code 如何获取托管设置?”Claude 可以生成说明,也可以创建小型可视化作品,以适合个人的方式帮助理解。
我们中的一些人还会更进一步,让 Claude 制作一个小型可视化作品,展示那部分代码,并按照自己喜欢的学习方式来讲解。
如果目标是合理使用人的注意力,这比逐行阅读琐碎的代码差异更有效。修改一行文案,几乎教不会你什么;而一份解释你即将修改的模块的说明,则能让你学到很多。
我们默认在公开 Slack 频道中开展工作的文化也有帮助,因为你能在其他人开发的过程中,看到他们正在构建什么。
“谁合入,谁负责”
如果你合入了一项小型或中型变更,之后仍然出了问题,团队的惯例是通常由你来修复。
以下几点让这套做法能够良好运转:
- 变更规模小,因此容易审查、调试和回滚。
- 一切都可以撤销。功能开关、回滚和分阶段发布,让大多数错误能在几分钟内被撤销。
- 影响范围决定要求。出错代价高的代码,需要更多人参与、更多检查。
- 遥测和内部使用能快速暴露回归。
- 这不是追责。由你修复,是因为你最了解上下文;事故复盘关注的是系统。
责任也是共享的。团队中的许多人在公开频道工作,任何人都能看到别人正在构建什么、接手某段讨论,或者让 Claude 去补上某个缺口。反馈也来自并不负责相关代码的人。
这种开放性,是我们无需对每一行代码都设置人工关卡、仍能保持高质量的重要原因。
我们什么时候改变方向
智能体让启动工作的成本变得很低,因此有些工作最终就不应该合入。
通常,频道里会有人问为什么要做、指出之前已经作出的决定,或者提出更简单的路径。随后,作者会关闭 PR,或重新调整它。
因为代码写得很快,关闭 PR 并不会让人觉得损失很大。
关键是尽早在讨论中提出不同方向,而不是等 PR 已经完成,再留下一条阻止合并的评论。
你的团队如何采用这套流程
现在,实现这套流程所需的大多数组成部分都已经具备。
创建 PR 之前
- 给智能体提供它能够执行的检查,将其列在简短的
CLAUDE.md中,并设置自动运行格式化工具和静态检查工具的钩子。 - 在本地运行
/code-review和/security-review,或者让拥有全新上下文的子智能体进行审查。 - 添加
REVIEW.md,把反复出现的审查意见整理进去。
每个 PR 都要做的事
- 强制通过持续集成检查,并在 PR 模板中加入“测试”“风险”和“如何回滚”。
- 先在一个代码库中引入 AI 审查器,例如 Code Review for Claude Code 或 Claude Code GitHub Action;用几周时间调整
REVIEW.md,再扩大使用范围。 - 添加自动安全审查,并要求所有审查讨论都得到解决后才能合并。
- 让审查力度与风险相匹配:常规变更快速检查,漏掉缺陷代价高的变更深入检查。在 Code Review 中,对应 Quick、Standard 和 Deep 模式。
- 限制审查轮数;最初几轮之后,只重新审查新增差异。
批准机制
- 明确写下风险等级,由变更内容而非作者决定;开始时严格一些,再根据证据逐步放宽。
- 只让受信任的作者使用较宽松的审批路径。
- 使用
CODEOWNERS和分支保护,让身份认证、计费、持续集成与发布工作流,以及安装程序,始终需要人工参与。 - 绝不让机器人的批准替代规定的人类批准;出现新提交时,撤销原有批准。
合并及之后
- 使用合并队列、功能开关、内部先行使用、分阶段发布,以及一键回滚。
- 将事故和回滚转化为评测集;每当审查器的提示词、工具或模型发生变化时,重新评分。
- 衡量人的时间,并以回滚率和事故率作为约束指标。
接下来会如何发展
Code Review 的发布公告曾表示,批准 PR 仍然是人的决定;产品负责报告发现的问题,而不负责批准。
我们自己的代码库走得更远一些:允许负责人决定哪些低风险变更可以仅凭自动检查合并,而且这条边界仍在不断变化。
当审查漏掉问题时,我们会追问:模型当时缺少什么信息?随后,把相应改进加入 CLAUDE.md、某项技能,或者新的检查中。
目标始终没有改变:减少每次变更所需的人工时间,同时不让回滚变得更多。
如果你的团队允许智能体创建 PR,我们很想听听:哪些检查已经自动化,哪些仍然需要人,以及你认为我们哪里做得不对。
感谢 Emma Webb、Michael Segner 和 Amie Rotherham 对本文的审阅。
留下你的声音
聊一聊
无需登录,填写昵称即可留言。评论和昵称会公开显示,邮箱不会公开。
这里是本地测试评论区,留言不会混入正式页面。