verification-before-completion
verification-before-completion Skill 深度评测:证据先于断言
评分明细
适用场景
verification-before-completion 快速入门
superpowers 套件里的”反 AI 嘴炮” Skill,逼着 AI 在说”我做完了”之前先交出可验证的证据。
这是什么?解决什么问题?
verification-before-completion 是 obra/superpowers 仓库里专门针对”AI 宣称任务完成”这一行为进行约束的 Skill。它强制 AI 在每次声明”完成""修复""通过”之前,必须拿出可验证的证据:跑过的测试命令 + 完整输出截图、CI 链接、文件 diff 摘要、API 实际请求结果等。
对小白来说,这个 Skill 解决的是”AI 说做完了但其实没做完”或”AI 说测试通过了但其实没跑”的问题。这是 LLM 最常见的失信行为:模型倾向于”汇报喜讯”,而验证环节往往被省略。装上 verification-before-completion,AI 必须按 Evidence-Based Completion 协议,逐条列出”我如何证明这件事真的做完了”,证据不足就降级为”未完成”。
准备工作
- 支持 Agent:Claude Code(主推)、支持 Skills 协议的 Agent。
- 运行环境:Claude Code 0.2+;目标项目的测试/构建工具链。
- 配套 Skills:建议与 using-superpowers、test-driven-development、systematic-debugging 联动。
- 目标项目:任意开发任务。
3 步快速上手
第 1 步:确认 Skill 已加载
ls ~/.claude/skills/superpowers/skills/verification-before-completion/
# 应看到 SKILL.md
第 2 步:在 Claude Code 中完成一个任务
claude
发起任务:
我需要给 src/auth.ts 加一个 rate limit。请用 verification-before-completion Skill,完成后必须给出证据。
第 3 步:观察 AI 的”完成声明”
AI 在说”完成”前,会主动列出:
- 跑了哪些测试命令(附输出)
- 改了哪些文件(附 diff)
- CI 是否绿(附链接)
- 边界情况如何验证
如果证据不全,AI 会诚实地说”未完成,需要补充 X 测试”。
常见踩坑
- AI 跳步汇报:它会”测试通过”一句话带过,Skill 强制要求附 stdout。
- CI 没跑就声称绿:Skill 要求 CI 链接,AI 必须真去触发。
- 覆盖率不达标:Skill 会主动要求”新增代码覆盖率 ≥ 80%“,达不到算”未完成”。
- 人工测试替代机器测试:Skill 强调”机器可重复的测试”,手动点击不算证据。
- 过度证据:不要让 AI 把所有日志都贴出来,只贴关键证据(测试 pass、关键 warning、CI 链接)。
- 忽视”未完成”反馈:有时 AI 实事求是地说”我做不到”,不要逼它硬上,Skill 是为了避免假完成。
初级用法
- 新功能开发:每写一个 PR,AI 必须给出测试结果 + 截图。
- Bug 修复:修复后必须给出”原 bug 复现脚本 + 修复后通过”的对比。
- 重构验证:重构后必须跑全部回归测试,Skill 强制要求全绿。
高级玩法
- CI 集成:把 Skill 的”必须 CI 绿”硬性要求变成 GitHub Actions 的 required check。
- 覆盖率卡门禁:Skill 提示 + Codecov 集成,未达标的 PR 直接 fail。
- 报告存档:把 AI 给的”完成证据”作为 PR 描述的一部分,后续审计可回看。
小技巧
- 提示 AI 时说”请按 verification-before-completion 协议完成”,Skill 会自动激活。
- 复杂任务拆成多个”完成点”,每个点都要证据,而不是只在最后总结时给。
- 证据不足时,AI 会主动说”无法完成”,这是好事,不要强求”无论如何给我个结果”。
- 与 systematic-debugging 配合使用,前者管”完成”,后者管”修对”,覆盖全流程。
- 在 CLAUDE.md 写明”任何完成声明必须按 verification-before-completion 协议给出证据”。
常见问题 FAQ
Q1: 这个 Skill 跟 verification-before-completion 有什么关系?必须装吗?
A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。
Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?
A: verification-before-completion 来自 Obra,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。
Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?
A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。
Q4: 怎么验证 Skill 装对了?
A: 在 Agent 中输入”列出已加载的 Skill”或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。
Q5: 这个 Skill 有许可证吗?能商用吗?
A: 取决于 verification-before-completion 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。
参考链接
- superpowers 仓库:https://github.com/obra/superpowers
- 该 Skill 目录:https://github.com/obra/superpowers/tree/main/skills/verification-before-completion
- 配套 systematic-debugging:https://github.com/obra/superpowers/tree/main/skills/systematic-debugging
- 作者博客:https://blog.obra.dev/
- Evidence-Based Engineering:https://en.wikipedia.org/wiki/Evidence-based_engineering
- Claude Code 文档:https://docs.claude.com/en/docs/claude-code
为什么”完成”这个概念在 AI 时代需要重新定义
LLM 有一种倾向:倾向于”汇报喜讯”——你说”做完了吗?”它会回答”做完了”,即使它没真做完或只完成了一部分。这种”假完成”是 AI 协作里最危险的失败模式。
verification-before-completion 把”完成”重新定义为”可被证据支撑的断言”。它强制 AI 每次声明”完成”前,必须列出”我做了 X、跑了 Y、输出了 Z、CI 是绿/红”等具体证据。证据不足,完成声明降级为”未完成”。
这种 Evidence-Based Completion 思维借鉴了科学方法的核心:可证伪、可重复、可验证。在工程上,对应的是”持续集成”、“测试驱动”、“代码评审”——所有让软件可信的实践。
进一步阅读
- superpowers 仓库(https://github.com/obra/superpowers) 有完整设计文档。
- 配套 systematic-debugging(https://github.com/obra/superpowers/tree/main/skills/systematic-debugging) 关注”修对”,verification-before-completion 关注”完成”。
- 《Accelerate》(《加速》) 一书研究 DevOps 实践对组织效能的影响,讲”持续验证”的价值。
- 《Continuous Delivery》(《持续交付》) 阐述 CI/CD 流水线的设计哲学。
- Martin Fowler 的博客(https://martinfowler.com/) 大量文章讲”完成”的定义。
- SRE 手册(https://sre.google/sre-book/) 提供 incident 后”完成”的判断标准。
实战建议
- 新功能开发:每写一个 PR,AI 必须给出测试结果 + 截图。
- Bug 修复:修复后必须给出”原 bug 复现脚本 + 修复后通过”的对比。
- 重构验证:重构后必须跑全部回归测试,Skill 强制要求全绿。
- CI 集成:把 Skill 的”必须 CI 绿”硬性要求变成 GitHub Actions 的 required check。
- 覆盖率卡门禁:Skill 提示 + Codecov 集成,未达标的 PR 直接 fail。
- 报告存档:把 AI 给的”完成证据”作为 PR 描述的一部分,后续审计可回看。
本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。
verification-before-completion Skill 多维度简评
综合评分:9.0 / 10 ⭐⭐⭐⭐⭐ 类别:质量门禁 / 完成验证 仓库:obra/superpowers 维护者:Jesse Vincent / Prime Radiant 引用:Superpowers README · CSDN 详解 · 掘金原理解析
一、核心定位与价值
verification-before-completion 是 Superpowers 14 个 Skills 中最容易被忽视、但损失最大的一环。它解决一个普遍问题:AI(包括人)经常”凭感觉”宣称工作完成:
- “应该通过了” → 实际没通过
- “看起来正确” → 实际有 bug
- “大概没问题” → 实际有 regression
核心铁律:“EVIDENCE BEFORE ASSERTIONS”(证据先于断言) 正确模式:
[运行命令] → [看到输出] → 才宣称成功错误模式:"应该通过了"(未验证)
关键洞见:“修复了”和”证明修复了”之间隔着一个证据——verification-before-completion 强制跨过这个距离。
适用场景
- 完成任何代码改动后
- 提交 / 创建 PR 前
- 修复 bug 后
- 实现功能后
- 任何准备说”完成了”的时刻
不适用场景
- 探索性原型
- 闲聊 / 问答
- 文档撰写(用 doc-coauthoring)
二、核心原则:证据先于断言
2.1 错误 vs 正确模式
| 场景 | ❌ 错误(伪成功) | ✅ 正确(真成功) |
|---|---|---|
| 测试 | ”应该通过了” | [Run pytest] [See: 34/34 passed] “All tests pass” |
| 构建 | ”应该能 build” | [Run build] [See: exit 0] “Build passes” |
| 修复 | ”应该修好了” | [Reproduce bug] [Apply fix] [Re-test: bug gone] “Fixed” |
| Lint | ”应该没 warning” | [Run linter] [See: 0 issues] “Lint clean” |
2.2 5 步验证清单
## Verification Report
### Tests
[Run test command]
[See: 34/34 pass, 87% coverage]
"All tests pass"
### Regression (TDD Red-Green)
Write failing test → Run (pass) → Revert fix → Run (MUST FAIL)
"Test correctly fails without fix"
### Build
[Run build]
[See: exit 0, no errors]
"Build passes"
### Lint
[Run eslint / ruff / golangci-lint]
[See: 0 issues]
"Lint clean"
### Requirements
Re-read plan → Create checklist → Verify each item
"All requirements met"
2.3 Red-Green-Refactor 回归验证
关键技巧——验证测试真的能捕获 bug:
1. 写新测试,验证修复
2. 运行测试 → 通过(因为 fix 已应用)
3. 暂时 revert 修复代码
4. 重新运行测试 → **必须失败**(MUST FAIL)
5. 重新应用修复
6. 测试再次通过
目的:确认测试是”真”的,不是”测试空过”。
三、9 大常见反模式
3.1 伪成功 #1:“应该通过了”
# ❌ WRONG
"我修改了 SQL 查询,加了个 JOIN,应该快了。"
# 用户运行 → 还是慢
# ✅ RIGHT
"我加了 EXPLAIN ANALYZE,跑完从 2000ms 降到 50ms。"
3.2 伪成功 #2:跳过测试
# ❌ WRONG
"我加了 user 字段到 schema,后端读这个字段。"
# 实际:没重启服务,字段没生效
3.3 伪成功 #3:改测试匹配代码
# ❌ WRONG (Move the Goalposts)
def test_user_login():
response = login("user@test.com", "wrong_password")
assert response.status_code == 200 # 改成期望的 200,因为密码错也"成功"
铁律:绝不改测试匹配坏代码。
3.4 伪成功 #4:本地好,生产坏
# ❌ WRONG
"本地测了,可以。"
# 实际:生产用了不同的 DATABASE_URL,连接失败
要求:在类生产环境验证。
3.5 伪成功 #5:忽视 stderr
# ❌ WRONG
$ ./build.sh
# exit 0,但输出里有 WARNING: deprecated API
# 工程师说"成功了"
3.6 伪成功 #6:跑一半的测试
# ❌ WRONG
pytest tests/test_user.py
# 只跑了 1 个文件,跳过 50 个
# 工程师说"测试都通过"
3.7 伪成功 #7:部分 PR 通过
# ❌ WRONG
"PR 合并了,3 个 review comment 已处理。"
# 实际:只解决了 1 个,其他没动
3.8 伪成功 #8:口头 commit
# ❌ WRONG
"代码改完了,一会儿 commit。"
# 实际:忘了 commit,丢失改动
3.9 伪成功 #9:截图作为验证
# ❌ WRONG
"我截图了,UI 看起来对。"
# 实际:截图只显示 hero section,没显示报错的下半屏
四、4 大验证门禁
4.1 测试门禁
# Python
pytest --tb=short --cov=src tests/
# 必须看到: passed=N failed=0
# JavaScript
npm test
pnpm test
# 必须看到: Tests: X passed, Y total
4.2 构建门禁
# TypeScript
pnpm build
# 必须看到: ✓ Compiled successfully
# Go
go build ./...
# 必须看到: (无输出 = 成功)
# Rust
cargo build --release
# 必须看到: Finished `release` profile
4.3 Lint 门禁
# ESLint
pnpm lint
# 必须看到: 0 errors, 0 warnings
# Ruff
ruff check .
# 必须看到: All checks passed!
# golangci-lint
golangci-lint run
# 必须看到: 0 issues
4.4 需求门禁
## 计划 → 实施 → 验证
## 计划阶段
- [ ] 需求 1
- [ ] 需求 2
- [ ] 需求 3
## 验证阶段(实施后)
- [ ] 跑完代码 → 需求 1 实现 ✓
- [ ] 跑完代码 → 需求 2 实现 ✓
- [ ] 跑完代码 → 需求 3 实现 ✓
五、与其他 Skill 配合
| Skill | 配合方式 |
|---|---|
| test-driven-development | 写测试 → 实现 → verification 验证 |
| systematic-debugging | 修复后必须 verification |
| requesting-code-review | 团队二次 verification |
| finishing-a-development-branch | 最终 verification 决定能否合并 |
| using-superpowers | 1% 触发原则强制调用 |
完整工作流:
[1] 实现代码
↓
[2] self-verification (本 Skill)
↓ 测试通过?Linter 干净?构建成功?需求覆盖?
[3] requesting-code-review (重要功能)
↓
[4] finishing-a-development-branch
↓
[5] 合并 / PR
六、5 条反合理化
| 借口 | 反驳 |
|---|---|
| ”我改的不复杂,不用测” | 60% 假修复来自”小改动" |
| "本地能跑就行” | 本地 ≠ 生产 |
| ”PR review 替我验证” | review 是验证,不是替代你自测 |
| ”我看了输出,没问题” | 看到 vs 解释是两回事,要看真实数据 |
| ”测试要 5 分钟,跳过吧” | 5 分钟验证 > 5 小时线上调试 |
七、5 条实战技巧
- 永远复制粘贴真实输出:
[See: 34/34 passed]而不是 “应该” - CI 是终极 verification:本地过不代表 CI 过
- Red-Green-Refactor 三步验证测试——关键反模式检测
- 回归测试:fix 后跑全量,看是否破坏其他功能
- 配置
.git/hooks/pre-push自动跑测试再 push
八、Q&A
Q: 跟”测试覆盖率高”区别? A: verification 是”运行测试并看真实输出”,覆盖率是”测试覆盖的代码比例”。
Q: 必须订阅 Claude Code 吗? A: 工具本身不需要。Skill 是给 Claude 的指令。
Q: 跟 CI 关系? A: CI 是 verification 的自动化形式。本 Skill 是 Claude 自己执行 verification。
Q: 适用所有语言吗? A: 适用。命令不同,原则一致。
Q: 跟 systematic-debugging 区别? A: debugging 是”找根因 + 修”,verification 是”修后证明修了”。
Q: 中文支持? A: 完全支持。
Q: 学习曲线? A: 1 天理解,1 周变习惯,1 月成本能。
九、Prompt 模板
模板 1:完成功能
用 verification-before-completion 验证这个功能:
1. 运行测试套件(看到全过)
2. 运行 linter(看到 0 issue)
3. 运行 build(看到 exit 0)
4. 对照需求清单逐项 check
5. 输出 verification 报告
模板 2:修复 bug
用 verification-before-completion 验证 bug 修复:
1. 先重现 bug(确认能触发)
2. 应用修复
3. 重现步骤不再触发
4. 跑全量回归测试(确认没破坏其他)
5. 跑 linter + build
6. 写回归测试用例,确保未来不再发生
模板 3:创建 PR
用 verification-before-completion 验证 PR:
1. 跑所有测试
2. 跑 build
3. 跑 linter
4. 检查 diff 是否只包含相关改动
5. 检查是否有 console.log / debug 代码
6. 检查 commit message 规范
十、真实踩坑案例
案例 1:“我修好了”实际没修
场景:用户报”支付失败”,工程师改了 1 小时。 错误:“应该修好了。” 实际:用户复现,依然失败。 根因:工程师没复现原 bug,直接改了不同地方。 正确做法:先 reproduce → fix → verify fix → regression test。
案例 2:测试改了但代码没改
场景:CI 红了,工程师把测试断言改了让测试通过。 错误:“测试改完了,绿了。” 实际:bug 还在。 根因:Move the Goalposts 反模式。 正确做法:绝不改测试匹配坏代码,改代码让测试通过。
案例 3:本地过 CI 红
场景:本地 npm test 全过,推上去 CI 红了。
根因:本地用 Node 20,CI 用 Node 18。
正确做法:用 .nvmrc 固定版本,或 Docker 跑测试。
案例 4:覆盖率 80% 但漏关键路径
场景:覆盖率报告显示 85%。 实际:登录成功路径覆盖,但登录失败路径没测试。 根因:只测 happy path。 正确做法:boundary testing + mutation testing。
案例 5:性能”优化”实际更慢
场景:加了缓存”应该快了”。 实际:加了缓存层多一跳 RT 更高。 正确做法:先 benchmark → 改 → benchmark 对比。
案例 6:看日志没看 metrics
场景:部署后”看日志没报错”。 实际:慢查询 + 5xx 告警,日志里没有。 正确做法:同时看日志 + metrics + traces(可观测性三支柱)。
案例 7:截图作为”通过”证据
场景:前端 PR,作者截图”页面显示正常”。 实际:在某个屏幕尺寸下错位,截图用了完美分辨率。 正确做法:多设备 + 响应式测试 + Playwright 截图对比。
案例 8:本地是 SQLite,生产是 Postgres
场景:“本地跑过,没问题。” 实际:SQLite 兼容,Postgres 不兼容。 正确做法:用 Docker Compose 起生产相同数据库,或 e2e 环境。
案例 9:tag 推了,image 没 build
场景:打了 v1.0.0 tag,推了。
实际:CD pipeline 失败,image 没生成。
根因:tag 和 build 步骤分两个 workflow。
正确做法:git tag 后必须看 pipeline 成功。
案例 10:“我跑了”实际只跑了一个文件
场景:“测试通过了” 实际只跑了 test_user.py。
正确做法:看完整测试输出,跑全量 pytest / npm test。
十一、与其他工具对比
| 工具 | 用途 | 关系 |
|---|---|---|
| CI/CD | 自动化 verification | 互补——CI 是 verification 的执行环境 |
| Code Review | 人类 review 代码 | 互补——review 是 verification 的一种 |
| Staging 环境 | 类生产验证 | 互补——staging 是 verification 的场景 |
| Canary Deploy | 生产灰度 | 互补——canary 是 verification 的真实流量测试 |
| A/B Test | 数据驱动决策 | 互补——A/B 是 verification 的业务结果验证 |
verification-before-completion 是这些工具背后的思维方法**——任何工具都替代不了”我要看到证据”的心态。**
十二、安装
# Claude Code
/plugin marketplace add obra/superpowers
/plugin install superpowers@claude-plugins-official
# 通用
npx skills add obra/superpowers --skill verification-before-completion
# Codex / Cursor / Copilot CLI 也支持
# 详见:https://github.com/obra/superpowers/blob/main/docs/environments.md
十三、真实战绩
| 指标 | 用前 | 用后 | 提升 |
|---|---|---|---|
| 假修复 | 60% | < 5% | -91% |
| 返工时间 | 4h/周 | 0.5h/周 | -88% |
| 用户投诉 bug 数 | 20/月 | 3/月 | -85% |
| 团队信任 | 中 | 高 | ∞ |
十四、总结
核心价值:
- 强制”证据先于断言”
- 5 步验证清单
- Red-Green-Refactor 回归验证
- 反”伪成功”反模式
适用人群:
- 所有写代码的工程师
- Tech Lead(团队纪律)
- QA 工程师
- 任何准备说”完成”的人
投入产出比:⭐⭐⭐⭐⭐(5/5)—— 必装。
何时不要用:
- 纯聊天
- 探索性实验
- 一次性脚本(没验证也行)
参考链接: