本页目标
本页不把“完成任务”理解成让 Codex 生成一段代码。 真正的完成,是从需求开始,到可运行结果结束的一个闭环。 这个闭环包含以下动作:- 明确一个足够小、可以运行的项目。
- 在正确目录启动 Codex。
- 先让 Codex 只读探索,不急着修改。
- 用提示词四件套说清目标、范围、约束和验证。
- 查看即将执行的命令,并处理审批请求。
- 审查工作区中的 diff。
- 运行测试和手工验收。
- 故意制造一次失败,练习定位和修复。
- 解释结果、记录证据,并保留回滚路径。
本页示例中的界面文字、审批按钮和 Codex 默认策略可能随版本变化。命令行为以本机 codex --help、子命令帮助和当前官方文档为准。
贯穿案例
我们要做一个名为todo-codex-demo 的小项目。
它的第一版需求如下:
- 用户可以添加一条待办事项。
- 用户可以列出当前待办事项。
- 用户可以把待办事项标记为已完成。
- 数据暂时保存在本地 JSON 文件中。
- 不引入第三方依赖。
- 命令行错误要给出清晰提示。
- 修改后必须有自动化测试。
开始前的安全边界
先给这次练习定出明确的非目标。 以下内容不在本次任务范围内:- 不访问生产环境。
- 不读取真实客户数据。
- 不上传
.env、令牌或私钥。 - 不修改工作区之外的文件。
- 不安装依赖。
- 不提交或推送到远端。
- 不删除已有用户文件。
- 不进行大规模重构。
第一步:创建可运行项目
打开终端,先确认 Python 和 Git 可用。python3,将后文的 python 替换为 python3。
在练习目录中创建项目:
todo-codex-demo。
用 PowerShell 创建初始文件时,可以使用下面的命令:
todo.py,填入同样的内容。
先直接运行它:
## main,这同样正常。
第二步:先做只读探索
不要一上来就说“帮我把它做完”。 先让 Codex 只读理解当前项目。 在项目目录启动:read-only 或 Read Only。
不同版本的菜单名称可能不同,请以屏幕提示为准。
只读模式的目的,是让探索阶段不能写入文件。
然后输入第一条 Codex 消息:
- 当前已有
load_todos、save_todos、add_todo和list_todos。 - 数据保存在当前目录的
todos.json。 - 每条数据至少有
id、title和done字段。 - 当前
__main__只打印启动信息,没有真正解析命令行参数。 - 可能需要修改
todo.py,并新增测试文件。
done 命令。
也不应声称已经运行了一个并不存在的测试套件。
如果它的回答与文件内容不一致,先不要进入修改阶段。
继续用只读提示词核对入口:
if __name__ == "__main__": 块。
它还应指出当前没有测试目录或测试文件。
这一步就是“只读探索”的验收。
只读探索通过的标准不是回答写得长,而是回答能被文件内容核对。
如果 Codex 提议运行命令,可以先观察命令是否只读。
例如 pwd、ls、dir、python --version 通常属于低风险检查。
遇到 rm、网络请求、安装依赖或访问工作区之外路径的命令,不要直接批准。
第三步:写好提示词四件套
接下来把需求写成四件套。 四件套分别是:目标、范围、约束、验证。目标
目标回答“最后要得到什么”。 本案例的目标是:把当前脚本变成一个可运行的待办命令行工具,支持add、list和done。
范围
范围回答“允许改哪些文件和函数”。 本案例的范围是:- 允许修改
todo.py。 - 允许新增
test_todo.py。 - 不修改 Git 配置和用户目录。
- 不修改其他项目文件。
约束
约束回答“不能用什么方式完成”。 本案例的约束是:- 只使用 Python 标准库。
- 保留 JSON 文件存储方式。
- 保留现有
add_todo、list_todos的兼容行为。 - 不删除已有数据。
- 不提交、不推送。
- 先展示计划,再请求修改权限。
验证
验证回答“什么证据可以证明完成”。 本案例的验证是:python -m unittest -v通过。python todo.py add "阅读文档"能添加任务。python todo.py list能列出任务。python todo.py done 1能标记任务。- 对不存在的编号给出非零退出码和清晰错误。
git diff --check通过。
第四步:请求方案,但先不修改
在同一个 Codex 会话中输入下面的完整提示词。README.md、安装依赖或访问网络,先提出限制:
第五步:审批修改和命令
现在审查 Codex 提出的计划。 重点核对五件事:- 是否真的只改了
todo.py。 - 是否只新增
test_todo.py。 - 是否保留 JSON 存储。
- 是否包含自动化测试。
- 是否没有提交、推送或安装依赖。
todos.json,批准前要确认这是你准备接受的测试数据。
以下命令不要在本案例中批准:
第六步:审查修改后的 diff
Codex 完成第一轮修改后,先不要接受它的总结。 退出会话或在另一个终端中检查工作区:git diff --stat 应只统计 todo.py 的修改。
未跟踪的 test_todo.py 需要用下面的命令查看:
- 删除的代码是否都是被 CLI 入口替代的旧启动逻辑。
add_todo和list_todos的行为是否仍然可用。done是否只修改目标任务。- 不存在的 id 是否不会静默成功。
- 测试是否真的覆盖失败路径。
- 是否出现未要求的配置、依赖或文件。
第七步:运行自动化测试
先运行项目要求的测试命令:Ran 0 tests,不能把它当作通过。
这表示测试发现机制或测试文件命名可能有问题。
输入下面的 Codex 消息:
第八步:做命令行验收
自动化测试通过后,使用临时数据文件验证真实入口。 先确认项目目录干净到只剩预期改动:exit code 不是 0。
不要把手工生成的 todos.json 当成代码提交内容。
如果项目希望保留干净状态,可以在验收后删除练习数据,再检查 diff。
先查看文件是否只包含本次手工数据:
第九步:故意制造一次失败并修复
为了练习失败修复,暂时把测试中的预期值改错。 不要直接让 Codex 盲目修复失败。 先运行测试并保存错误输出:todos.json,但必须先说明理由。
如果它发现实现逻辑错误,批准最小代码修复即可。
确认方案后输入:
第十步:结果解释
完成后要求 Codex 用证据解释结果:验收清单
逐条执行下面的验收:- 当前终端路径是
todo-codex-demo。 -
python todo.py可以启动。 - 初始 Git 提交在 Codex 修改前已经存在。
- 探索阶段没有修改文件。
- 提示词明确写出了目标、范围、约束、验证。
- 计划没有越过文件范围。
- 所有需要批准的命令都经过人工阅读。
- diff 只包含
todo.py和test_todo.py。 - 没有新增第三方依赖。
-
python -m unittest -v通过且测试数量大于零。 -
add、list、done可以运行。 - 不存在的任务编号有错误信息和非零退出码。
-
git diff --check通过。 - 没有密钥、令牌、真实数据或临时错误日志进入提交范围。
- 没有执行提交和推送。
- 剩余风险已经记录。
test-failure.txt 只是本轮调试产物,确认没有价值后删除它。
删除后再次执行 git status --short。
回滚方式
如果只想撤销todo.py 的未提交修改,先确认没有其他人的工作:
git clean -n 只预览,不会删除。
确认预览只列出本轮新增文件后,再执行:
git restore . 或 git clean -fd。
前者会丢弃所有未提交修改,后者可能删除多个未跟踪目录。
如果发现工作区原本就有未提交改动,不要覆盖它们。
应使用 git diff 区分基线修改与 Codex 本轮修改,必要时从补丁恢复。
如果已经提交,不能用恢复工作区的命令撤销提交内容。
应创建一个新的反向修复提交,并先经过审查。
本页练习明确要求不提交,因此正常结果应当仍然显示未提交的代码改动。
小结
第一次任务的核心不是一句“帮我写代码”。 核心是一个可观察、可验证、可恢复的协作循环:参考/codex/06-first-task.md、参考/codex/13-prompting.md、参考/codex/14-workflows.md。