【笔记】Codex 与 Claude Code 的代码审查模型
一句话模型
AI 代码审查需要分开回答两个问题:
- 审查对象是什么:当前工作树、相对基准分支的差异、某个 Commit,还是 GitHub PR?
- 谁来审查:当前实现会话继续检查,还是启动拥有独立上下文的 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 从
low到max控制覆盖度与误报取舍;低档位偏向高置信度 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.186 至 2.1.201 暂时复用 /code-review medium 的多 Agent 引擎,之后又恢复为 PR 单轮审查。因此,旧经验中“Claude /review 会检查本地改动”不能直接套到当前版本。
专项和深度入口
Claude Code 另外提供三个容易与本地 review 混淆的能力:
| 入口 | 运行位置 | 目标 | 是否可能修改 |
|---|---|---|---|
/security-review | 本地会话 | 当前分支相对 origin 默认分支的安全风险 | 默认只报告 |
/code-review ultra | Anthropic 云端 sandbox | 当前分支、指定 base 或 PR | 可与 --fix 组合 |
| 托管 Code Review | Anthropic 云端 + GitHub App | GitHub 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”的保证反推到这个版本。
两套设计的核心差异
| 维度 | Codex | Claude Code |
|---|---|---|
| 主入口 | /review | 当前改动用 /code-review,PR 用 /review |
| 范围表达 | 四种类型化 Review Target | effort、flags 加灵活 target |
| 只审未提交变化 | 原生 --uncommitted | 默认范围包含未提交变化,也包含 ahead commits |
| 基准分支 | 原生 --base,内部计算 merge base | 建议显式传 main...HEAD 等 target |
| 指定 Commit | 原生 --commit | 使用 ref range,如 SHA^..SHA |
| 自定义要求 | Custom Target,但不能与原生范围组合 | target 更自由,PR /review 也能附加文字 |
| 审查上下文 | 固定启动 one-shot reviewer | 2.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 变成自动重写。
易混点与复习索引
- Claude Code
/review不是 Codex/review的同名对应物;前者当前面向 PR。 - Claude Code
/code-review才是本地开发阶段的主要审查入口。 - “当前修改”不是一条统一
git diff;untracked 必须单独发现。 - Codex base review 的
git diff <merge-base>会以工作树为右端,不等于严格的<merge-base>...HEAD。 - Codex Review Mode 固定切换到独立 reviewer,但共享实时文件系统。
- Claude Code
--fix会打破纯审查边界;后台 review 的修改还可能不在主会话 checkpoint 内。 - Claude Code
2.1.218+才明确将本地/code-review默认放入独立后台 context;本机2.1.207不能套用这一保证。 - 托管 Code Review 的
REVIEW.md不适用于本地/code-review。