verification-before-completion · mvschwarz — Claude Code skill: how to install
Stops AI agents from claiming a task is done without concrete proof. It requires running fresh tests, builds, or linters before commits and pull requests.
npx skills add mvschwarz/openrig --skill verification-before-completion -a claude-codeWhat verification-before-completion does
The skill enforces a simple rule: evidence before claims. It prevents the model from relying on phrases like "should pass" or blindly trusting sub-agent status reports. Before making a commit or opening a pull request, the agent must inspect direct command output showing zero failures on the current candidate. An earlier passing run becomes invalid once source files change.
It also instructs the agent to inspect actual output content rather than trusting exit codes blindly. Clean parses do not guarantee runtime stability. For regression bugs, the skill requires a red-green cycle: verify that the test fails without the fix before checking the pass.
What it helps with
- prevent premature completion claims without fresh test runs
- verify build exit codes before committing or pushing changes
- enforce red-green cycles for regression testing
- validate sub-agent deliverables instead of trusting status messages
Example prompts for the agent
- Fix the session timeout bug and verify the fix with tests before committing
- Refactor the payment helper and check that the build succeeds
- Prepare a pull request for the auth module changes
How to install verification-before-completion
1Skills CLI (Vercel)
npx skills add mvschwarz/openrig --skill verification-before-completion -a claude-code2Manually: put the files in place
~/.claude/skills/verification-before-completion/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/verification-before-completion/
1Skills CLI (Vercel)
npx skills add mvschwarz/openrig --skill verification-before-completion -a codex2Manually: put the files in place
.agents/skills/verification-before-completion/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add mvschwarz/openrig --skill verification-before-completion -a cursor2Manually: put the files in place
.cursor/skills/verification-before-completion/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install mvschwarz/openrig verification-before-completion2Manually: put the files in place
.github/skills/verification-before-completion/SKILL.md1Skills CLI (Vercel)
npx skills add mvschwarz/openrig --skill verification-before-completion -a gemini-cli2Platform CLI
gemini skills install https://github.com/mvschwarz/openrig --path skills/_canonical/process/verification-before-completionManually: put the files in place
.devin/skills/verification-before-completion/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add mvschwarz/openrig --skill verification-before-completion -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about verification-before-completion
How to install verification-before-completion in Claude Code?
Run npx skills add mvschwarz/openrig --skill verification-before-completion -a claude-code. This installs the instruction file into ~/.claude/skills/verification-before-completion/SKILL.md.
What does verification-before-completion do?
It stops the AI agent from claiming code works based on assumptions or partial checks. The agent must inspect explicit proof, such as zero test failures or exit code 0 on the build command.
Why does the skill warn against trusting clean exit codes alone?
Commands can exit with code 0 while outputting messages indicating missed matches or empty runs. The rule requires checking output text against expected values rather than counting on status codes alone.
Source text
SKILL.md · Apache-2.0
---
name: verification-before-completion
description: Use when about to claim work is complete, fixed, or passing, or before committing or creating PRs
metadata:
openrig:
vendored_from: "Obra Superpowers (https://github.com/obra/superpowers)"
vendoring_pattern: modify-the-file
last_upstream_check: "2026-05-13 (diff against plugin source pulled 2026-05-11 = identical)"
---
# Verification Before Completion
## Overview
Claiming work is complete without verification is dishonesty, not efficiency.
**Core principle:** Evidence before claims.
**This rule serves shipping — it is not a ritual that outranks it.** It governs one thing: *claims that a verifiable result holds* ("tests pass", "build succeeds", "bug fixed") — have evidence for the result before you assert it, and scale the check to the stakes (a one-line copy tweak is not a test-suite ceremony). Don't dodge it with synonyms; equally, don't inflate it into a tax on the word "done" or a reason to keep re-proving instead of shipping the working thing.
## The Rule
Before claiming a verifiable result, inspect evidence that supports that result for the candidate and environment you name. Use an existing result while its relevant inputs and assumptions still hold; rerun the affected check when they change or are uncertain. State whether you ran the check or inspected another owner's evidence. A source read, syntax check or partial test supports only its stated scope. Ordinary progress reports, delegation and moving to another task do not require a new test run. Required project checks still apply.
A completed run is not automatically current, and unchanged source does not establish unchanged live state.
For a claim about performance, also read [references/performance-claims.md](references/performance-claims.md).
## Common Failures
| Claim | Requires | Not Sufficient |
|-------|----------|----------------|
| Tests pass | Test output with 0 failures, for the candidate you name | A run on an older candidate, "should pass" |
| Linter clean | Linter output: 0 errors | 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 |
| Delivered outcome | Relevant artifact and observed result | An agent's success message or a diff alone |
| Requirements met | Promised outcomes checked against applicable evidence, gaps named | Tests passing |
## Red Flags - STOP
- Using "should", "probably", "seems to"
- Claiming a specific result is *proven* ("tests pass", "it's fixed", "build's green") without evidence that applies to it — enthusiasm itself is fine; an unverified **result claim** is the flag
- About to commit/push/PR without verification
- Trusting agent success reports
- Claiming more than a partial check covers
- Thinking "just this once"
- Tired and wanting work over
## Key Patterns
**Tests:**
```
✅ [Run test command, or read the named candidate's CI output] [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)
```
**Requirements:**
```
✅ Check each promised outcome against applicable evidence → Report gaps or completion
❌ "Tests pass, phase complete"
```
**Agent delegation:**
```
✅ Agent reports success → Inspect the artifact and the evidence it names → Report what was checked and what wasn't
❌ Pass on the report alone
```
## When the check itself lies — content over shape
A passing check is necessary but not sufficient: a check can exit clean and still prove nothing. These are the named ways a green check lies — the failure siblings behind "evidence before claims." (Deeper treatment of *what* you verify against: `reference-first-verification`.)
- **Assert on CONTENT, never shape or count.** Output that *looks* like success — a non-zero count, a clean exit, no error text — can carry failure as its content. Before trusting a check, ask what its output looks like *when it fails*: if failure and success are indistinguishable at a glance, the check proves nothing. (`[1 lines]` and `No matches found` both read as "a match" to a line-count.)
- **Compare the returned value to the value you PASSED — never to a description of it.** A confident label (`evidenceRef NOW SET:` printed above the untouched original) is indistinguishable from a verification in a transcript. Diff the actual result against your actual input, not against a claim about it.
- **Find the untested axis.** Thorough coverage of ONE axis reads as thorough coverage overall. Ask what every one of your tests shares — a healthy manifest, a default option value, the happy path — and treat that shared assumption as the dimension you never tested.
- **A syntax check proves parseability and nothing else.** A clean `node --check` / lint / parse pass is the *covered* axis; boot and runtime are the untested one. Parseable ≠ sound.
- **A failure whose shape is a HANG reports nothing.** A bare `await` against a stated deadline that never re-checks cannot fail loudly. Race it against a timer so failure has a shape you can see.
- **A completeness inventory read through a truncating display is worthless.** When deciding *which occurrences to change*, count with `grep -c` / `grep -o` / full-line output — never `cut`, `head`, or a pager, which can hide a match *past* the cut. Distinguish *"I found N"* (a count) from *"I saw N"* (a display). Audit multiline prose **by paragraph, not by line** — a line filter both misses long-line matches and false-flags paragraphs whose companion text is on the next line. Then re-audit with a **different method** than the one that built the inventory — same-method re-checking reproduces the blind spot. (Empty/short output is a claim about your COMMAND until re-proven a second way.)
© mvschwarz · Apache-2.0 · mvschwarz/openrig
Similar skills
All skills for Testing and QA →verification-before-completion by other authors comes first.