文章

【笔记】Codex 与 Claude Code 的代码审查模型

【笔记】Codex 与 Claude Code 的代码审查模型

一句话模型

AI 代码审查需要分开回答两个问题:

  1. 审查对象是什么:当前工作树、相对基准分支的差异、某个 Commit,还是 GitHub PR?
  2. 谁来审查:当前实现会话继续检查,还是启动拥有独立上下文的 reviewer?

Codex 把这两件事收进统一的 Review Mode;Claude Code 则拆成 /code-review/review/security-review/code-review ultra 等多个入口。

最容易记住的对应关系是:

1
2
3
4
5
Codex /review
    ≈ Claude Code /code-review

Claude Code /review
    = 快速、只读地审查 GitHub PR

本文只讨论本地 CLI 与相关官方审查服务,不讨论 IDE 中普通的自然语言“帮我看看代码”。当前验证环境为 Codex CLI 0.146.0、Claude Code 2.1.207;Claude Code 2.1.218 之后的后台执行差异会单独标明。

先把审查范围说清楚

“Review 当前修改”并不天然对应某一条 git diff。一个完整工作树至少包含三类状态:

1
2
3
4
HEAD
├── staged:git diff --cached
├── unstaged:git diff
└── untracked:普通 git diff 看不到,需要从 git status 后读取文件

此外,PR 式审查通常关心的是 merge-base...HEAD,而不是开发者本地恰好存在的所有变化。因此,判断一个 review 命令是否符合预期,首先要确认它选择了哪种目标。

审查目标典型含义主要风险
当前工作树staged、unstaged、untracked可能混入尚未准备好的本地修改
相对基准分支从 merge base 到当前分支或工作树HEAD 与工作树作为右端时范围不同
指定 Commit该 Commit 引入的变化只看单次提交,可能缺少前后提交语境
GitHub PR平台记录的 PR diff通常看不到未推送的本地修改
自定义目标由自然语言或 ref range 指定范围依赖提示词和 Agent 自行判断

Codex:一个 Review Mode,四种目标

交互入口与终端入口

在交互会话中输入 /review 会打开选择器,提供四类目标:

  • 当前未提交修改
  • 相对某个基准分支的修改
  • 指定 Commit
  • 自定义审查要求

/review 后直接跟文字时,整段文字会变成自定义审查要求,而不会解析成 CLI flag。因此 /review --base main 不是可靠的参数写法。

需要明确指定范围时,应使用非交互命令:

1
2
3
4
codex review --uncommitted
codex review --base main
codex review --commit <sha>
codex review "重点检查并发安全"

--uncommitted--base--commit 和自定义 Prompt 是互斥目标,不能把原生范围与补充提示组合起来。

Codex 并不预先把统一 diff 注入模型

Review Target 主要用于生成审查提示词。Reviewer 随后进入同一个仓库,自行运行 Git 命令并读取上下文:

  • --uncommitted 明确要求覆盖 staged、unstaged 和 untracked。
  • --base main 先计算 merge base,再提示 reviewer 执行 git diff <merge-base>
  • --commit <sha> 提示 reviewer 检查该 Commit 引入的变化。
  • 自定义审查不附带原生 Git 范围。

这里有一个重要边界:git diff <merge-base> 的默认右端是当前工作树,不是 HEAD。因此 Codex 0.146.0 的 base review 可能同时看到当前分支已提交变化和 tracked 的 staged、unstaged 变化;untracked 仍需要 reviewer 额外发现。这与严格的 git diff <merge-base>...HEAD 并不完全相同。

“实现”和“审查”如何分开

Codex 的 Review Mode 会启动一个 one-shot reviewer 子会话:

flowchart LR
    A[主会话实现代码] --> B[选择 Review Target]
    B --> C[独立 reviewer 子会话]
    C --> D[自行读取 Git diff 与源码]
    D --> E[输出结构化 findings]
    E --> F[结果写回主会话]

这个 reviewer 使用专门的审查 system prompt,不继承实现阶段的完整对话历史,并被要求只报告明确、可操作、由本次变化引入的问题。输出包含优先级、文件位置、置信度和整体正确性。

这种隔离是上下文隔离,不是文件系统快照隔离。Reviewer 与实现会话仍共享实时工作树;审查过程中若代码发生变化,它可能看到新的状态。默认 prompt 也禁止直接生成修复,但这主要是行为约束,而不是另建只读副本。

Claude Code:按使用阶段拆成多个入口

/code-review:审查正在开发的 diff

/code-review 是 Claude Code 中最接近 Codex Review Mode 的入口:

1
/code-review [low|medium|high|xhigh|max|ultra] [--fix] [--comment] [target]

不指定 target 时,它审查当前分支领先 upstream 的 Commit,加上未提交修改。也可以指定文件、PR、分支或 ref range:

1
2
3
4
/code-review high
/code-review high main...HEAD
/code-review high 3572
/code-review high src/auth/

它与 Codex 的取舍不同:

  • 没有与 --uncommitted 完全同构的类型化参数;默认范围会把 ahead commits 和本地未提交变化放在一起。
  • target 更灵活,可以直接写 ref range、路径或 PR。
  • effort 从 lowmax 控制覆盖度与误报取舍;低档位偏向高置信度 findings,高档位会扩大搜索范围。
  • 默认只报告;--fix 会修改工作树,--comment 会把结果发为 PR 行内评论。

因此“review 默认不修改”与“review 功能绝不修改”是两回事。使用 --fix 后,它已经进入审查与实现合并的工作流。

/review [PR]:快速审查 GitHub PR

Claude Code 当前的 /review 专门面向 GitHub PR:

1
2
/review 3572
/review 3572 重点检查协议兼容性

不带 PR 编号时,它会列出开放 PR 供选择。它是本地会话中的快速、单轮、只读审查,不负责当前工作树。

这个命令曾在 Claude Code 2.1.1862.1.201 暂时复用 /code-review medium 的多 Agent 引擎,之后又恢复为 PR 单轮审查。因此,旧经验中“Claude /review 会检查本地改动”不能直接套到当前版本。

专项和深度入口

Claude Code 另外提供三个容易与本地 review 混淆的能力:

入口运行位置目标是否可能修改
/security-review本地会话当前分支相对 origin 默认分支的安全风险默认只报告
/code-review ultraAnthropic 云端 sandbox当前分支、指定 base 或 PR可与 --fix 组合
托管 Code ReviewAnthropic 云端 + GitHub AppGitHub PR发布行内评论,不替作者改代码

ultra 会启动多个 reviewer,并独立验证候选问题,适合重要变更合并前的深度检查。它通常需要 5~10 分钟,并可能额外消耗 usage credits。

托管 Code Review 是 Team/Enterprise 的独立服务,通过 PR 创建、Push 或 @claude review 触发。它支持根目录 REVIEW.md 作为最高优先级的审查专用规则;本地 /code-review 只遵循 CLAUDE.md,不会读取这个 REVIEW.md。两者虽然名字相似,但不是同一条执行链。

Claude Code 的上下文隔离有版本边界

官方文档说明,从 2.1.218 开始,本地 /code-review 默认作为后台 subagent 运行,拥有自己的 context window,结果完成后返回主会话。这时它与 Codex 的“实现者和 reviewer 分离”更接近。

当前本机版本 2.1.207 早于这一变化,review 仍在当前对话流程中前台执行。可以确认的是它会运行审查 workflow;不能把新版“后台独立 context window”的保证反推到这个版本。

两套设计的核心差异

维度CodexClaude Code
主入口/review当前改动用 /code-review,PR 用 /review
范围表达四种类型化 Review Targeteffort、flags 加灵活 target
只审未提交变化原生 --uncommitted默认范围包含未提交变化,也包含 ahead commits
基准分支原生 --base,内部计算 merge base建议显式传 main...HEAD 等 target
指定 Commit原生 --commit使用 ref range,如 SHA^..SHA
自定义要求Custom Target,但不能与原生范围组合target 更自由,PR /review 也能附加文字
审查上下文固定启动 one-shot reviewer2.1.218+ 默认后台 subagent;旧版本不同
自动修复Review Mode 默认禁止修复/code-review --fix 原生支持
PR 行内评论需要后续流程/code-review --comment 原生支持
云端深度审查本地 Review Mode 本身没有同构层级/code-review ultra

Codex 的设计重点是稳定的审查边界和统一输出契约;Claude Code 的设计重点是按工作阶段提供不同强度、不同运行位置和不同副作用的工作流

场景化选择

当前只改了工作树,尚未提交

Codex 有最明确的范围:

1
codex review --uncommitted

Claude Code 可以运行:

1
/code-review high

但要记住,它还会包含当前分支领先 upstream 的 Commit。如果必须严格只看未提交变化,应先确认分支状态,或者明确要求以 HEAD 为基线,而不能假设存在等价的 --uncommitted flag。

提 PR 前审查整个分支

1
codex review --base main
1
/code-review high main...HEAD

Claude Code 的显式 ref range 更接近标准 PR diff;Codex 当前 base prompt 的右端是工作树,需要留意本地 tracked 修改是否被带入。

审查别人提交的 PR

1
/review 3572

这是 Claude Code /review 最自然的场景。需要更深覆盖时使用:

1
2
/code-review max 3572
/code-review ultra 3572

审查后仍由自己决定是否修复

不要添加 Claude Code 的 --fix。先拿到 findings,再在主会话逐项判断。这样才能真正保留“实现”和“审查”两个阶段,而不是把 review 变成自动重写。

易混点与复习索引

  1. Claude Code /review 不是 Codex /review 的同名对应物;前者当前面向 PR。
  2. Claude Code /code-review 才是本地开发阶段的主要审查入口。
  3. “当前修改”不是一条统一 git diff;untracked 必须单独发现。
  4. Codex base review 的 git diff <merge-base> 会以工作树为右端,不等于严格的 <merge-base>...HEAD
  5. Codex Review Mode 固定切换到独立 reviewer,但共享实时文件系统。
  6. Claude Code --fix 会打破纯审查边界;后台 review 的修改还可能不在主会话 checkpoint 内。
  7. Claude Code 2.1.218+ 才明确将本地 /code-review 默认放入独立后台 context;本机 2.1.207 不能套用这一保证。
  8. 托管 Code Review 的 REVIEW.md 不适用于本地 /code-review

参考资料

本文由作者按照 CC BY 4.0 进行授权