Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Works a reported bug the disciplined way — reproduce it reliably, read the actual error signal, isolate one hypothesis at a time, then fix the root cause and verify. Use when someone shares a stack trace, failing test, or bug report and asks how to fix it or what is going wrong. Do NOT use for LLM tool-call/function-call failures (that is tool-use-debugger), for writing new features, or for general style/security review.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 561% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 561% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 639% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 599% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 637% | 0% |
Turns "here's a bug, fix it" into a disciplined investigation. The base model, shown a symptom, tends to jump straight to a plausible-looking patch — often one that suppresses the symptom without touching the cause, and without ever confirming the bug was reproduced or the fix actually works. This skill enforces the debugging method taught for decades (Agans' Debugging, the scientific method applied to code): make it fail on demand, look at the real evidence, change one thing at a time, fix the actual cause, then prove it.
Activate this skill when the user presents a defect and asks for help fixing it:
You cannot fix what you cannot see fail. Establish a reliable trigger first.
A fix proposed against a bug you never reproduced is a guess. Reproduction is the gate.
The place a program notices a problem is usually not the place the problem is.
NoneType has no attribute x) from the cause (why is it None here — which upstream call returned nothing?).Form a single, falsifiable guess about the cause, then test that one thing.
git bisect across commits, binary-search the failing range. Each step should halve the suspect space.try/except that swallows the error, a null-guard bolted on where it crashed, a retry around a call that shouldn't fail — these hide the bug, they don't fix it. Flag them as symptom patches, not fixes.When walking through a bug, structure the answer as:
markdown**Reproduce:** [the minimal trigger; or what's needed to get one] **Signal:** [what the trace/assertion actually says, traced to its origin] **Hypothesis:** [single falsifiable cause] → [the one check that confirms/refutes it] **Root cause:** [the underlying defect, distinguished from the symptom] **Fix:** [the change at the cause] **Verify:** [re-run the repro + which neighbors to re-check + regression test]
textOur checkout endpoint occasionally 500s. The log shows: TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' at compute_total (billing.py:88) def compute_total(cart): total = 0 for item in cart.items: total += item.price * item.qty return total + cart.shipping It doesn't happen on every order. My first thought is to just default shipping to 0.
Reproduce: It's intermittent, so first make it deterministic. The trace points at total + cart.shipping, so the failing orders are the ones where cart.shipping is None. Find one such order (or construct a cart with shipping=None) and confirm it 500s every time — that's the reproduction.
Signal: The error is at return total + cart.shipping, and the operands are int + NoneType. total is always an int (starts at 0), so the None is cart.shipping. The crash location is the symptom; the question is why is shipping ever None?
Hypothesis: Shipping is populated by an upstream step (a rate lookup or a default), and for some orders that step is skipped or returns nothing. Check: where is cart.shipping set, and under what branch does it stay unset? One check — trace the field's assignment, don't edit the crash line yet.
Root cause (likely): an order path that never assigns shipping (e.g., a code created before shipping was required, or a rate-lookup that returns None on miss). Defaulting to 0 at the crash site is a symptom patch — it stops the 500 but silently under-charges the customer, which is worse than the crash.
Fix at the cause: ensure the field is set where orders are built (or make the rate lookup return an explicit value / raise on miss). If unbilled shipping should truly be free, encode that decision upstream, not as a fallback at the arithmetic.
Verify: re-run the reproducing order — it must return a correct total, not just avoid the exception. Then re-run the checkout tests, and add a regression test for an order with no shipping set.
except, raise with the cause) so you can read the real signal — that's step 2, not the fix.A good execution of this skill should:
Other measured skills in the registry, with their headline benchmark lift.