verification-before-completion

Iron Law

没有新鲜证据不声称完成。

“完成”不是 agent 自己的判断;是本会话内、由你亲自收集的、可被外部验证的证据。

何时使用

任何 task 进入”收尾”阶段时必须触发。常见触发点:

5 步门禁

按顺序执行,任何一步失败都必须停下,不能进入下一步

Step 1: 重新读 task 原始要求

Step 2: 对每条”声称”找对应证据

对每个 checklist 项,找出具体的证据:

Step 3: 证据必须是本会话内新产生

Step 4: 检查 7 类常见 claim 各需要什么证据

声称 必须有的证据
测试通过 pytest/jest/vitest 的完整输出(pass count + fail count = 0)
linter 干净 eslint/ruff 等的退出码 0 + “0 errors, 0 warnings”
构建成功 完整 build 日志最后 10 行 + 退出码 0
bug 修复 之前失败的测试现在通过(不是新写一个测试)
回归通过 旧测试套件完整输出
agent 完成 同上(agent 自报是输入不是证据)
需求满足 每条 acceptance criteria 对应一个验证步骤的证据

Step 5: 输出有证据的完成声明

模板:

1
2
3
4
5
6
✅ 任务完成
证据:
- [证据 1:具体到文件名/行号/命令/输出]
- [证据 2:...]
- [证据 3:...]
覆盖了: [checklist item 1, 2, 3]

或者:

1
2
⚠️ 未完成,原因:xxx
下一步: yyy

7 列常见失败模式

失败模式 表现 后果
历史证据 “上次跑过这个测试” 环境已变,事实已变
agent 自报 “我觉得我做完了” agent 的话是输入不是证据
部分覆盖 5 条 acceptance 只验了 2 条 假装完成,实际 3 条没做
测试装饰 测试只 assert True 永远绿但永远无意义
手动验证 “我用人眼看了截图” 人眼 = 不可复现
CI 误信 “CI 应该是绿的” 绿 ≠ 这个 PR 的 commit 绿
回滚错配 “我部署到 prod 了” 实际部署到 staging

6 Red Flags(出现任一即触发门禁)

🚩 你(agent)开始说”应该” / “可能” / “大概” 🚩 你想直接说”done”但没回头查 checklist 🚩 你准备汇报但没跑任何新命令 🚩 用户的 acceptance criteria 有 1 条你没看 🚩 你改了文件但没跑测试就 commit 🚩 你部署了但没 curl 验证线上真的变了

6 Rationalizations(agent 一定会找的借口)

借口 反驳
“测试上次通过了应该没问题” 上次通过 ≠ 这次通过,本会话内重跑
“linter 干净就够了” 干净 ≠ 正确,linter 抓风格不抓逻辑
“agent 说完成了” agent 的话是输入不是证据,需要外部验证
“用户应该已经看到了” 用户看到 ≠ 系统行为正确
“这是小事不用那么严” 小的常常变成大的
“我跑过这个测试 100 次了” 那再跑一次也不费事

配对范例

❌ 不对的”完成声明”

1
2
3
Claude: ✅ 完成!bug 修好了。
你: ...怎么确认?
Claude: 我看了代码逻辑应该是对的。

✅ 正确的”完成声明”

1
2
3
4
5
6
7
8
Claude: ✅ 修复完成。
证据:
- test_bug_1234.py 第 42-58 行:原本失败(test_repro_payment_timeout)
  现在通过(pytest -v 输出 PASSED in 0.12s)
- pytest 全套 4/4 通过(test_bug_1234 + 3 旧测试)
- 没改动 test 之外的其他文件
- diff: src/payment/processor.py 第 87-94 行
覆盖了: [bug #1234: 重复请求导致重复扣款]

Bottom Line

完成不是一个判断,是一个证据汇总。 如果你凑不出证据,你就还没完成。