
🎯 学什么:用 OpenAI Codex CLI 作为独立的"第二审查者"。不是替代 Claude,而是在 Claude 的基础上获得不同模型的视角——每个模型有自己的盲点,交叉验证降低确认偏误。核心洞察:(1) 分歧比共识更有价值——两个模型都同意的,大概率是对的;两个模型分歧的,最值得人工认真看一下;(2) 单模型审查的风险是确认偏误——模型 A 认为"明显 OK"的,模型 B 可能发现严重问题;(3) 跨模型审查的局限:两个模型可能共享同样的训练数据偏差,都"认为"某个过时方案是标准做法——所以最终决定权在人类。 💡 难易度:⭐⭐⭐ | ⏱️ 预计时间:30 分钟
[!quote]- 📖 原Skill精要 技能名称:codex 核心功能:OpenAI Codex CLI 封装——三种模式。代码审查:通过 codex review 进行独立 diff 审查。挑战模式:对抗模式,尝试攻破你的代码。咨询模式:向 Codex 提问,支持会话连续性跟进。 所属体系:gstack 虚拟工程团队 协作关系:作为独立的外部审查者,与 [[L6-15-PR代码审查|review]]、[[L6-22-线上故障侦探|investigate]] 互补
1. 课程概览
💡 白话小课堂:这就像看医生——同一个症状,不同的医生可能看出不同的问题。每个 AI 模型都有自己的"思维模式"和"盲点"——Claude 在某类问题上更谨慎,GPT 在某类问题上更激进。用两个模型审查同一份代码,交叉验证——都同意的结论更可靠,分歧点最值得人工关注。
2. 为什么需要第二意见
Why Second Opinion?
每个 AI 模型都有自己的"思维模式"和"盲点":
→ Claude 在某类问题上更谨慎 → GPT 在某类问题上更激进 → 不同模型在代码审查中有不同的关注点
单模型审查的风险: → 模型 A 认为"明显 OK"的,模型 B 可能发现严重问题 → 确认偏误:一个模型可能忽略自己不知道的盲区
codex 的价值: → 用不同的 AI 审查同一份代码/计划 → 交叉验证——两个模型都同意的结论更可靠 → 分歧点——两个模型意见不同的地方最值得人工关注
3. 使用方式
Usage
codex 通过 OpenAI Codex CLI 运行:
→ codex exec:让 Codex 执行代码分析 → codex review:让 Codex 审查代码/计划
典型工作流:
- Claude 完成代码编写或计划审查
- 调用 /codex 获取第二意见
- Codex 输出自己的分析
- 对比 Claude 和 Codex 的意见
- 在分歧点上做人工判断
Codex 的意见是参考,不是最终决定。 人类的判断仍然是最终权威。
4. 分歧分析
Analyzing Disagreements
当 Claude 和 Codex 意见不同时:
技术分歧
→ 可能反映不同的工程哲学 → 需要人工判断哪种哲学更适合当前场景 → 不是"谁对谁错",而是"哪个更适合"
风险感知分歧
→ 一个模型认为"高风险",另一个认为"低风险" → 通常需要更多上下文才能判断 → 宁愿过于谨慎也不要过于乐观
优先级分歧
→ 一个认为"A 最重要",另一个认为"B 最重要" → 可能两个都对——只是关注点不同 → 把两者的优先级合并往往是更好的方案
核心原则: 分歧不是问题——分歧是洞察的来源。 两个模型都同意的——大概率是对的。 两个模型分歧的——值得我认真看一下。
🔑 核心秘诀:分歧比共识更有价值。
5. 结构拆解:多模型交叉验证 Skill 模板
多模型交叉验证型 Skill 模板
核心特征
→ 管理对象 = 跨 AI 模型的代码/计划审查结果对比 → 核心原则 = 盲点互补 + 分歧即洞察 + 人类最终决策权 → 关键设计 = 三种模式 + 分歧三维分析 + 交叉验证降低确认偏误
通用结构
Three Modes(三种模式)
- codex review:独立 diff 审查(通过/不通过关口)
- challenge mode:对抗模式——尝试攻破你的代码
- consult mode:向 Codex 提问,会话连续性跟进
Workflow(工作流)
- Claude 审查 → Codex 第二意见 → 对比意见 → 人工判断分歧点
Disagreement Analysis(分歧分析)
- 技术分歧:不同工程哲学 → 选更适合的
- 风险感知分歧:一个高估一个低估 → 偏向谨慎
- 优先级分歧:关注点不同 → 合并两者的优先级
Limitations(局限性)
- 两模型可能共享训练数据偏差
- "AI 共识"只是参考,人类最终判断
- 过时方案被双方都认为是"标准做法"
6. 电商案例:Codex 第二意见——支付安全代码审查
🛒 实战案例:某电商平台的微信/支付宝支付回调模块完成了重构,代码文件
payment/gateway/callback.ts(327行),Claude单模型审查PASS无CRITICAL发现。CTO坚持用Codex做第二意见交叉验证——结果Codex发现了2个Claude遗漏的问题。
- Claude审查结论:签名验证逻辑使用
crypto.createHmac('sha256', key)算法正确,常量时间比较使用crypto.timingSafeEqual防时序攻击,签名验证完整(body+timestamp+nonce→signature)——总体PASS。- Codex发现#1 [P1]:nonce防重放检查仅在内存Map中存储(
const nonceCache = new Map()),一旦Node进程重启或被PM2重新拉起,nonce缓存全部清空,5分钟窗口内的重放攻击完全可行。Claude关注的是"代码逻辑是否正确"(逻辑上是对的),但忽略了系统级生命周期——进程重启=状态丢失=安全门禁失效。修复:nonce改为Redis存储SET nonce:{nonce} value EX 300 NX,原子操作+自动过期+进程无关。- Codex发现#2 [P2]:签名计算时对请求体使用了
JSON.stringify(req.body)而非req.rawBody。JSON.stringify会改变键顺序且在Node.js不同版本间可能产生不同空白符编码,而微信支付签名是基于原始请求体字节的。在99.9%的情况下两者一致,但在微信支付IPN回调的特定场景(含Unicode中文商品的Notify URL长度超过2048字符时Node.js的JSON编码行为有边缘差异),已经发生过生产环境偶现(概率约0.03%)的签名验证失败。修复:统一使用req.rawBody原始字节流计算签名。
分歧价值评估:两个模型都同意的——签名算法选择正确(SHA256 HMAC)、timingSafeEqual使用正确——这些高置信度无需再验证。两个模型分歧的nonce持久化和body序列化——恰恰是最有价值的部分,因为这些分歧暴露了Claude单模型的系统级盲区。单一模型审查的遗漏率约15%,其中30%属于这类"逻辑正确但系统边界考虑不足"的问题。
修复后回归:nonce改Redis后压测5000并发重放请求→零漏过。body改rawBody后回放历史3个月微信IPN回调日志→原偶现的0.03%签名失败率降至0%。
/codex re-review→PASS无新发现。
🔑 启示:多模型交叉验证的核心价值不是"让两个AI投票"——而是两个模型因为训练数据和方法论不同,天然会有不同的"视野盲区"。Codex在这个案例中补充的是系统级状态管理(进程生命周期),Claude擅长的是算法级正确性验证。两者合在一起才构成完整的安全审计。
7. 掌握检验
Q1:跨模型审查中,两个模型意见相同的点和意见分歧的点,哪个更有价值?
- A) 相同的点——因为共识意味着正确
- B) 分歧的点——因为分歧暴露隐藏问题和盲区
- C) 两者价值完全相同
- D) 都不重要,只有人类审查才有价值
Q2:在支付安全案例中,Claude 遗漏 nonce 持久化问题的根本原因是什么?
- A) Claude 不懂加密签名算法
- B) Claude 关注代码逻辑正确性,忽略了系统级边缘情况(进程重启 → 状态丢失)
- C) Claude 故意跳过这个问题以节省审查时间
- D) Codex 的错误信息更好
Q3:当两个模型意见分歧时,正确的处理策略是什么?
- A) 总是采纳更保守的一方
- B) 总是采纳第一个审查的模型
- C) 分歧点值得人工深入判断——不是"谁对谁错",而是"哪个更适合当前场景"
- D) 忽略所有分歧,只记录不采取行动
Q4:在支付安全案例中,分歧点 2(body 序列化问题)中 Codex 指出 JSON.stringify 可能改变键序和空格。虽然实际概率极低,但最终仍决定使用 req.rawBody。请分析:在安全代码中,为什么"极低概率但理论上可能"的问题仍然值得修复?
Q5:跨模型审查的局限是什么?在什么情况下,两个模型都同意但仍可能是错误的?请给出一个具体的场景。
8. 答案
点击查看答案
Q1:B —— 分歧比共识更有价值。
Q2:B —— Claude 审查代码逻辑层面是正确的,但忽略了"服务重启后内存 Map 清空"这个系统级边缘情况。
Q3:C —— 分歧不是判定谁对谁错,而是理解不同模型的"关注点差异"。
Q4:安全代码的原则是"消除不确定性"。即使 JSON.stringify 在绝大多数情况下产生的字节序列与原始请求体一致,但依赖"绝大多数"而非"确定"本身就是一个安全弱点。攻击者可能利用边缘情况构造一个 JSON.stringify 产生歧义的输入。安全代码要求"确定的行为",而非"大概没问题"。
Q5:局限:两个模型可能共享相同的训练数据偏差,都"认为"某个过时的方案是标准做法。例如——两个模型可能都推荐使用 JWT 存储敏感信息("因为很多教程这么做"),但实际上 JWT 的 payload 是 base64 编码而非加密,不适合存储敏感数据。两个模型都同意不代表正确——它们可能共享同样的盲区(训练数据中该错误模式普遍存在)。
(4/5 通过)
9. 延伸阅读
- [[L6-09-设计系统咨询|下一课:设计系统咨询 —— 从零搭建专业级设计语言体系]]

评论区
共 0 条评论