本节摘要:code-review 是 Claude Code 内置的工程技能(skill),它把「给代码 diff 挑错」变成一套分级、多角度、可验证的程序化流程。核心是一个 effort(努力度)分级旋钮——low(1 轮 diff 扫描,无验证,≤4 个发现)、medium、high(3 正确性 + 5 清理角度,6 候选,1 票验证,≤10 发现)、max(10 角度 + 扫描补漏,≤15 发现)——努力度越高,覆盖越广但耗时越长。每个级别都遵循「收集 diff → 多角度找候选 → 验证 → 输出」的流程,只为召回(recall)真实 bug 服务,且明确区分正确性 bug(优先)与清理建议。本节讲透这套分级方法论,让你理解官方如何用多代理(L1 角度独立 + L2 验证)做高质量代码审查,并能复用到自己的审查工作流。
内容来源:Anthropic 官方 Claude Code 技能
bundled-skills/code-review/SKILL.md、low.md、max.md(随 Claude Code 分发,从泄露素材库提取),汉化并套用体系化模板。
阅读完本节,你应当能够:
code-review 的核心是一个 effort 参数,控制审查的彻底程度。级别越高,角度越多、候选越多、验证越严,但耗时越长。
low → 1 diff 扫描,无验证,≤4 发现 (快速过一遍,只看 hunk 内明显 bug) medium → 适中角度 + 验证,≤8 发现 high → 3+5 角度 × 6 候选,1 票验证,≤10 发现 (一次坐下来认真审,召回导向) max → 5+5 角度 × 8 候选,验证 + 扫描补漏,≤15 发现 (抓尽每个真实 bug) ultra → 云端深度多代理审查
💡 选级别的经验:日常小改用 low(快速);正式 PR 审查用 high(召回导向,宁可多报);关键路径(支付、安全、核心算法)用 max(抓尽 bug)。high 与 max 都明确「为召回服务」——在高努力度下,抓到真实 bug 比避免误报更重要,宁可想错也不愿漏。
无论哪个级别,流程骨架一致(只是角度数、候选数、是否验证不同):
git diff @{upstream}...HEAD # 有 upstream 时 # 或 git diff main...HEAD # 无 upstream git diff HEAD~1 # 最近一次提交 git diff HEAD # 含工作区未提交改动(审查常在提交前跑)
如果传了 PR 号、分支名或文件路径作为参数,就审查那个目标。把得到的 diff 当作审查范围。low 级别会跳过测试/夹具文件的 hunk(test/、spec/、__tests__/、*_test.*、fixtures/)——测试文件改动在这个级别不审。
这是召回的核心。用 Agent 工具跑多个独立角度,每个角度产出一批候选发现(file/line/summary/failure_scenario)。high 级别有 8 个角度,max 有 10 个。关键原则:不要让一个角度的结论压制另一个——两个角度因不同原因标了同一行,两个都记。
对每个候选(去重后)跑一个验证器:给它 diff、相关文件、候选,它返回三态之一。low 跳过此阶段。
按严重度排序输出 JSON 数组,正确性 bug 永远排在清理建议之前。若输出上限迫使裁剪,先砍清理类。
high 级别跑 8 个独立角度,前 3 个找正确性 bug,后 5 个找清理与约定问题。
Angle A —— 逐行 diff 扫描:读 diff 每个 hunk 逐行,然后读每个 hunk 所在函数的完整代码——被触达函数里未改动行的 bug 也在范围内(PR 重新暴露或未修复它们)。对每行问:什么输入、状态、时序或平台会让这行错?找反转/错误条件、off-by-one、空指针解引用、漏 await、falsy-zero 检查、错变量复制粘贴、catch 里吞错误、未转义正则元字符。
Angle B —— 删除行为审计:对 diff 删除或替换的每行,说出它强制的不变量或行为,然后在新代码里找这个不变量在哪里重建。找不到就是候选:删了的守卫、丢了的错误路径、收窄的校验、删了覆盖真实场景的测试。
Angle C —— 跨文件追踪:对 diff 改的每个函数,找它的调用方(Grep 符号)检查改动是否破坏调用点:新前置条件、改了的返回形状、新异常、时序/顺序依赖。也检查被调方:同 PR 里的并行改动是否让某次调用不安全。
复用:标出重新实现了代码库已有功能的新代码——Grep 共享/工具模块,点名该调用的现有 helper。
简化:标出 diff 引入的不必要复杂度:冗余或可推导的状态、略变的复制粘贴、深嵌套、遗留死代码。点名更简单的等价形式。
效率:标出 diff 引入的浪费:冗余计算或重复 I/O、独立操作串行跑、阻塞工作加进启动或热路径。也标出从闭包/捕获环境构建的长生命周期对象——它们让整个外围作用域在对象生命周期内保活(作用域持有大值时是内存泄漏),建议改用只复制所需字段的结构。
高度(altitude):检查每个改动是否在正确的深度实现,而非脆弱的创可贴。在共享基础设施上叠特殊用例是修复不够深的信号——优先泛化底层机制而非加特殊用例。
约定(CLAUDE.md):找到治理改动代码的 CLAUDE.md 文件(用户级 ~/.claude/CLAUDE.md、仓库根 CLAUDE.md、改文件祖先目录里的 CLAUDE.md/CLAUDE.local.md),读每个存在的,检查 diff 是否明显违反所述规则。只在你能源引用确切规则和违反的确切行时才标——不要风格偏好、不要模糊的「文档精神」推断。
💡 约定检查的铁律:发现里要写明 CLAUDE.md 路径并引用规则原文,这样报告能引用。无 CLAUDE.md 适用就返回空。清理/高度/约定候选用同样的形状,但在
failure_scenario里写具体成本(重复了什么、浪费了什么、更难维护、违反了哪条规则)而非崩溃。
验证器对每个候选返回三态之一:
保留 CONFIRMED 与 PLAUSIBLE,丢掉 REFUTED。这是召回模式——单个非 REFUTED 票就保留发现,不要因不确定性丢弃。
⚠️ PLAUSIBLE 默认保留:不要因为「投机」或「依赖运行时状态」就反驳候选——当状态现实时:并发竞争、罕见但可达路径上的 nil/undefined(错误处理、冷缓存、缺失可选字段)、falsy-zero 当缺失、边界 off-by-one、重试风暴/部分失败、丢了锚点的正则/白名单。这些都是 PLAUSIBLE。只有能从代码构造出反证时才 REFUTED。
max 级别在 high 基础上加码:10 个角度(多了语言陷阱专家 Angle D、包装/代理正确性 Angle E),每角度最多 8 候选;验证后还多一个阶段 3 扫描——跑一个全新审查者,带着已验证列表,只找尚未列出的缺陷,最多补 8 个。扫描聚焦首轮易漏的:移动/抽取代码时丢了守卫或锚点;二阶陷阱(dataclass 默认值只算一次、hash() 非确定、锁范围缩小、谓词方法有副作用);测试 setup/teardown 不对称;配置默认值翻转。
输出上限也更高(≤15)。max 的精神:抓尽每个真实 bug,漏一个就上线了。
所有级别统一输出 JSON 数组:
[ { "file": "path/to/file.ext", "line": 123, "summary": "一句陈述 bug", "failure_scenario": "具体输入/状态 → 错误输出/崩溃" } ]
按严重度排序,最严重在前。正确性 bug 永远排在清理/高度/约定发现之前。超过上限就留最严重的 N 个。验证后无幸存就返回 []。
命令行支持 --comment(把发现作为内联 PR 评论发布)与 --fix(审查后把发现应用到工作区)。这让审查技能能直接接入 PR 工作流。
即便不用 Claude Code,这套方法论也能复用到人工或自建审查流程:
下一节讲数据可视化(dataviz)技能——把「把图画好看」变成一套有表单启发式、可运行配色验证器、标记规范的程序化流程,核心心法是「颜色可计算,所以去计算它」。