Codex 失败案例复盘:为什么 AI 改坏代码,以及如何设计验收流程

"OpenAI Codex best practices emphasize clear goals, context, constraints, done criteria, testing, checks, and review for coding tasks."
git diff --stat 里突然出现了 18 个文件,而你给 Codex 的任务只是”修一个按钮的状态”。CI 全是绿的,但打开 diff,coverageThreshold 被调低了,一个 flaky test 被 skip 了,还有一个 validateEmail() helper 是重复生成的,仓库里已经有 emailSchema。
这不是 Codex 故意改坏代码,而是任务边界太宽、验收流程太松。本文不讨论”AI 是否可靠”,而是提供工程化的失败模式识别表、验收流程门禁、回滚与复盘流程,帮助你建立”失败不是意外,而是流程缺口”的认知。
失败模式识别表:AI 改坏代码的常见表现
arXiv 对 GitHub 上 33k agent-authored PR 的研究发现,未合并的 PR 往往改动更大、涉及更多文件,且更常不通过项目的 CI/CD 验证。这不是因为 AI agent 智力不够,而是任务拆分、验收流程和 reviewer engagement 都有问题。
以下是 9 种常见失败模式,每种都配了具体判断信号和第一反应:
| 模式 | 表现 | 判断信号 | 第一反应 |
|---|---|---|---|
| diff 太大 | 改动范围远超预期 | git diff --stat 显示改动文件数远超任务描述(如”修按钮”却出现 10+ 文件) | 先看 file list,确认哪些是预期改动,哪些是越权;越权改动必须拆任务或 revert |
| 测试假绿 | 测试通过但逻辑有错 | diff 里出现 coverageThreshold 被调低、flaky test 被 skip、或测试断言被放宽 | 检查测试配置是否被改;要求新增测试能证明 pre-change 会失败 |
| 改错目录 | 误删 CI 配置、改了不该改的文件 | diff 里出现 .github/workflows/、Makefile、package.json scripts 被改,但任务无关 | 检查 AGENTS.md 是否明确禁止改 CI/config;revert 后写回规则 |
| 重复代码 | 生成已存在的 helper/util | diff 里出现新 helper,但仓库里已有相同功能的文件/函数 | 搜索项目是否已有类似实现;如果是重复,revert 并告知 Codex 使用已有实现 |
| PR 太大 | 无计划的大 PR | PR body 只有”fix issue”,没有 implementation plan、验证命令、回滚说明 | 要求拆成多个小 PR,每个都能独立回滚和验收 |
| CI 弱化 | 改 CI 配置让检查通过 | diff 里出现 CI 配置被改,CI 失败却只改 test/CI 配置,没有改业务代码 | 这是阻塞信号;revert CI 改动,要求业务代码修复 |
| 隐藏业务错误 | 逻辑正确但业务约束未遵守 | diff 里删除了某些业务约束(如权限检查、数据校验),但测试没有覆盖这些场景 | 追踪一条关键路径,检查是否有隐藏的副作用;要求 reviewer 明确 approve |
| untrusted input | 未验证的外部输入 | Codex 直接使用用户提供的数据/路径,没有 sanitization 或 validation | 检查是否有 input validation;如果没有,要求补 validation 测试 |
| 无计划大改动 | 没有先 plan 就开始实现 | Codex 直接改代码,没有先列出要改的文件、禁改的文件、验证命令 | 要求先 /plan 或明确 goal/context/constraints/done when,再实现 |
这些模式不是孤立的。一个”diff 太大”的 PR,很可能同时混着”改错目录”、“重复代码”和”测试假绿”。GitHub Blog 的 agent PR review checklist 也指出,CI gaming、代码复用盲区、隐藏业务错误、无计划大 PR 是 agent-generated PR 的常见红旗。
第一反应的核心原则是:不要只看 CI 绿不绿,先看 diff 范围和可回滚粒度。
任务拆分决策流程:大任务不是不能交给 Codex
OpenAI 的 Best practices 明确建议:复杂或模糊的任务适合先 plan,再进入实现。Codex 在能验证工作的情况下输出质量更高,复杂工作应拆成更小、更聚焦的步骤;小任务更容易测试和 review。
但”拆小”不是绝对承诺。拆到什么粒度,取决于每一步能否独立验收和回滚。
七步闭环:从 scope 到 update rules
以下是完整的任务拆分与验收闭环:
scope -> plan -> patch -> verify -> review -> merge/rollback -> update rules
每一步都有判断问题和退回条件。
1. scope(定义任务边界)
判断问题:
- 任务是否足够具体,能写成一个 goal + context + constraints + done when?
- 任务是否涉及多个子系统(如同时改 auth、payment、notification)?
- 任务是否会影响 CI 配置、数据库 schema 或外部依赖?
退回条件:如果任务涉及多个子系统或影响 CI/config,必须拆成多个子任务。
2. plan(先列计划)
判断问题:
- Codex 是否先列出了要改的文件、禁改的文件、验证命令?
- plan 是否明确风险点和退出条件?
- plan 是否给出了 rollback 路径?
退回条件:如果没有 plan 或 plan 不包含以上内容,要求重新 /plan。
3. patch(生成改动)
判断问题:
git diff --stat是否与 plan 预期的文件一致?- 是否有越权改动(改了 CI/config/不该改的文件)?
- 是否有重复代码(生成已存在的 helper)?
退回条件:如果 diff 与 plan 不一致或命中红旗,退回 step 2 重新 plan。
4. verify(验证改动)
判断问题:
- 是否新增测试且覆盖核心路径?
- 测试是否证明 pre-change 会失败?
- CI status checks 是否为 required 且非 skipped?
- lint/pre-commit 是否通过?
退回条件:如果没有新增测试或测试假绿(改测试配置让测试通过),退回 step 3 重新 patch。
5. review(人工审查)
判断问题:
- diff 范围是否与预期一致?
- 是否追踪了一条关键路径?
- reviewer 是否明确 approve(不是 AI 自报完成)?
- 是否有 branch protection 要求的 required reviews/status checks/conversation resolution?
退回条件:如果 reviewer request changes 或发现红旗,退回 step 3 重新 patch。
6. merge/rollback(合并或回滚)
判断问题:
- 是否满足所有验收证据(见下一章)?
- 是否能独立回滚(hunk/file 级)?
- 是否有 worktree 隔离(失败可丢弃,成功再进 PR)?
退回条件:如果不满足验收证据或不能独立回滚,rollback 并退回 step 1 重新 scope。
7. update rules(沉淀规则)
判断问题:
- 失败是否来自 AGENTS.md 规则缺失(如”禁止改 CI 配置”、“改动超过 5 个文件必须拆任务”)?
- 是否需要写回 AGENTS.md 的禁止项、验收标准或 rollback 路径?
行动:如果失败来自规则缺失,写回 AGENTS.md。
大任务不是不能交给 Codex
大重构任务不是不能交给 Codex,而是必须拆到每一步都能独立回滚。AI 重构 10000 行的经验也表明,小步快跑、测试安全网是关键。
判断是否拆得够细的标准:
- 每个 patch 是否能独立 revert(hunk/file 级)?
- 每个 verify 是否能证明 pre-change 会失败?
- 每个 merge 是否有明确的 reviewer approve 和 status checks?
如果答案是”不能”,任务还没拆够。
Codex review pane 实用模块:验收不只是看测试
验收时,第一件事不是跑测试,而是看 diff 范围和可回滚粒度。Codex app 的 review pane 提供了三种视图切换和 hunk/file 级操作。
三种视图切换
review pane 反映 Git 仓库状态,不只显示 Codex 改动。会显示 Codex、用户和其他未提交改动。
| 视图 | 显示内容 | 适用场景 |
|---|---|---|
| uncommitted changes | 所有未提交改动(默认) | 验收 Codex 当前任务的改动范围 |
| all branch changes | 当前 branch 相对 base branch 的所有改动 | 验收整个任务链(多个 task 的累积改动) |
| last turn changes | 上一次 Codex turn 的改动 | 验收单次对话的改动,快速定位越权 |
验收时,先看 uncommitted changes,确认改动范围是否超出预期;再看 all branch changes,检查是否有上一个任务的遗留改动;最后看 last turn changes,确认 Codex 是否按 plan 执行。
inline comments 与 hunk/file 级操作
review pane 支持 inline comments,可以挂在具体 diff 行,并作为后续 Codex 修复的上下文。
操作级别:
- entire diff:stage/unstage/revert 整个 diff
- file:stage/unstage/revert 单个文件
- hunk:stage/unstage/revert 单个代码块(最小粒度)
验收时,如果发现越权改动(如误删 CI 配置),可以先 revert 该 hunk/file,而不是 revert 整个 diff。
PR context 加载
在 PR branch 且 GitHub access/gh auth login 可用时,review pane 可加载 PR context、review comments 和 changed files。这能让验收从”看本地 diff”升级到”看 PR diff + reviewer comments”。
易变事实提醒:UI/slash command 细节属易变事实,发稿前需重开官方页面确认。
验收的核心原则
验收不只是看测试,而是:
- 先看 diff 范围是否与 plan 一致
- 再看可回滚粒度(hunk/file 级是否足够)
- 最后看测试是否新增且覆盖核心路径
如果前两步都不满足,测试通过也不等于代码正确。
验收证据清单:测试通过不够
GitHub Docs 对 protected branches 的说明明确:required status checks 必须成功、skipped 或 neutral 后才能进入 protected branch。但 skipped 在 GitHub Actions 中被视为 success,可能不阻止合并。
这意味着”CI 绿”不等于”代码质量好”。验收需要一组证据,而不只是一个信号。
以下是完整的验收证据清单。
代码层面证据
- diff 范围与预期一致(无越权改动)
- 无重复代码(搜索项目是否已有类似实现)
- 无 CI/config 被误改(除非任务明确允许)
测试层面证据
- 新增测试且覆盖核心路径
- 测试能证明 pre-change 会失败(不是只测 post-change)
- 测试配置未被放宽(无 coverageThreshold 调低、skip、断言放宽)
CI层面证据
- lint/pre-commit 通过
- CI status checks 为 required 且非 skipped
- 无 CI 配置被改让检查通过
PR层面证据
- PR body 有 implementation plan、验证命令、回滚说明
- 人工 reviewer 明确 approve(不是 AI 自报完成)
- branch protection 要求的 required reviews/status checks/conversation resolution
回滚层面证据
- 每个 patch 能独立 revert(hunk/file 级)
- worktree 隔离任务(失败可丢弃,成功再进 PR)
branch protection 与 status checks
GitHub Docs 对 protected branches 的要求:
- required reviews:指定数量的 reviewer approve 后才能 merge
- required status checks:必须通过、skipped 或 neutral 才能进入 protected branch
- conversation resolution:所有对话必须 resolved 才能 merge
这些是机器外的合并门禁,不是 AI 自报完成就能合并。
验收顺序
验收应按以下顺序:
- 先看 diff 范围(file list 和 diff size)
- 再看 CI/test config 是否被改
- 再看测试是否新增且覆盖核心路径
- 最后看 reviewer 是否明确 approve
不要把顺序倒过来。先看测试,很容易漏掉越权改动和 CI 弱化。
回滚与复盘流程:改坏后怎么处理
验收发现越权改动或测试假绿后,第一反应是回滚,而不是继续让 Codex 修。
回滚粒度:从 hunk 到 branch
根据改动范围和失败原因,选择合适的回滚粒度:
| 粒度 | 适用场景 | 操作 |
|---|---|---|
| hunk 级 revert | 单个代码块有越权改动(如误删 CI 配置) | review pane 选择该 hunk -> revert |
| file 级 revert | 整个文件有重复代码或越权改动 | review pane 选择该 file -> revert |
| branch 丢弃 | 整个任务方向错误,多个文件都需要回滚 | git checkout main -> 删除 branch |
选择原则:优先用最小粒度回滚。只有当多个 hunk/file 都有问题时,才考虑 branch 丢弃。
worktree 隔离:失败可丢弃
Codex Worktree 实战(同系列已讲)的思路是:用 worktree 隔离并行任务,失败可丢弃,成功再进 PR。
如果一个任务在 worktree 里改坏了,直接删掉 worktree,不影响主工作区。这比在同一个 branch 上反复 revert 更安全。
失败复盘后的行动:写回 AGENTS.md
回滚后,需要判断失败是否来自规则缺失。如果是,写回 AGENTS.md。
判断失败是否适合写回 AGENTS.md:
- 失败是否来自项目约定缺失(如”禁止改 CI 配置”、“改动超过 5 个文件必须拆任务”)?
- 失败是否来自验收标准缺失(如”测试必须证明 pre-change 会失败”)?
- 失败是否来自 rollback 路径缺失(如”每个 patch 必须能独立 revert”)?
如果是,写回 AGENTS.md 的对应位置(见下一章)。
失败复盘后的行动:写成 Skill
判断失败是否适合写成 Skill:
- 失败是否来自 Codex 能力边界(如无法理解某个业务约束)?
- 失败是否来自复杂的多步骤流程(如需要多个 agent 协作)?
- 失败是否来自需要反复执行的验收流程(如每次都要检查 diff 范围、CI config、测试新增)?
如果是,写成 Skill(见同系列 Codex Skills/plugins)。
AGENTS.md 沉淀位置:规则写在哪里
Codex 每次 run/session 开始前构建 instruction chain,读取全局和项目 AGENTS.md。项目层从 Git root 到当前目录逐层读取;更近目录的指导更具体。
这意味着 AGENTS.md 可以写在项目根目录、子模块目录或具体功能目录。Codex 会按距离当前工作目录的远近,优先使用更具体的规则。
AGENTS.md 的典型位置与内容
Codex 完整入门指南(同系列已讲 AGENTS.md 模板)的典型位置:
| 位置 | 典型内容 | 示例片段 |
|---|---|---|
| repo root | repo layout、build/test/lint commands、engineering conventions | 项目结构:src/frontend、src/backend、src/shared;构建:npm run build;测试:npm test;lint:npm run lint |
| src/frontend | frontend-specific conventions、PR expectations | frontend 只用 React hooks,不用 class component;PR 必须包含 Storybook story |
| src/backend | backend-specific conventions、do-not rules | backend 禁止直接操作数据库,必须通过 ORM;禁止在 controller 里写 SQL |
| src/shared | shared utilities conventions | shared 只放纯函数,不放有副作用的代码 |
失败经验写回 AGENTS.md 的位置
失败复盘后,应根据失败原因写回对应位置:
| 失败原因 | 写回位置 | 示例片段 |
|---|---|---|
| 误删 CI 配置 | repo root -> PR expectations -> do-not rules | 禁止修改 .github/workflows/、Makefile、package.json scripts,除非任务明确允许 |
| 改动超过 5 个文件 | repo root -> PR expectations -> do-not rules | 改动超过 5 个文件必须拆任务,每个任务不超过 3 个文件 |
| 测试假绿 | repo root -> what done means | 测试必须新增且覆盖核心路径;测试必须证明 pre-change 会失败,不能只测 post-change |
| 重复代码 | repo root -> engineering conventions | 改动前搜索项目是否已有类似实现;如果已有,使用已有实现,不要重复生成 |
| 无计划大改动 | repo root -> PR expectations | 改动超过 3 个文件必须先 /plan,列出要改的文件、禁改的文件、验证命令 |
| untrusted input | src/backend -> engineering conventions | 所有用户输入必须 validation,禁止直接使用用户提供的数据/路径 |
| 隐藏业务错误 | src/backend -> engineering conventions | 改动权限检查、数据校验后,必须追踪一条关键路径,检查是否有副作用 |
规则发现机制:更近目录优先
OpenAI 的 AGENTS.md 文档明确:项目层从 Git root 到当前目录逐层读取;更近目录的指导更具体。
这意味着:
- repo root 的 AGENTS.md 写通用规则(如 build/test/lint commands、禁止改 CI)
- 子模块目录的 AGENTS.md 写具体规则(如 frontend 只用 hooks、backend 禁止 SQL)
- 功能目录的 AGENTS.md 写最具体的规则(如某个 API 的业务约束)
失败复盘时,判断规则应该写在哪里:
- 如果是全局约定(如禁止改 CI),写 repo root
- 如果是子模块约定(如 frontend conventions),写 src/frontend
- 如果是具体功能约定(如某个 API 的业务约束),写 src/backend/api/xxx
AGENTS.md 的边界
AGENTS.md 只能降低越权和误操作风险,不能证明代码正确。Codex 仍然可能遵循 AGENTS.md 规则,但逻辑有错。
验收流程的最后一环是人工 reviewer 明确 approve,而不是 AGENTS.md 规则就能保证质量。
人审 AI PR 的红旗清单:reviewer 看什么
GitHub Blog 对 agent-generated PR 的 review 建议:先看 file list 和 diff size,检查 CI/test config 是否被改,搜索新 helper 是否重复,追踪一条关键路径,要求能证明 pre-change 会失败的新测试。
以下是完整的红旗清单:
代码层面红旗
- file list 和 diff size 远超任务描述
- CI/test config 被改(
.github/workflows/、Makefile、package.jsonscripts) - 新 helper 与已存在 helper 重复
- PR body 只有”fix issue”,没有 implementation plan、验证命令、回滚说明
- 大 PR(改动超过 10 个文件)
测试层面红旗
- 没有新增测试
- 测试只测 post-change,不能证明 pre-change 会失败
- 测试配置被放宽(coverageThreshold 被调低、flaky test 被 skip、断言放宽)
CI层面红旗
- CI 失败却只改 test/CI 配置,没有改业务代码
- CI status checks 被 skipped 或 neutral,而不是 passing
- CI 配置被改让检查通过
PR层面红旗
- 空 PR body
- 无 implementation plan
- 无 reviewer approve(只有 AI 自报完成)
- 无 conversation resolution
阻塞信号 vs 拆小信号
| 类型 | 红旗 | 处理 |
|---|---|---|
| 阻塞信号 | CI 失败却只改 test/CI 配置 | request changes,revert CI 改动,要求业务代码修复 |
| 阻塞信号 | 测试假绿(coverageThreshold 被调低、skip) | request changes,revert 测试配置改动,要求新增测试 |
| 阻塞信号 | untrusted input(未验证的外部输入) | request changes,要求补 validation 测试 |
| 拆小信号 | 大 PR(改动超过 10 个文件) | request changes,要求拆成多个小 PR |
| 拆小信号 | 空 PR body、无 implementation plan | request changes,要求补 plan、验证命令、回滚说明 |
reviewer 的核心原则
reviewer 看的不是”AI 是否可靠”,而是:
- diff 范围是否与任务描述一致
- CI/test config 是否被改
- 测试是否新增且覆盖核心路径
- 是否有隐藏的副作用(追踪一条关键路径)
不要把顺序倒过来。先看测试,很容易漏掉 CI 弱化和越权改动。
结论
Codex 改坏代码,不是因为它”不可靠”,而是任务边界太宽、验收流程太松。本文提供的是一套工程化的清单:
- 失败模式识别表:判断 Codex 改坏代码的常见表现
- 七步闭环:从 scope 到 update rules 的完整验收流程
- review pane 实用模块:验收不只是看测试,先看 diff 范围和可回滚粒度
- 验收证据清单:测试通过不够,还需要 diff 范围、测试新增、CI status checks、人工 reviewer approve、branch protection
- 回滚与复盘流程:hunk/file 级 revert、worktree 隔离、写回 AGENTS.md 或 Skill
- AGENTS.md 沉淀位置:规则写在 repo root、子模块目录或功能目录
- 人审红旗清单:先看 file list 和 diff size,再看 CI/test config,再看测试新增,最后看 reviewer approve
把这些清单打印成 checklist,贴在显示器旁边。每次验收 Codex 改动时,按清单逐项检查。如果反复出现某些验收流程,考虑把它沉淀成 Skill(见同系列 Codex Skills/plugins)。
失败不是意外,而是流程缺口。
下一步与延伸阅读
已发布文章
- AI 重构 10000 行:真实项目复盘与测试安全网 — 小步快跑、测试安全网的实战经验
- Cursor 重构指南 — 其他 AI coding 工具同样适用的验收原则
- GitHub Actions CI workflow — status checks 基础
- GitHub Actions workflow — PR workflow 基础
- Codex Cloud agent 工作流 — 远程执行、PR 验收与持续任务闭环
同系列文章(Codex 实战指南)
- Codex 完整入门指南 — CLI、IDE、Cloud、桌面端入口
- Codex 安全与权限 — sandbox/approval 降低风险
- Codex 代码审查 — review 作为验收门禁之一
- Codex 自动化任务 — exec 生成 patch 后仍需人审
- Codex Worktree 实战 — 隔离并行任务
- Codex Skills/plugins — 把验收流程沉淀成 skill(下一步)
- Codex 测试驱动开发 — TDD + Codex
- Codex 成本优化
- Codex 企业落地
设计一条 Codex 改动验收流程
把 Codex 任务拆到可以独立验证和回滚,并用 diff、测试、CI、review 与规则沉淀完成闭环。
⏱️ 预计耗时: 45 分钟
- 1
步骤 1: 写清任务边界
在 prompt 或 AGENTS.md 中写明 goal、context、constraints 和 done when,尤其是可改文件、禁改目录和验收命令。 - 2
步骤 2: 要求 Codex 先 plan
让 Codex 先列预计文件范围、不动范围、验证命令、风险和回滚方式;计划不完整时不要进入实现。 - 3
步骤 3: 把任务拆到可回滚
大任务按行为、模块、测试和迁移步骤拆开,每一步都应能单独 revert。 - 4
步骤 4: 审查 diff 范围
先看 git diff --stat、file list、last turn changes 和 all branch changes,确认没有越权改动。 - 5
步骤 5: 运行相关验证
执行相关单测、构建、lint 或手工关键路径,并记录未跑命令的原因。 - 6
步骤 6: 检查 CI 是否被弱化
确认没有 skip、coverage threshold 调低、workflow trigger 改弱或 || true 这类假绿信号。 - 7
步骤 7: 经过人工 review
把 AI review 当辅助信号,最终仍看人工 reviewer、required status checks、branch protection 和 conversation resolution。 - 8
步骤 8: 失败后回滚并沉淀
根据问题粒度选择 hunk、file 或 branch 回滚,再把可判断的规则写回 AGENTS.md、checklist 或 skill。
常见问题
Codex 改坏代码最常见的原因是什么?
怎么设计 Codex 任务的验收流程?
Codex 适合做大重构吗?
Codex 说测试通过就可以合并吗?
AI 改坏代码后怎么回滚?
如何把失败经验写回 AGENTS.md?
哪些失败适合 AGENTS.md,哪些适合 Skill?
18 分钟阅读 · 发布于: 2026年7月27日 · 修改于: 2026年7月27日
Codex 实战专题:CLI、桌面 App、Cloud 与团队工作流
如果你是从搜索进入这篇文章,建议顺手补上上一篇或继续下一篇,这样更容易把同一主题读完整。
上一篇
Codex 安全边界实战:权限、沙箱、密钥泄露防护指南
从本地、Cloud 和 CI 三个场景梳理 Codex 安全边界:sandbox、approval、permission profile、依赖安装、Cloud secrets、GitHub Actions API key 和泄露处理清单。
第 8 / 10 篇
下一篇
Codex Skills 与 Plugin 实战:把团队流程固化成可复用能力
分清 AGENTS.md、Codex Skill、Plugin、MCP 和 Subagent 的职责,用代码审查流程拆一个最小 Skill,再判断什么时候升级成 role-specific plugin。
第 10 / 10 篇



评论
使用 GitHub 账号登录后即可评论