Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Before declaring any task complete, actually verify the outcome. Run the code. Test the fix. Check the output. AI-generated code optimizes for plausible-looking output, not verified-correct output. Use when completing code changes, bug fixes, or any task where correctness matters.
.claude/skills/adityapeshave-sophos-prove-it/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 397% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 347% | 0% |
| case-02 | ✓→✗ | ▼ Worse | -33% | 0% |
| case-03 | ✓→✗ | ▼ Worse | -47% | 0% |
| case-09 | ✓→✗ | ▼ Worse | -14% | 0% |
AI-generated code comes from pattern-matching on training data. Something can look syntactically perfect, follow best practices, and still be wrong. The model optimizes for "looks right" not "works right." Verification is a separate cognitive step that must be explicitly triggered. This skill closes the loop between implementation and proof.
Limitations this skill addresses:
1. Generation vs Execution Code is generated but not run during generation. Confidence comes from "this looks like working code" not from "this was executed and the result observed."
2. Pattern-Matching Blindness Code that matches common patterns feels correct. But subtle bugs hide in the gaps between patterns. Off-by-one errors. Wrong variable names. Missing edge cases. These "look right" but aren't.
3. Confidence-Correctness Gap High confidence in output doesn't correlate with actual correctness. The agent is often most confident when most wrong, because the wrong answer pattern-matched strongly.
4. No Feedback Loop Code is generated sequentially. There's no natural "go back and check" step. Without explicit verification, errors compound silently.
ALWAYS verify before declaring complete:
Code Changes:
Fixes:
Claims:
Before saying any of these:
STOP. You haven't verified yet.
| Change Type | Verification | |-------------|--------------| | New code | Run it with test input | | Bug fix | Reproduce original bug, confirm fixed | | Function change | Call the function, check output | | Config change | Restart service, test affected feature | | Build script | Run the build | | API endpoint | Make a request | | UI change | Describe what user should see, or screenshot |
bash# Don't just write the test - run it python -m pytest tests/test_new_feature.py # Don't just fix the code - prove the fix python -c "from module import func; print(func(edge_case))" # Don't just update config - verify it loads node -e "console.log(require('./config.js'))"
Verified:
What I changed:
- Added input validation to user_signup()
How I verified:
- Ran: python -c "from auth import user_signup; user_signup('')"
- Expected: ValidationError
- Got: ValidationError("Email required")
Proof that it works. Done.Minimal test that proves basic functionality:
bash# After writing a new function python -c "from new_module import new_func; print(new_func('test'))"
If this crashes, you're not done.
After fixing a bug, trigger the original failure:
bash# Bug was: crash on empty input python -c "from module import func; func('')" # Should not crash anymore
Before claiming code is complete:
bash# Does it at least compile/parse? python -m py_compile new_file.py npm run build cargo check
After changes that affect multiple components:
bash# Start the service npm run dev & # Hit the affected endpoint curl http://localhost:3000/affected-route # Check for expected response
Before declaring done:
[ ] Code runs without syntax errors
[ ] Function produces expected output on happy path
[ ] Edge case handled (empty, null, boundary)
[ ] Original bug/issue no longer reproduces
[ ] No new errors introduced (check logs)
[ ] Build passes (if applicable)User: "Fix the divide by zero error"
*edits code to add check*
Done! Added a check for zero before dividing. The function now returns
None if the divisor is zero.This is unverified. The code was never run.
User: "Fix the divide by zero error"
*edits code to add check*
Let me verify the fix:
$ python -c "from math_utils import safe_divide; print(safe_divide(10, 0))"
None
$ python -c "from math_utils import safe_divide; print(safe_divide(10, 2))"
5.0
Verified:
- Division by zero returns None (was: crashed)
- Normal division still works
- Fix confirmed.User: "Update the production config"
I've updated config/production.json with the new API endpoint.
Verification status: UNABLE TO VERIFY
- This is production config
- I can't safely test against production
- Recommend: Test in staging first, or have ops verify after deploy
Change is made but unverified. Proceed with caution.When "Done!" is said without verifying, it's not reporting a fact. It's making a prediction based on pattern-matching. Sometimes that prediction is wrong.
Verification converts prediction into observation. It's the difference between "this should work" and "this works."
One is a guess. One is proof.
Prove it.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 5,380 | 6,425 | +19% | 1 | 1 | 0% | 261 | 1,802 | +590% | 0 | 0 | — |
case-02 | pass→fail | 11,788 | 4,335 | -63% | 1 | 1 | 0% | 2,577 | 1,723 | -33% | 0 | 0 | — |
case-03 | pass→fail | 21,222 | 5,425 | -74% | 1 | 1 | 0% | 3,446 | 1,820 | -47% | 0 | 0 | — |
case-04 | fail→fail | 2,685 | 3,345 | +25% | 1 | 1 | 0% | 319 | 1,817 | +470% | 0 | 0 | — |
case-05 | fail→pass | 3,893 | 5,401 | +39% | 1 | 1 | 0% | 480 | 2,385 | +397% | 0 | 0 | — |
case-06 | pass→pass | 13,312 | 14,254 | +7% | 1 | 1 | 0% | 2,416 | 3,889 | +61% | 0 | 0 | — |
case-07 | fail→pass | 5,027 | 7,563 | +50% | 1 | 1 | 0% | 630 | 2,813 | +347% | 0 | 0 | — |
case-08 | pass→pass | 14,779 | 16,655 | +13% | 1 | 1 | 0% | 2,226 | 4,455 | +100% | 0 | 0 | — |
case-09 | pass→fail | 12,787 | 1,917 | -85% | 1 | 1 | 0% | 2,109 | 1,815 | -14% | 0 | 0 | — |
case-10 | fail→fail | 4,172 | 5,218 | +25% | 1 | 1 | 0% | 484 | 1,745 | +261% | 0 | 0 | — |
case-20 | pass→fail | 10,614 | 11,052 | +4% | 1 | 1 | 0% | 2,014 | 3,634 | +80% | 0 | 0 | — |
case-11 | pass→pass | 7,755 | 12,238 | +58% | 1 | 1 | 0% | 1,501 | 3,677 | +145% | 0 | 0 | — |
case-12 | pass→pass | 6,178 | 13,724 | +122% | 1 | 1 | 0% | 1,085 | 3,400 | +213% | 0 | 0 | — |
case-13 | fail→fail | 3,160 | 7,382 | +134% | 1 | 1 | 0% | 515 | 2,752 | +434% | 0 | 0 | — |
case-14 | pass→fail | 10,401 | 5,234 | -50% | 1 | 1 | 0% | 1,710 | 1,753 | +3% | 0 | 0 | — |
case-15 | pass→fail | 12,782 | 3,334 | -74% | 1 | 1 | 0% | 2,740 | 1,744 | -36% | 0 | 0 | — |
case-16 | pass→pass | 12,285 | 7,322 | -40% | 1 | 1 | 0% | 1,839 | 2,744 | +49% | 0 | 0 | — |
case-17 | fail→fail | 3,034 | 5,698 | +88% | 1 | 1 | 0% | 357 | 1,851 | +418% | 0 | 0 | — |
case-18 | pass→pass | 16,918 | 11,905 | -30% | 1 | 1 | 0% | 2,053 | 3,844 | +87% | 0 | 0 | — |
case-19 | fail→fail | 4,951 | 4,873 | -2% | 1 | 1 | 0% | 189 | 1,763 | +833% | 0 | 0 | — |
case-21 | pass→pass | 14,575 | 10,767 | -26% | 1 | 1 | 0% | 2,441 | 3,154 | +29% | 0 | 0 | — |
case-22 | pass→fail | 5,905 | 7,081 | +20% | 1 | 1 | 0% | 1,075 | 2,710 | +152% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 15 counted toward the lift figure. The other 7 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -23 percentage points is the difference between those two pass rates over the 15 comparable cases. 7 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.