没有新鲜证据不声称完成。
“完成”不是 agent 自己的判断;是本会话内、由你亲自收集的、可被外部验证的证据。
任何 task 进入”收尾”阶段时必须触发。常见触发点:
按顺序执行,任何一步失败都必须停下,不能进入下一步:
对每个 checklist 项,找出具体的证据:
| 声称 | 必须有的证据 |
|---|---|
| 测试通过 | pytest/jest/vitest 的完整输出(pass count + fail count = 0) |
| linter 干净 | eslint/ruff 等的退出码 0 + “0 errors, 0 warnings” |
| 构建成功 | 完整 build 日志最后 10 行 + 退出码 0 |
| bug 修复 | 之前失败的测试现在通过(不是新写一个测试) |
| 回归通过 | 旧测试套件完整输出 |
| agent 完成 | 同上(agent 自报是输入不是证据) |
| 需求满足 | 每条 acceptance criteria 对应一个验证步骤的证据 |
模板:
1
2
3
4
5
6
✅ 任务完成
证据:
- [证据 1:具体到文件名/行号/命令/输出]
- [证据 2:...]
- [证据 3:...]
覆盖了: [checklist item 1, 2, 3]
或者:
1
2
⚠️ 未完成,原因:xxx
下一步: yyy
| 失败模式 | 表现 | 后果 |
|---|---|---|
| 历史证据 | “上次跑过这个测试” | 环境已变,事实已变 |
| agent 自报 | “我觉得我做完了” | agent 的话是输入不是证据 |
| 部分覆盖 | 5 条 acceptance 只验了 2 条 | 假装完成,实际 3 条没做 |
| 测试装饰 | 测试只 assert True | 永远绿但永远无意义 |
| 手动验证 | “我用人眼看了截图” | 人眼 = 不可复现 |
| CI 误信 | “CI 应该是绿的” | 绿 ≠ 这个 PR 的 commit 绿 |
| 回滚错配 | “我部署到 prod 了” | 实际部署到 staging |
🚩 你(agent)开始说”应该” / “可能” / “大概” 🚩 你想直接说”done”但没回头查 checklist 🚩 你准备汇报但没跑任何新命令 🚩 用户的 acceptance criteria 有 1 条你没看 🚩 你改了文件但没跑测试就 commit 🚩 你部署了但没 curl 验证线上真的变了
| 借口 | 反驳 |
|---|---|
| “测试上次通过了应该没问题” | 上次通过 ≠ 这次通过,本会话内重跑 |
| “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: 重复请求导致重复扣款]
完成不是一个判断,是一个证据汇总。 如果你凑不出证据,你就还没完成。