“吹牛不犯法”的惨痛教训 — 手把手教你 verification-before-completion 的真相

0 阅读7分钟

一个让 AI 和程序员不再“嘴硬”的铁律,用故事 + 时序图讲给你听

一、从前有个叫“小白”的聪明程序员

小白很聪明,代码写得飞快。每次改完 bug,他都会自信满满地说:

  • “应该好了吧”
  • “测试肯定能过”
  • “没问题,我推了”

然后……生产环境炸了

有一次,他改了一行函数名,没跑测试,直接发版。结果前端调用失败,用户看见满屏白屏。经理问他:“你验证过吗?”
小白说:“我觉得没问题啊。”
经理叹了口气:“你觉得 ≠ 它是。”

那一天,小白学会了一个词:验证证据

后来,小白遇到了一位神秘架构师,外号“铁证老妖”。老妖递给他一个文件,上面写着:

name: verification-before-completion
description: 没有新鲜证据,不许说“完成了”

这就是我们今天要讲的 verification-before-completion Skill。


二、这个 Skill 到底在防什么?

一句话:  禁止任何人在没有刚刚运行过验证命令的情况下,宣称工作完成、测试通过、Bug 修复、构建成功。

它的“铁律”长这样:

NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE

翻译成人话:
👉 没跑验证 → 闭嘴,别说“好了”。

为什么这么严厉?

SKILL.md 里写得很直白:

Claiming work is complete without verification is dishonesty, not efficiency.

也就是说:不验证就喊完成,不是“高效”,是“撒谎”

小白以前犯的错误,全被这张表抓住了:

小白常说的谎真实需要的验证
“测试应该能过”跑一遍测试,看 0 failures
“Linter 没报错”实际要跑 编译(linter ≠ 编译器)
“Bug 我改了,肯定好了”重新跑原来的复现场景,必须通过
“Agent 说它成功了”自己去看 VCS diff,独立验证
“我累了,差不多得了”累了不是跳过验证的理由

三、它的“门禁函数” —— 5 步验证法

这个 Skill 内部实现了一个类似“门禁”的逻辑,谁要宣称完成,必须先过这 5 步:

1. 识别:用什么命令来证明这个 claim?
2. 运行:完整地、新鲜地执行该命令
3. 读取:看全部输出、退出码、失败数
4. 确认:输出真的支持你的 claim 吗?
   - 否 → 说出真实状态(带证据)
   - 是 → 带着证据说出 claim
5. 只有到这一步,才能说“完成了”

跳过任何一步 = 撒谎。

小白把这 5 步贴在了显示器上,每次想喊“好了”之前,都先过一遍。


四、一个完整的“调用过程” —— 时序图

下面这张 Mermaid 时序图,展示了从“任务完成”到“宣称完成”的真实交互过程。
参与者:你(或 AI)verification-before-completion 门禁验证环境(测试/编译/检查)

调用过程” .png

关键点:门禁不会信任任何“我觉得”、“应该” ,它只信任 刚跑出来的输出


五、最佳用法 —— 像老司机一样玩转这个 Skill

1️⃣ 永远使用“红-绿-红”验证回归测试

当你要写一个回归测试(防止同一个 Bug 再次出现):

  • ✅ 正确做法:

    1. 先写测试(此时 Bug 还没修) → 运行,测试必须 FAIL
    2. 修改代码 → 运行,测试必须 PASS
    3. 故意回滚修改 → 运行,测试必须再次 FAIL(证明这个测试真的能抓住 bug)
    4. 恢复修改 → 最后通过

小白以前只做到第 2 步就结束了,结果测试其实永远在 PASS(因为写错了测试逻辑)。
老妖说:没有“红-绿-红”的回归测试,等于没写。

2️⃣ 别把“部分验证”当成“全量验证”

常见陷阱:

你做的你以为证明了实际没证明
跑了一个单元测试所有测试通过集成测试、端到端测试没跑
Linter 通过构建成功编译器可能报 undefined 函数
Agent 说“完成”任务真的完成Agent 可能撒谎或漏了东西

最佳实践:
每次 claim 前,问自己: “如果我现在把所有证据删掉,重新跑一遍,还能得到同样的结论吗?”
不能 → 重新跑。

3️⃣ 把“危险信号”当火警铃

SKILL.md 里列了一堆危险信号,只要出现任何一个,立刻停止 claim:

  • 你想说  “应该”、“大概”、“好像”
  • 你想表达  “太好了!”、“完美!”、“搞定!” (还没验证)
  • 你正准备 commit / push / 提 PR
  • 你相信了 Agent 的“成功”报告(没有自己看 diff)
  • 你脑子里出现  “就这一次”
  • 你 累了,想赶紧结束

小白现在一看到自己想用“应该”,就会自动触发“门禁反射”——立刻去跑验证。

4️⃣ 把“借口”贴在墙上

Skill 里列了 6 个最常见的借口,每个都配了“现实”:

借口现实
“应该能工作”那就去 RUN 验证
“我有信心”信心 ≠ 证据
“就这一次”没有例外
“Linter 过了”Linter ≠ 编译器
“Agent 说成功”独立验证
“我累了”疲劳不是借口

最佳用法:
当你想说其中一个借口时,大声读出来,然后去跑命令。


六、实现原理 —— 这个 Skill 是怎么“逼你诚实”的?

从技术角度看,这个 Skill 是一个 行为门禁模式,它没有复杂的代码,而是通过 强制检查点 + 语义禁止 来实现:

  1. 关键词拦截
    当 AI 或人类说出某些词(“完成”、“通过了”、“好了”、“没问题”),Skill 会立刻插入一个检查:
    “你刚才运行过验证命令吗?输出是什么?”

  2. 证据链要求
    任何 claim 都必须附带 可重现的证据,例如:

    • [2025-03-31 14:32:10] 运行 npm run test: 124/124 pass, exit 0
    • 没有时间戳、没有完整输出 → 视为无效。
  3. 红-绿-红验证器
    对于回归测试,Skill 会强制要求三步:

    • 测试必须 fail 过
    • 修改后必须 pass
    • 还原后必须再次 fail
      缺少任何一步,拒绝接受“回归测试写好了”的 claim。
  4. 可信源分离
    不信任:

    • 之前的运行结果
    • 别人的口头报告
    • Agent 的单方面成功
      只信任:
    • 在当前会话中、刚刚执行的、完整命令的原始输出。

七、一个真实案例 —— 小白最终怎样救回了自己的 PR

某天,小白修复了一个空指针异常。他刚想提交 PR,脑子里的“门禁”响了:

门禁:  你要 claim 什么?
小白:  Bug 修好了。
门禁:  用什么命令证明?
小白:  npm run test:bug-repro(复现该 bug 的测试)
门禁:  现在立刻跑。
小白: (运行)→ 失败?咦,原来我修复不完整,还有另一个地方会空指针。
小白:  再改 → 再跑 → 通过。
门禁:  现在回归测试验证了吗?红-绿-红?
小白:  刚跑过红(修复前)→ 绿(修复后),我还需要再跑一次红?
门禁:  是的,回滚你的修改,测试必须再次红。
小白: (回滚)→ 运行 → 红(PASS,说明测试敏感)。
小白:  恢复修改 → 运行 → 绿。
门禁:  ✅ 证据完整。你现在可以 claim:“Bug 已修复,回归测试有效。”
小白:  提 PR,CI 全绿,经理点了 merge。

从此小白再也没说过“应该好了”。


八、总结(给小白的一张卡片)

verification-before-completion 的本质
不是技术,不是流程,而是一个 诚实开关
打开它,你就必须用证据说话;
关上它,你就会骗别人、也骗自己。

最佳用法三句话:

  1. 任何“完成”之前,先问:“用什么命令证明?”
  2. 完整、新鲜地运行该命令,读出输出。
  3. 只有输出支持 claim,才开口说“好了”。

记住铁律:

没有新鲜证据 → 闭嘴
有新鲜证据 → 带着证据说话

最后一句(来自 SKILL.md):

No shortcuts for verification. Run the command. Read the output. THEN claim the result. This is non-negotiable.

小白现在把这句话纹在了键盘上(当然是虚拟的)。
你呢?要不要也贴一条在你最常用的终端上? 🧪✅