| name | debugging-agent-runs |
| description | Recover when the AGENT itself is stuck — looping, repeating the same failed action, burning tokens/budget, overflowing context, drifting from the goal, or acting on stale state. Use when a run isn't converging and reworded retries aren't helping. This is a workflow you follow, not a hidden runtime that auto-heals. For bugs in the product code use fixing-bugs. |
| license | MIT |
Debugging agent runs
When the problem is the run, not the code: the agent keeps trying variations of the same thing, talks itself in circles, or acts on what it remembers instead of what's true. This skill is a recovery loop to break that. Be honest: it's a discipline you apply — it can't magically fix a stuck process.
Read first (always)
List learnings/ and read anything relevant — past failure modes specific to this project belong there.
Recognize the failure mode
| Symptom | Likely cause |
|---|
| Same action retried with slightly reworded prompts | Loop / no new information between attempts |
| Output truncated, "forgetting" earlier context | Context overflow → compact or restart with a tighter scope |
| Repeated 429 / timeouts | Rate limit → back off, batch, slow down |
| Edits land on the wrong branch/files; conflicts | Branch / diff drift → re-verify git state |
| Confident claims that don't match reality | Stale state → trusting memory over the world |
| Scope keeps widening while nothing lands | Scope creep → shrink to one verifiable thing |
The recovery loop
Run these in order — most stuck runs are fixed by step 1–2:
- Restate the real objective in one sentence. If you can't, that's the bug. Re-anchor to the user's actual goal, not the sub-task you spiraled into.
- Verify world state — don't trust memory. Re-read the files,
git status/diff, and the actual test/command output. The model's recollection is often stale; reality isn't.
- Shrink the failing scope. Reduce to the smallest reproduction or the single failing unit. Big scope hides the cause.
- Run one discriminating check — the single command/test whose result tells you which branch of the problem you're in. Don't guess; get one new bit of information.
- Only then retry — and change the approach, not just the wording. If the new info didn't change your plan, you're still looping.
Anti-patterns
- Retrying the same action three times with reworded prompts (no new information = a loop).
- Trusting your memory of the code/state instead of re-reading it.
- Widening scope when stuck (the opposite of step 3).
- Fabricating that something "should now work" without a check that proves it.
When to stop and ask the human
After one full recovery pass with no progress — or on a budget/rate-limit wall — stop and surface it: the objective, what you verified, the one check you ran, and where it's blocked. A clear handoff beats more silent retries.
Capture a learning
If a project-specific failure mode or recovery trick shows up, append a learnings/YYYY-MM-DD-slug.md (or use /learn).
See also
skills/fixing-bugs — once you've isolated a real code bug, switch to the reproduce-first fix workflow.
skills/running-agent-loops — stop conditions and escalation for unattended loops.