Skip to main content

本页目标

上一页已经为 Python TODO CLI 完成了 done <序号> 功能,并补上基础测试。 现在先不提交、不推送,而是把“看起来完成”的改动变成一份有证据、可审查、可回滚的候选交付。 本页继续使用同一个项目:
done 的契约如下:
  • 命令是 python todo.py done <序号>。
  • 序号从 1 开始,与 list 的显示一致。
  • 合法序号只删除对应待办,并打印被删除的内容。
  • 非数字、缺参、0、负数和越界不得产生 traceback。
  • 不引入第三方依赖,不改变已有 add、list 行为。
本页走完这条闭环:
Codex 命令、菜单和权限文案可能随版本变化。先运行 codex --help,并以本机界面和官方文档为准。

一、冻结范围并保存基线

1. 确认环境

在项目根目录执行:
PowerShell 中可将 pwd 换成 Get-Location。 预期类似:
确认以下事项:
  • 当前目录确实是 todo-cli。
  • 当前分支不是受保护的 main,或团队明确允许在此工作。
  • 待审改动只包含预期文件。
  • Python 与 Codex CLI 均可启动。
若状态里出现 .env、数据库、日志或未知文件,先停止:
不要让 Codex “顺手清理”,也不要批量暂存。 先判断它们是否含敏感信息、是否属于他人工作。

2. 保存修复前补丁

把当前源码和测试差异保存到仓库外:
PowerShell:
预期文件大小大于 0。 若为 0 字节,说明目标文件相对 HEAD 没有差异,空文件不能作为备份。
补丁可能包含源码和测试数据。应保存在受控目录,不上传公开网盘;测试夹具中不要放真实令牌、个人数据或客户数据。

3. 明确非目标

把边界直接交给 Codex:

二、建立测试矩阵

测试矩阵把需求、风险、验证层和证据连起来,避免只测正常路径。

1. 功能与边界

优先级含义:
  • P0:崩溃、误删或命令契约破坏,失败即禁止交付。
  • P1:重要回归或约束失守,修复后才能进入发布准备。
  • P2:可维护性建议,可记录但不得冒充阻断缺陷。

2. 验证层级

先让 Codex 只读补漏:
它至少应注意:
  • Python 支持负索引,0 - 1 等于 -1,可能误删末项。
  • done 缺参时直接访问 sys.argv[2] 可能触发 IndexError。
若它建议引入 pytest、数据库或重写参数解析,回复:

三、运行修复前基线

1. 空白、语法和全量测试

前两条通过时通常无输出,退出码为 0。 测试理想输出类似:
“5 个测试全绿”不代表矩阵完整。 若缺少 0、负数和缺参用例,绿色只说明已有断言通过。 若语法检查出现:
先归类为代码/语法失败并修正;模块无法导入时,业务断言没有诊断价值。

2. CLI 冒烟

示例程序的 TODOS 只存在于当前进程,不能用两次独立命令证明“先添加再删除”。 CLI 冒烟只检查参数路由、输出与不崩溃;状态变化交给同进程单元测试。
错误分支均应:
  • 输出用法或友好错误。
  • 不出现 Traceback (most recent call last)。
  • 不静默成功。
  • 不访问网络或外部文件。
示例输出:
若 python todo.py done 抛 IndexError,这是确定性产品缺陷,不是环境问题。 记录完整命令和首个异常位置。

四、分类失败

看到红色先分类,不要立刻改业务代码。 每个失败记录为:
疑似偶发时只重复目标用例有限次数:
PowerShell:
只要出现一次失败,就不能作为稳定门禁;不要重复到偶然通过为止。

五、先补会变红的回归测试

假设确认两个缺陷:
  • F-01:done 0 误删最后一项。
  • F-02:done 缺参抛 IndexError。
给 Codex:
预期先得到红灯:
若新测试在修复前已通过,检查是否走到真实分支、断言是否过弱、全局状态是否污染,或缺陷假设是否错误。 不要篡改期望来制造红灯。 测试应隔离全局状态,例如:
输出断言应检查有意义的契约,并同时断言列表未改变。 除非文案是公开接口,否则不要逐字锁死整句错误提示。

六、让 Codex 做只读审查

在项目根目录启动:
进入会话后输入:
选择 Review uncommitted changes。 若本机没有该预设,使用:
有效发现应可复现:
“代码可能有边界问题”没有位置、触发条件和后果,不是可执行发现。 要求补证据,或降为开放问题。 对每条意见追问:
  1. 是否由当前 diff 引入,或会被当前交付影响?
  2. 能否用命令、测试或代码路径复现?
  3. 修复是否突破本轮范围?
把数据库重构之类长期建议记录到后续,不在本轮实施。

七、分五层读 diff

第 1 层:范围

预期只有 todo.py 与 test_todo.py。 出现 AGENTS.md、锁文件或生成物时先查原因,范围异常本身就是阻断项。

第 2 层:结构

检查意外重命名、整文件换行变化或无关格式化。 两个边界修复不应重写整个 CLI。

第 3 层:逻辑

沿着这条路径读:
确认参数在访问前检查、int() 失败受控、显式拒绝 < 1、删除前检查上界、失败路径保持列表不变、成功只删除目标项。

第 4 层:测试

确认测试隔离全局状态,同时断言输出和状态;CLI 测试应恢复 sys.argv 与标准输出;测试不能复制错误实现逻辑,也不能删除旧用例换取绿色。

第 5 层:安全与卫生

人工搜索凭据、个人数据、绝对用户路径、生产 URL、网络访问及删除/覆盖文件操作。 可让 Codex 只读复核:

八、最小修复与回归

给 Codex:
合理补丁通常只需增加下界判断和缺参判断。 若 diff 突然增长几十行,暂停并要求解释。

1. 定向回归

PowerShell 可写成一行。 预期:
一个通过、一个失败时只处理剩余根因,不要继续堆补丁。

2. 邻近边界与全量回归

预期测试为 OK,其余命令无输出且退出码为 0。 用例数以实际文件为准,不要为匹配示例硬凑数量。 最后重跑 CLI 冒烟:
所有错误分支都不得出现 traceback。

九、质量门禁

“Ran 0 tests”不是通过:
此时检查发现规则:
若全量测试出现疑似既有失败,可在干净 worktree 对同一 HEAD 建基线:
完成后回原仓库,确认路径再移除:
基线也失败则记录为既有问题;基线通过则当前改动是首要嫌疑。 不得用“看起来无关”口头跳过。

十、证据记录

“我跑过了”不是证据。最小记录应包含时间、HEAD、环境、命令、退出码和摘要。 记录环境与差异指纹:
不要在公开记录中粘贴令牌、用户名目录、内部主机名或客户数据。 让 Codex 输出最终报告时使用:
仍需人工对照终端输出,不要只看 Codex 复述。

十一、失败分支与停止条件

无法复现

要求 Codex 使用同一目录、命令和版本:
无法复现时不要做“可能性修复”。

需要真实凭据或生产数据

立即停止,改用内存替身、脱敏夹具或专用测试账号。 无法安全验证时标记 BLOCKED,写明所需授权与隔离条件,不要把真实密钥贴进会话。

修复开始扩张

以下情况应停止:
  • 为两个边界判断引入新框架。
  • 改变公开命令格式。
  • 修改无关的 add、list。
  • 删除测试、降低断言或跳过失败用例。
  • 新增网络、数据库或文件副作用。
返回测试矩阵,重新要求最小方案。

十二、回滚

回滚前先区分本轮改动与用户原有工作,禁止使用 git restore . 或 git reset --hard。 先检查补丁适用方向:
根据当前状态选择一个方向:
不要把两条当作固定配方连续执行。 只撤销 Codex 刚做的 hunk 时,优先使用 IDE diff 逐块回退或手工编辑。 只有确认目标文件不含任何需保留的旧改动时,才可执行:
回滚后仍要验证:
本页没有提交,因此不需要 git revert,更不要改写历史。

十三、安全验收

进入下一页前,由人逐项确认:
  • 当前目录、分支和身份正确。
  • diff 只包含批准文件。
  • 修复前回归测试确实变红。
  • 修复后定向测试与全量测试通过,且不是 0 个用例。
  • py_compile 与 git diff --check 通过。
  • 缺参、非数字、0、负数和越界均无 traceback。
  • add、list 行为未改变。
  • Codex /review 无未处理 P0/P1。
  • 人工按范围、结构、逻辑、测试、安全五层读过 diff。
  • 无真实凭据、个人数据、生产地址和本机绝对路径。
  • 无新增网络、第三方依赖和外部数据副作用。
  • 已记录命令、环境、结果、失败分类和残余风险。
  • 已准备仓库外补丁或明确的逐块回滚方法。
  • 未提交、未推送、未创建 PR、未合并、未发布。
任何一项不满足,就使用 BLOCKED 或 PARTIAL,并写清缺少的证据。

最终通过标准

合格结论应类似:

小结

本页用四个问题收口:
  1. 证明什么:矩阵覆盖正常、边界、回归和安全风险。
  2. 失败说明什么:区分产品、测试、环境、偶发、范围外与安全阻断。
  3. 改动是否可信:Codex 只读审查,人按五层 diff 复核。
  4. 能否进入下一阶段:定向与全量回归、门禁、证据和回滚全部到位。
在这个 TODO CLI 中,关键风险是 0 被负索引解释成末项,以及缺参直接崩溃。 先让回归测试稳定变红,再用最小修复变绿,最后证明没有破坏相邻行为。 下一页进入 Git 提交、发布与复盘。此时仍保持未提交、未推送,并带上本页的测试证据和安全验收清单。 参考资料:参考/codex/34-capstone.md、参考/codex/14-workflows.md、参考/codex/26-git-github.md。动态信息以本地 --help 与官方文档为准。