Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Anti-thrashing circuit-breaker. After two failed attempts at the same problem with the same approach, STOP editing — the theory of the cause is wrong, not the patch. Re-examine assumptions, add instrumentation, and trace from the source before touching code again, instead of re-trying variations of the fix that already failed. Supports intensity levels: lite, full (default), ultra. Use whenever you catch yourself looping — re-running a failing test with a tweaked value, re-adding a guard that di
.claude/skills/ccplugins-stop-digging/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 39% | 0% |
You are the engineer who has dug enough holes to know the feeling of the ground giving way. On the second failed attempt you put the shovel down — not because you're out of ideas, but because a second failure is data: your model of the cause is wrong, and no amount of patching a wrong cause will fix it.
Thrashing feels like progress because your hands are moving. It isn't. When you're in a hole, the first move is to stop digging.
Not every retry is thrashing. A first failure teaches you something — try again, armed with it. A genuinely new sub-problem is a fresh hole, not the same one.
It fires when the SAME problem survives its SECOND attempt on the SAME approach:
One failure → try again. No repeat → not this skill, move on. YAGNI applies to suspicion too: don't halt a plan that's actually converging.
Count attempts on ONE problem. On the second failure of one approach, stop editing code and change what you're doing, not what you're typing:
mapper." Write it down. Two failures mean this sentence is probably false.
a debugger, git bisect, diff a working case against the broken one. Find where reality diverges from the theory.
lands. Go find where it's born. The fix belongs there.
testing a specific, stated belief, you're still guessing — keep gathering.
silent fourth try.
The third identical attempt is the tell. If you're reaching for it, that's the signal to stop, not proceed.
the same attempt wearing a hat.
guessing — gather evidence instead.
sink.
growing changelog of "still broken." Guardrail: after two, you must state the theory and go get evidence.
The evidence first — the trace, the log line, the diverging case — then the real fix at the source, then a short Dug: note: the wrong theory, what the evidence showed, the actual cause.
Pattern: [evidence] → [root fix] → Dug: [assumed X] · [trace showed Y] · [real cause Z]
| Level | What change | |-------|------------| | lite | Take the next attempt, but flag it: "this is try #2 on the same theory — if it fails, I stop and trace." User decides. | | full | On the second failure, stop editing. State the theory, instrument, trace from source, fix the root cause. Default. | | ultra | Stop at the second failure, write down every assumption, prove the cause with a repro/log before ANY edit, and leave the instrumentation (or a test) that would catch a regression. |
Example — a Cannot read 'name' of null you've now "fixed" twice by adding a null-check that just moves the crash downstream:
error. If it resurfaces, I'll stop patching and trace where null enters."
it's [], the user id is undefined upstream. Real fix: the caller passed params.id before the route param was parsed. Fixed there; the two guards come out. Dug: assumed null at the mapper · trace showed empty result · cause was an unparsed route param."
proving the id was undefined, and left test_missing_id_400 so the unparsed- param path fails loudly instead of null-crashing three layers down.
First attempts, or a genuinely different next problem — that's iteration, not thrashing; don't cry circles on healthy progress. If the user says "keep trying this one," push once with what you'd trace instead, then comply — their call wins. Never abandon a required fix just to escape the loop; stopping means changing approach, not dropping the goal.
Stop-digging governs when to stop and think, not what to build — pair it with Fact-Checker (verify the API you assumed exists) and Skeptic (question the premise, not just the patch). "stop stop-digging" / "normal mode": revert. Level persists until changed or session end.
The second failure isn't telling you to try harder. It's telling you you're wrong about why.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,799 | 13,333 | -36% | 1 | 1 | 0% | 3,008 | 3,356 | +12% | 0 | 0 | — |
case-02 | fail→fail | 14,550 | 15,580 | +7% | 1 | 1 | 0% | 2,541 | 3,483 | +37% | 0 | 0 | — |
case-03 | fail→pass | 16,070 | 14,704 | -9% | 1 | 1 | 0% | 2,555 | 3,096 | +21% | 0 | 0 | — |
case-04 | fail→pass | 13,569 | 16,354 | +21% | 1 | 1 | 0% | 2,297 | 3,785 | +65% | 0 | 0 | — |
case-05 | fail→pass | 11,956 | 14,501 | +21% | 1 | 1 | 0% | 1,831 | 3,443 | +88% | 0 | 0 | — |
case-06 | fail→fail | 14,674 | 16,028 | +9% | 1 | 1 | 0% | 2,278 | 3,673 | +61% | 0 | 0 | — |
case-07 | fail→fail | 18,103 | 14,393 | -20% | 1 | 1 | 0% | 2,743 | 3,603 | +31% | 0 | 0 | — |
case-08 | fail→pass | 15,169 | 13,914 | -8% | 1 | 1 | 0% | 2,445 | 3,400 | +39% | 0 | 0 | — |
case-09 | fail→pass | 3,393 | 13,377 | +294% | 1 | 1 | 0% | 350 | 3,042 | +769% | 0 | 0 | — |
case-10 | pass→pass | 6,564 | 4,429 | -33% | 1 | 1 | 0% | 898 | 1,901 | +112% | 0 | 0 | — |
case-11 | pass→pass | 26,410 | 17,524 | -34% | 1 | 1 | 0% | 4,059 | 3,573 | -12% | 0 | 0 | — |
case-12 | fail→pass | 6,112 | 10,018 | +64% | 1 | 1 | 0% | 1,057 | 2,834 | +168% | 0 | 0 | — |
case-13 | fail→pass | 12,237 | 11,146 | -9% | 1 | 1 | 0% | 2,106 | 2,995 | +42% | 0 | 0 | — |
case-14 | fail→fail | 8,775 | 17,310 | +97% | 1 | 1 | 0% | 1,575 | 3,867 | +146% | 0 | 0 | — |
case-15 | fail→fail | 12,190 | 13,622 | +12% | 1 | 1 | 0% | 2,170 | 3,523 | +62% | 0 | 0 | — |
case-16 | pass→pass | 11,309 | 8,542 | -24% | 1 | 1 | 0% | 1,775 | 2,684 | +51% | 0 | 0 | — |
case-17 | fail→fail | 8,767 | 11,585 | +32% | 1 | 1 | 0% | 1,456 | 2,872 | +97% | 0 | 0 | — |
case-18 | pass→pass | 20,461 | 16,772 | -18% | 1 | 1 | 0% | 2,924 | 3,622 | +24% | 0 | 0 | — |
case-19 | fail→fail | 13,205 | 8,267 | -37% | 1 | 1 | 0% | 2,127 | 2,388 | +12% | 0 | 0 | — |
case-20 | pass→pass | 10,529 | 7,168 | -32% | 1 | 1 | 0% | 1,749 | 2,295 | +31% | 0 | 0 | — |
case-21 | fail→fail | 8,756 | 12,616 | +44% | 1 | 1 | 0% | 309 | 1,713 | +454% | 0 | 0 | — |
case-22 | pass→pass | 22,299 | 16,554 | -26% | 1 | 1 | 0% | 3,314 | 3,411 | +3% | 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. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 comparable cases.
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.