🤖 AI 跟我学 新手入门

Codex PLANS.md 怎么写?长任务规划官方姿势

Codex PLANS.md 怎么写?OpenAI 官方主推的长任务规划文件,本文给出 5 节模板、3 个真实案例、5 个常见错例,让 2 小时任务不丢方向

发布 2026/05/19 📎 参考官方文档

30 秒了解:Codex PLANS.md 到底解决什么问题

Codex PLANS.md 是一份给 AI 看的「任务剧本」——把一个 2-5 小时的连续大任务拆成 10-30 个可勾选的小步骤,让 Codex 边做边打勾。 这是 OpenAI 官方在 cookbook 里专门用一整篇讲的「长任务模式」,也是 Codex 跟其他 AI 编程工具拉开差距的地方。

为什么需要 PLANS.md?因为「一句话甩给 AI 一个大任务」必败:

  • AI 上下文有限,做到一半忘了最初目标
  • 复杂任务很多隐性依赖,AI 一次性想不全
  • 出错时分不清「哪一步开始走偏」
  • 中途断了不知道从哪续

PLANS.md 把任务外化成可勾选的清单,相当于给 AI 一份「备忘录」+「进度条」。Codex 每完成一步打勾、把进度写回文件——你睡一觉起来看文件就知道做到哪。

这篇按 OpenAI cookbook 的 codex_exec_plans 文章 + 实战,给一份「Codex PLANS.md 5 节模板」+ 3 个真实案例。如果你还没用过 Codex CLI,先看 Codex CLI 怎么用

准备工作:什么任务该用 PLANS.md

不是所有任务都需要 PLANS.md。判断标准:

场景用 PLANS.md 吗
改一行代码、改一个文件❌ 过度工程
写一个新组件❌ 直接说就行
重构整个模块✅ 强烈推荐
升级框架版本(如 Next 13 → 15)✅ 必须
批量改 20+ 文件✅ 必须
新功能跨 5+ 文件✅ 推荐
调一个微妙 bug❌ 用 debug 模式
写一篇文档

经验值:预计 AI 干 30 分钟内能搞定的,不用 PLANS.md;超过 1 小时的,用 PLANS.md。

Codex PLANS.md 的标准 5 节模板

PLANS.md 不是越长越好,控制在 200-400 行最合理。标准 5 节结构:

# 任务标题(一句话说清要做什么)

## 1. 总体目标

- 改造范围:[具体到目录或文件]
- 不变事项:[必须保持的接口/行为/约定]
- 完成标准:[3-5 条可验证的标准]

## 2. 背景上下文(给 AI 看的)

- 这个项目用什么栈
- 当前代码现状是什么
- 为什么要做这个改造
- 已知的坑和约束

## 3. 分步骤计划

### 阶段 1:[阶段名]
- [ ] 步骤 1.1:...
- [ ] 步骤 1.2:...

### 阶段 2:[阶段名]
- [ ] 步骤 2.1:...

(按你估的执行顺序,每步可独立验证)

## 4. 不要做的事

- ❌ 不要修改 X 文件
- ❌ 不要重命名 Y 变量
- ❌ 不要顺手优化无关代码

## 5. 出错时怎么办

- 如果某步测试挂 → 停下来,把报错贴给我,不要自己继续
- 如果不确定怎么改 → 在 PLANS.md 加 [BLOCKED] 标签等我看
- 如果上下文要满 → 在文件末尾写交接简报

第 1 步:让 Codex 帮你起草 PLANS.md

不用自己一行行写。让 Codex 基于你的任务描述起草:

📋 Prompt 模板

任务:起草一份 PLANS.md 给我们接下来的长任务用

任务全貌:把 src/api/v1/ 下所有 REST 端点改写为 GraphQL resolvers,迁到 src/graphql/,保持外部行为不变(同样的输入返回同样的输出)。

请按 PLANS.md 标准 5 节模板(总体目标 / 背景 / 分步骤 / 不要做的事 / 出错处理)起草。

在写之前先:

  1. 列出 src/api/v1/ 下所有 .ts 文件
  2. 估算 endpoint 数量
  3. 检查项目里是否已经有 GraphQL 相关依赖(grep package.json)
  4. 看完这些信息再起草 PLANS.md

起草完输出到根目录 PLANS.md。我会 review 后再说继续。

它扫描完你的项目、估算规模、产出一份初稿。你 review 一遍——重点改「分步骤」是不是合理、「不要做的事」是不是齐全。

第 2 步:让 Codex 按 PLANS.md 执行

PLANS.md 写好后,告诉 Codex 进入「执行模式」:

📋 Prompt 模板

PLANS.md 已经 review 过了,可以开始执行。

执行模式规则:

  1. 你的所有动作都按 PLANS.md 的分步骤来,不要跳步
  2. 每完成一步:
    • 跑相关测试验证
    • 在 PLANS.md 把对应 [ ] 改成 [x]
    • git commit 这一步的改动(commit message:「step N.M: …」)
  3. 每完成一个阶段:
    • 跑完整测试套件
    • 在 PLANS.md 对应阶段末尾加一行「阶段 N 完成 - YYYY-MM-DD HH:MM」
    • 总结这阶段干了啥(3-5 句)
  4. 任何意外(测试挂、改不动、不确定):
    • 立刻停
    • 在 PLANS.md 加 [BLOCKED: 描述] 标签
    • 把意外情况贴给我等指示
  5. 不要私自跳过任何步骤或顺手改 PLANS.md 之外的事

开始第一步:步骤 1.1。

这种「显式声明执行规则」的开场能让 Codex 进入有纪律的工作模式,不会乱跑。

第 3 步:人在中途的 review 节奏

PLANS.md 模式不是「丢给 AI 自己跑」,而是「AI 跑 + 人在关键节点 review」。建议节奏:

时间点你的动作
每个阶段结束review 阶段 commit + 看测试报告
每 30 分钟看 PLANS.md 进度条、看最近 commits
上下文用量 60-70%主动让 AI /compact
上下文用量 80%让 AI 写交接简报、/clear、续

不需要每步都盯,但「阶段边界」一定要看——这是质量出问题的临界点。

第 4 步:处理 PLANS.md 中的「BLOCKED」

执行中肯定会遇到 AI 卡住。它在 PLANS.md 加 [BLOCKED: ...] 标签的时候,你来:

📋 Prompt 模板

看到 PLANS.md 步骤 2.3 标了 [BLOCKED: src/api/v1/user.ts 用了未导出的内部类型 InternalUser,迁到 GraphQL 后这个类型该放哪]。

我的决定是:把 InternalUser 提到 src/types/internal.ts,所有 GraphQL resolver 共享 import。

请:

  1. 创建 src/types/internal.ts 包含 InternalUser 定义
  2. 把原 src/api/v1/user.ts 里的定义删了,改成 import
  3. 在 PLANS.md 把 [BLOCKED: …] 改成 [RESOLVED: 提到 src/types/internal.ts]
  4. 跑测试确认绿
  5. 继续步骤 2.3

PLANS.md 的好处是「BLOCKED 留痕」——所有卡点都在文件里,将来 retro 复盘有据可查。

3 个真实 PLANS.md 案例

案例 1:Next.js 13 → 15 升级

# Next.js 13 → 15 升级

## 总体目标
- 把项目从 Next 13.5 升到 15.0
- 接口零破坏(所有 page / API route 行为不变)
- 完成标准:pnpm build 绿 + pnpm test 绿 + 关键页面手动 smoke 测试通过

## 分步骤计划

### 阶段 1:依赖升级
- [ ] 1.1 package.json 改 next 到 ^15.0.0
- [ ] 1.2 跑 pnpm install
- [ ] 1.3 跑 pnpm build,记录所有 error

### 阶段 2:处理 breaking changes
- [ ] 2.1 cookies() 改成 await cookies()
- [ ] 2.2 headers() 改成 await headers()
- [ ] 2.3 params 类型从 {x: string} 改成 Promise<{x: string}>

### 阶段 3:清理 warnings
- [ ] 3.1 跑 pnpm build 看 warnings
- [ ] 3.2 修每条 warning

### 阶段 4:手动 smoke 测试
- [ ] 4.1 跑 pnpm dev
- [ ] 4.2 测主页、登录、详情页 3 个核心路径

## 不要做的事
- 不要顺手升级其他依赖(除非 Next 强制要求)
- 不要重构组件
- 不要改样式

案例 2:批量国际化(i18n)

# 全站文案抽出做 i18n

## 总体目标
- 用 next-intl 把所有硬编码中文文案抽成 key
- 提供中英两种 locale
- 完成标准:grep -r "[一-龥]" src/ 只剩注释和测试

## 分步骤计划

### 阶段 1:基建
- [ ] 1.1 装 next-intl 配 middleware
- [ ] 1.2 建 messages/zh.json 和 messages/en.json

### 阶段 2:组件按文件夹批量改
- [ ] 2.1 components/auth/ - 5 个文件
- [ ] 2.2 components/dashboard/ - 12 个文件
- [ ] 2.3 components/settings/ - 8 个文件
- [ ] ... 

### 阶段 3:page 层
...

## 不要做的事
- 不要翻译(英文留 [TODO_EN_TRANSLATION],后面交翻译团队)
- 不要改文案本身(只是抽 key)

案例 3:API rate limiting

# 给所有 public API 加 rate limiting

## 总体目标
- 用 @upstash/ratelimit 给 src/app/api/public/ 下所有 route handler 加限流
- 默认 100 req/min/ip,可在配置文件覆盖
- 完成标准:每个 endpoint 测试覆盖「超过限制返回 429」

## 分步骤计划

### 阶段 1:基建
- [ ] 1.1 装 @upstash/ratelimit @upstash/redis
- [ ] 1.2 配 .env 加 UPSTASH_REDIS_REST_URL/TOKEN
- [ ] 1.3 写 lib/ratelimit.ts 提供 withRatelimit() helper

### 阶段 2:按端点批量加
- [ ] 2.1 src/app/api/public/search/route.ts
- [ ] 2.2 src/app/api/public/login/route.ts(这个限制更严,10/min)
- [ ] 2.3 ...

### 阶段 3:测试
- [ ] 3.1 给每个端点写「超限返回 429」的单测
- [ ] 3.2 跑 pnpm test 全绿

## 不要做的事
- 不要改业务逻辑
- 不要顺手加 CORS / auth 相关改造
- /api/internal/ 不需要加限流(内部网络)

5 个常见错例

错例 1:PLANS.md 太抽象

❌ 「步骤 1:重构 auth」 ✅ 「步骤 1.1:把 src/auth/login.ts 的 callback 改 async/await」「步骤 1.2:跑 auth 相关测试」

错例 2:步骤间依赖混乱

❌ 步骤 5 依赖步骤 3 的产出,但顺序写反了 ✅ 用「阶段」组织,阶段内步骤可并行/独立

错例 3:没写「不要做的事」

❌ 只写要做什么 ✅ 必须写禁区,否则 AI 顺手「优化」无关代码

错例 4:完成标准不可验证

❌ 「代码质量更好」「性能更好」 ✅ 「pnpm test 全绿」「构建产物体积小于 500KB」

错例 5:PLANS.md 写完不更新

❌ 起草完丢一边,AI 实际跑跟文件脱节 ✅ 每步打勾、每阶段总结、BLOCKED 留痕

常见坑 + 解决办法

现象原因解决
AI 不按 PLANS.md 顺序没明确「执行模式规则」用第 2 步那段 prompt 严格声明
AI 改了 PLANS.md「不要做的事」规则没写或没强调在 prompt 里再重复一次
进度文件没更新AI 偷懒每阶段结束让它「确认 PLANS.md 已更新」
上下文塞满中断长任务超过窗口Kimi Code 上下文管理 那篇的技巧
全部完成但测试还红中途某步没真验证PLANS.md 加「每步必须跑测试」硬性要求

Codex PLANS.md vs Claude Code 的对应做法

维度Codex PLANS.mdClaude Code
官方推荐✅ cookbook 专文⚠️ 社区自创
文件名PLANS.md用户自定义(常用 TASKS.md)
与 AGENTS.md 关系AGENTS.md 是项目持久记忆,PLANS.md 是单任务剧本CLAUDE.md vs 任务文件同理
适用场景2-5 小时长任务
思路完全通用完全通用

PLANS.md 思路本身跟工具无关——你在 Claude Code、Cursor、Cline 上都能用同一份模板。

下一步

常见问题

Q:PLANS.md 一定要叫这个名吗? A:不强制,但建议保留。OpenAI cookbook 用这个名字、社区也在传播这个约定,团队协作时少解释。叫 TASKS.md / ROADMAP.md 也行,但要在 AGENTS.md 里说明。

Q:PLANS.md 该 commit 到 git 吗? A:建议 commit。理由:1) 团队成员能看到 AI 在做啥;2) 任务做完后留作 retro 资料;3) 跨会话续任务有据可查。任务完成后可以归档到 docs/plans/ 子目录。

Q:一份 PLANS.md 能给多个 AI 工具用吗? A:能。PLANS.md 是纯 markdown 文本,Codex / Claude Code / Cursor 谁能读 markdown 谁就能用。但模型理解能力不同,PLANS.md 的明确程度要按最弱的那个调。

Q:AI 把 PLANS.md 越改越糟怎么办? A:在 prompt 加一条「修改 PLANS.md 必须先给我看 diff」。或者把 PLANS.md 锁住,只允许 AI 在「进度区」打勾、不允许改其他部分。

Q:跟普通的 TODO 注释比有啥优势? A:TODO 散在代码里、没有顺序、没有完成标准、不携带上下文。PLANS.md 是「一份完整执行计划」,给 AI 看的同时也给团队看,是文档+任务管理+AI 工具三合一。