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.