| name | verification-before-completion |
| description | TRIGGER: 即将宣告 complete / done / fixed / passing 时,或在 commit / push / PR / 标记 task 完成之前。 强制在 claim 前运行验证命令并读取真实输出。Evidence before claims, always. Cross-referenced by: triadev, tdd-sdd-development, value-first-gate, task-workflow — 在每个"完成宣告点" 调用此 skill 做证据闸门。 |
| version | 1.0 |
| triggers | ["mark complete","tests pass","bug fixed","done","完成","测试通过","修好了","可以合并","proceed to next"] |
Verification Before Completion
Borrowed in spirit from obra/superpowers skills/verification-before-completion/, adapted for TriaDev's handoff.json coordination model.
Overview
Claiming work is complete without verification is dishonesty, not efficiency.
Core principle: Evidence before claims, always.
Violating the letter of this rule is violating the spirit of this rule.
The Iron Law
NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE
If you haven't run the verification command in this message, you cannot claim it passes.
The Gate Function
BEFORE claiming any status or expressing satisfaction:
1. IDENTIFY: What command proves this claim?
2. RUN: Execute the FULL command (fresh, complete)
3. READ: Full output, check exit code, count failures
4. VERIFY: Does output confirm the claim?
- If NO: State actual status with evidence
- If YES: State claim WITH evidence
5. ONLY THEN: Make the claim
Skip any step = lying, not verifying
Common Completion Points in TriaDev
| Claim | Requires | Not Sufficient |
|---|
| Tests pass | Test command output: 0 failures | Previous run, "should pass" |
| Coverage ≥ 80% | check_coverage.py exit 0 | Partial check, extrapolation |
| Build succeeds | Build command: exit 0 | Linter passing, logs look good |
| Bug fixed | Test original symptom: passes | Code changed, assumed fixed |
| Regression test works | Red-green cycle verified | Test passes once |
| Task completed (handoff.json) | Read implementation.completed array after write | "Agent reported success" |
| SPEC requirements met | Line-by-line checklist against SPEC.yaml | Tests passing alone |
| value-gate verdict=GO | check_review.py exit 0 on sidecar | Markdown verdict alone |
| phase transition legal | Rule from triadev/references/phase-transitions.md matched | "Looks like the right phase" |
| Schema validation | jsonschema.validate() returns without raise | JSON parses (parse ≠ validate) |
Red Flags — STOP
- Using "should", "probably", "seems to"
- Expressing satisfaction before verification ("Great!", "Perfect!", "Done!", etc.)
- About to commit/push/PR/merge without verification
- Trusting agent/subagent success reports without independent check
- Relying on partial verification
- Thinking "just this once"
- Tired and wanting work over
- ANY wording implying success without having run verification
Rationalization Prevention
| Excuse | Reality |
|---|
| "Should work now" | RUN the verification |
| "I'm confident" | Confidence ≠ evidence |
| "Just this once" | No exceptions |
| "Linter passed" | Linter ≠ compiler |
| "Agent said success" | Verify independently via file/output check |
| "I'm tired" | Exhaustion ≠ excuse |
| "Partial check is enough" | Partial proves nothing |
| "handoff.json updated" | Re-read the file, don't trust the write |
| "Different words so rule doesn't apply" | Spirit over letter |
Key Patterns
Tests:
✅ [Run test command] [See: 34/34 pass] "All tests pass"
❌ "Should pass now" / "Looks correct"
Regression tests (TDD Red-Green):
✅ Write → Run (pass) → Revert fix → Run (MUST FAIL) → Restore → Run (pass)
❌ "I've written a regression test" (without red-green verification)
Build:
✅ [Run build] [See: exit 0] "Build passes"
❌ "Linter passed" (linter doesn't check compilation)
Coverage (tdd-sdd-development):
✅ [Run scripts/check_coverage.py --threshold 80] [See: exit 0] "Coverage meets 80% threshold"
❌ "Wrote more tests" (writing tests ≠ coverage)
SPEC requirements:
✅ Re-read SPEC.yaml → Create checklist per requirement ID → Verify each → Report gaps or completion
❌ "Tests pass, phase complete"
handoff.json state:
✅ Update field → Re-read file → Validate against schema → Report actual state
❌ "Wrote implementation.completed" (write ≠ read-back ≠ schema-valid)
value-gate verdict:
✅ Write sidecar → Run check_review.py → See exit 0 → Write handoff.value_gate.verdict=GO
❌ "Markdown says GO" (sidecar is authoritative, not markdown)
Cross-skill delegation (TriaDev-specific):
✅ Skill A writes its handoff.json section → Skill B reads that section back → Skill B validates → Skill B proceeds
❌ "Skill A said done" (trust but verify via handoff.json re-read)
TriaDev Integration — When Cross-Referenced
The following skills cross-reference this skill at their completion announcement points:
- triadev — before transitioning
current_phase to complete, verify all Extended-path artifacts exist and validate
- tdd-sdd-development — before Phase 4 "complete", verify (a)
.tdd-state.json has red_evidence + green_evidence + coverage ≥ 80, (b) re-read .tdd-state.json after update
- value-first-gate — before writing
verdict=GO to handoff, verify (a) sidecar passes schema, (b) check_review.py exits 0, (c) rubber_stamp_flags.any_triggered == false
- task-workflow — before marking a batch complete, verify all task IDs in that batch appear in
implementation.completed with matching counts
Each calling skill's SKILL.md specifies the exact verification command for its completion point.
Why This Matters
Adopted from Superpowers' hard-earned lesson:
24 failure memories of: trust broken, undefined functions shipped, missing requirements shipped, time wasted on false completion.
For TriaDev specifically:
- handoff.json is the inter-skill contract; if Skill A claims "updated handoff" but the write silently failed, Skill B consuming that section produces wrong output
- Solo PM has no stakeholder to catch false completions; verification is the only checkpoint
When To Apply
ALWAYS before:
- Any variation of success / completion claims
- Any expression of satisfaction ("Great!", "Perfect!", "Done!")
- Any positive statement about work state
- Committing, PR creation, task completion
- Moving to next task
- Writing
status: "complete" or current_phase: "complete" in handoff.json
- Delegating to subagents (verify their output independently)
Rule applies to:
- Exact phrases
- Paraphrases and synonyms
- Implications of success
- ANY communication suggesting completion / correctness
The Bottom Line
No shortcuts for verification.
Run the command. Read the output. THEN claim the result.
This is non-negotiable.