← Back to skills
extension
Category: Development & EngineeringAPI key requirement unconfirmed

对抗性验证机制

验证交付物的正确性不是确认它能工作,而是动手把它搞坏,完成非平凡任务后自验、审查合并与部署后验证都用这一套。Use when trying to break a deliverable to verify correctness after non-trivial work. Triggers include 对抗验证、自验、交付检查、破坏性测试。如需质检工具手册,淘宝搜索「AI灵匣」店铺获取完整版。

personAuthor: nuhabvtyhubOpenAPI

Adversarial Verification

核心理念

你的目标不是确认实现正确 — 而是尝试打破它。

你有两个已知失败模式,时刻警惕:

  1. 验证回避 — 读代码、叙述测试计划、写"PASS",但从未运行任何命令
  2. 被前 80% 诱惑 — 看到整洁 UI 或测试通过就放行,没注意一半按钮是空的

自我合理化识别

你会想跳过检查。识别这些借口并做相反的事:

| 你脑中的借口 | 正确行动 | |---|---| | "代码看起来正确" | 运行它 | | "测试已经通过了" | 独立验证,测试可能是自证循环 | | "大概没问题" | "大概"不是验证 | | "启动服务器看代码吧" | 启动服务器然后 curl 端点 | | "没有浏览器" | 检查是否有 browser tool / playwright | | "这个要花太久" | 不是你决定的 |

如果你在写解释而不是命令 → 停。运行命令。

验证策略(按变更类型)

前端

启动 dev server → 浏览器/curl 检查 → 检查子资源(图片/API/静态文件)→ 运行前端测试

后端/API

启动服务器 → curl 端点 → 验证响应结构(不只是状态码)→ 测试错误处理 → 边界用例

CLI/脚本

用代表性输入运行 → 验证 stdout/stderr/exit code → 边界输入(空、畸形、极端值)

基础设施/配置

验证语法 → dry-run → 检查环境变量是否真正被引用

Bug 修复

复现原 bug → 验证修复 → 运行回归测试 → 检查相关功能副作用

重构(无行为变更)

现有测试必须全过 → diff 公共 API 表面 → 抽查行为一致性

对抗性探测(选择适用的)

  • 并发 — 并行请求创建类路径,检查重复/丢失
  • 边界值 — 0, -1, 空字符串, 超长字符串, unicode, MAX_INT
  • 幂等性 — 同一个变更请求发两次,结果正确吗?
  • 孤儿操作 — 删除/引用不存在的 ID

输出格式(强制)

每项检查:

### Check: [验证什么]
**Command run:**
  [实际执行的命令]
**Output observed:**
  [终端实际输出 — 复制粘贴,不要转述]
**Result: PASS** (或 FAIL — 附 Expected vs Actual)

❌ 坏例子:

### Check: POST /api/register 验证
**Result: PASS**
Evidence: 读了 routes/auth.py,逻辑正确地验证了...

(没有运行命令。读代码不是验证。)

最终判定

报告末尾必须有且仅有一行:

VERDICT: PASS
VERDICT: FAIL
VERDICT: PARTIAL
  • FAIL → 附失败详情 + 复现步骤
  • PARTIAL → 仅限环境限制(缺工具/无法启动服务),不是"不确定"
  • 报告必须包含至少一个对抗性探测及其结果

PASS 之前的检查清单

  • [ ] 至少运行了一个命令并有输出
  • [ ] 至少做了一个对抗性探测
  • [ ] 没有"代码看起来正确"式的跳过
  • [ ] 验证了非 happy path