切换主题

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

Easton editorial illustration: one raised charcoal terminal console with a small exec prompt, three compact output artifacts: changelog sheet, issue-tag stack, documentation checklist, one small lock gate leading to a separate patch or pull-request card

"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/Makefilepackage.json scripts 被改,但任务无关检查 AGENTS.md 是否明确禁止改 CI/config;revert 后写回规则
重复代码生成已存在的 helper/utildiff 里出现新 helper,但仓库里已有相同功能的文件/函数搜索项目是否已有类似实现;如果是重复,revert 并告知 Codex 使用已有实现
PR 太大无计划的大 PRPR 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 细节属易变事实,发稿前需重开官方页面确认。

验收的核心原则

验收不只是看测试,而是:

  1. 先看 diff 范围是否与 plan 一致
  2. 再看可回滚粒度(hunk/file 级是否足够)
  3. 最后看测试是否新增且覆盖核心路径

如果前两步都不满足,测试通过也不等于代码正确。

验收证据清单:测试通过不够

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 自报完成就能合并。

验收顺序

验收应按以下顺序:

  1. 先看 diff 范围(file list 和 diff size)
  2. 再看 CI/test config 是否被改
  3. 再看测试是否新增且覆盖核心路径
  4. 最后看 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 rootrepo layout、build/test/lint commands、engineering conventions项目结构:src/frontend、src/backend、src/shared;构建:npm run build;测试:npm test;lint:npm run lint
src/frontendfrontend-specific conventions、PR expectationsfrontend 只用 React hooks,不用 class component;PR 必须包含 Storybook story
src/backendbackend-specific conventions、do-not rulesbackend 禁止直接操作数据库,必须通过 ORM;禁止在 controller 里写 SQL
src/sharedshared utilities conventionsshared 只放纯函数,不放有副作用的代码

失败经验写回 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 inputsrc/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/Makefilepackage.json scripts)
  • 新 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 planrequest changes,要求补 plan、验证命令、回滚说明

reviewer 的核心原则

reviewer 看的不是”AI 是否可靠”,而是:

  1. diff 范围是否与任务描述一致
  2. CI/test config 是否被改
  3. 测试是否新增且覆盖核心路径
  4. 是否有隐藏的副作用(追踪一条关键路径)

不要把顺序倒过来。先看测试,很容易漏掉 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)。

失败不是意外,而是流程缺口。

下一步与延伸阅读

已发布文章

同系列文章(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

    步骤 1: 写清任务边界

    在 prompt 或 AGENTS.md 中写明 goal、context、constraints 和 done when,尤其是可改文件、禁改目录和验收命令。
  2. 2

    步骤 2: 要求 Codex 先 plan

    让 Codex 先列预计文件范围、不动范围、验证命令、风险和回滚方式;计划不完整时不要进入实现。
  3. 3

    步骤 3: 把任务拆到可回滚

    大任务按行为、模块、测试和迁移步骤拆开,每一步都应能单独 revert。
  4. 4

    步骤 4: 审查 diff 范围

    先看 git diff --stat、file list、last turn changes 和 all branch changes,确认没有越权改动。
  5. 5

    步骤 5: 运行相关验证

    执行相关单测、构建、lint 或手工关键路径,并记录未跑命令的原因。
  6. 6

    步骤 6: 检查 CI 是否被弱化

    确认没有 skip、coverage threshold 调低、workflow trigger 改弱或 || true 这类假绿信号。
  7. 7

    步骤 7: 经过人工 review

    把 AI review 当辅助信号,最终仍看人工 reviewer、required status checks、branch protection 和 conversation resolution。
  8. 8

    步骤 8: 失败后回滚并沉淀

    根据问题粒度选择 hunk、file 或 branch 回滚,再把可判断的规则写回 AGENTS.md、checklist 或 skill。

常见问题

Codex 改坏代码最常见的原因是什么?
Codex 改坏代码常见原因是任务边界太宽、上下文不准、验证命令缺失、测试覆盖不足或 review 缺位,而不是简单的“AI 不可靠”。
怎么设计 Codex 任务的验收流程?
验收流程应按 scope、plan、patch、verify、review、merge 或 rollback、update rules 七步执行,每一步都要有可检查证据和退回条件。
Codex 适合做大重构吗?
Codex 可以参与大重构,但不适合一次接收不可回滚的大包任务;应拆成能单独验证和回滚的小步骤。
Codex 说测试通过就可以合并吗?
不可以。测试通过只是验收证据之一,还需要检查 diff 范围、CI 配置、业务关键路径、PR review 和 branch protection。
AI 改坏代码后怎么回滚?
先判断问题粒度,小问题 revert hunk 或 file,方向错误则丢弃本轮 diff 或重开分支;不要在一团混乱 diff 上继续叠加修复。
如何把失败经验写回 AGENTS.md?
把失败原因改写成可执行规则,例如禁止改 CI、超过文件数必须拆任务、测试必须证明 pre-change 会失败,并放到最接近生效范围的 AGENTS.md。
哪些失败适合 AGENTS.md,哪些适合 Skill?
项目约定、禁改范围和验收标准适合写入 AGENTS.md;反复出现的多步骤验收流程、固定命令和报告格式更适合沉淀为 Skill。

18 分钟阅读 · 发布于: 2026年7月27日 · 修改于: 2026年7月27日

评论

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

Easton BlogEaston Blog