Codex 的 code review 太浅:6 个模板化原因 + 让 review 真有用

「考虑下错误处理」「补一下测试」——任何 PR 都能套上的话——用 file:line 锚定的具体问题修。

你让 Codex review 一个 PR。它给了 8 条 code-review 模板话:「考虑下错误处理」「补 edge case 测试」「线程安全?」「注意 null 输入」。这种话 2018 年 AI 读不懂代码时还有用,现在没用——你按它没法动手,也看不出 Codex 到底打开过那些被改的文件没。

浅 review 几乎都是模糊 prompt 导致的。「review 这个 PR」触发模型默认的”总结模式”;具体问题 + file:line 锚定才能换来具体答案。下面六个 prompt 模板能产出值得读的 review。

常见原因

按命中率从高到低:

1. Prompt 就是「review 这个 PR」没标准

泛 prompt → 泛 review。Codex 套模板,因为没东西告诉它「在这段具体代码里找什么」。

如何判断:回看 prompt——没指明维度(security / perf / correctness / API contract)或具体关切,就是套模板。

2. Codex 看 diff 没读完整文件

光 diff 缺上下文——3 行改动可能正确也可能灾难,取决于函数其他部分。不读整文件,review 只能评论 diff 显示的那几行。

如何判断:review 评论只引 diff 里的行,不涉及周围上下文——Codex 漏了大图景。

3. PR 太大、Codex 抽样了

1500 行 PR 超上下文。Codex 前几个文件细读,后面的抽样或摘要。前面文件评论密、后面稀。

如何判断:每文件评论密度不均——前 3 个有具体反馈、后 7 个一人一句泛话。

4. Codex 用了”安全的 reviewer 嗓音”

没锚定时 Codex 退回到”非承诺”措辞:「考虑」「你也许想」「注意」——既不指出确定问题、也不可被反驳。

如何判断:数「考虑」「也许」「可能」的次数——多就是 hedging 模式,不是真 review。

5. 没给 threat model / 上下文

Codex 不知道 PR 在支付路径。它当通用 CRUD review——具体关切(幂等、竞态、欺诈面)不会出现,因为没东西告诉 Codex 这是高风险代码。

如何判断:review 该提的 domain 风险一个没提——明明在那种代码里。

6. Review prompt 一次问太多

「review correctness + security + perf + style + a11y」——每个维度都浅一遍——它努力照顾全维度反而每个都浅。

如何判断:review 触及很多维度但每个都不深。

最短修复路径

按收益从高到低,Step 1 一步带来 80% 的深度提升。

Step 1:把「review 这个 PR」换成聚焦问题

模板:

按 [具体关切] review 这个 PR。

每条问题:
- file:line(必填——不接受泛话评论)
- 一句话问题描述
- 一句话修法
- 严重度(P0 阻塞 / P1 merge 前 / P2 follow-up)

不要评论 style / 格式 / 其他 ESLint 能 catch 的东西。
不要写「考虑 X」——要么标 X 为问题,要么不提。

「不要考虑 X」这条最关键——堵掉 hedging 退路。

Step 2:一次 review 只问一个问题

不要打包维度,独立跑:

Pass 1:「按 correctness review。是否有任何合法输入会得到错误结果?」

Pass 2:「按 null/undefined 处理 review。列出每处新代码在没检 null 前就 deref。」

Pass 3:「按 API 合同变化 review。这个 PR 是否改了任何 public 签名 / 行为?」

每 pass 都比一次大杂烩深。

Step 3:前置 context

Context:这个 PR 在支付路径,~10K 笔/天。
我们关心:
- 幂等(同一请求两次不能双扣)
- 竞态(两个并行 webhook 更新同一订单)
- 审计(每次状态变更必须 log 谁 / 何时 / 从什么状态)

仅按这些关切 review,其他维度不管。

Domain context 让通用 review 升级成 domain review。

Step 4:对抗式 framing

试试把这段代码打挂:
- `processPayment(req)` 能收到的最坏输入是什么?
- 最坏的并发时序(race condition)是什么?
- 什么状态会让这个函数违反前置/后置条件?

每条给出 输入 + 期待 vs 实际 行为。

对抗式问题逼 Codex 从”看着合理”切到”找失败”模式。

Step 5:抽查校准

不要全盘信。挑 2 条评论核实:

review 声称:"billing.ts:42 有 read 和 update 之间的竞态。"
打开 billing.ts:42 读周围代码,自己判断。

抽查通过——其他评论可信度高。抽查不通过(“42 行什么都没有”)——是幻觉,重 prompt。

Step 6:没 file:line 锚的评论直接拒

Codex 出「考虑下错误处理」没行号,推回去:

「考虑下错误处理」不可执行。每条问题必须:
- 具体 file:line
- 出问题的精确代码行
- 什么输入触发什么错误

按这些约束重 review,锚不上的条删掉。

这是给 session 训练——后续 review 会保持具体。

预防建议

  • 维护一个 review prompts 目录,每个关切一份(security / perf / correctness)
  • 始终前置 domain context(这是支付 / auth / 内部工具)
  • 强制 file:line + severity,缺一即拒
  • 跑多个窄 review pass,不要一次大杂烩
  • 每份 review 抽查 2 条校准信任
  • 重要 PR 上 AI review 是补充,不是替代——人工 review 不能省

相关阅读

标签: #Codex #Coding Agent #排查 #排查 #Review 太浅