systematic-debugging · git:20261101.7852a8a · 2026-11-01 · sha256 9f3a307c46a3a4b2

systematic-debugging git:20261101.7852a8aA

Immutable. This exact content never changes and is served at /api/v1/blob/9f3a307c46a3a4b2.

---
name: systematic-debugging
description: Debugs by evidence instead of guessing. Use whenever a test fails, behavior regressed, a bug is intermittent or environment-specific, or the user needs to find which commit introduced a defect, even if they only say "this is broken" or "why does this fail". Reproduces, isolates and proves the root cause, then locks the fix with a regression test. Uses git bisect, blame and reflog.
---

# systematic-debugging

Debug by evidence, not by guessing. Each step narrows the search space until the root cause is proven and a regression test locks the fix.

```
systematic-debugging/
├── SKILL.md
├── scripts/
│   ├── bisect_helper.sh     safe `git bisect run` wrapper with sanity checks and automatic reset
│   └── flaky_runner.sh      run a command N times, report failure rate, save first failure log
├── references/
│   ├── bisect-playbook.md   preconditions, exit codes, merge commits, skipping, after the hit
│   └── flaky-and-env.md     flaky test causes, "works on my machine" checklist, delta debugging
└── templates/
    └── bug-report.md        report with evidence, root cause, regression test, verification
```

## When to use

- A test fails or behavior regressed
- A bug is intermittent or environment-specific
- You need the exact commit that introduced a defect

## Method

1. **Reproduce**: build the smallest reliable failing case. If it is intermittent, measure the rate with `scripts/flaky_runner.sh`.
2. **Observe**: collect logs, stack traces, inputs and versions.
3. **Hypothesize**: write 2 to 3 candidate causes, ranked by likelihood, each with a test that would disprove it.
4. **Isolate**: bisect history with `scripts/bisect_helper.sh`, or shrink the input by halves.
5. **Prove**: confirm the root cause with a failing test or a printed fact. A theory without evidence is still a guess.
6. **Fix**: change the minimum necessary.
7. **Guard**: add a regression test that fails before and passes after the fix, then run the full suite.
8. **Record**: put cause and fix in the commit message and fill `templates/bug-report.md` for non-trivial bugs.

## Choosing the isolation tool

| Situation | Tool |
|-----------|------|
| It worked before, you know a good commit | `bash scripts/bisect_helper.sh <good> HEAD -- <test>` |
| Which change touched this line | `git blame -L 40,60 file` then `git log -p -- file` |
| When did this string appear or vanish | `git log -S "name" --oneline` |
| Fails sometimes | `bash scripts/flaky_runner.sh 50 -- <test>` then `references/flaky-and-env.md` |
| Works here, fails there | env and dependency diff, clean `git worktree` |
| Lost work or odd HEAD | `git reflog`, `git stash list` |
| Large input triggers it | halve the input until minimal |

Details and edge cases: `references/bisect-playbook.md`.

## Git-powered commands

```bash
git bisect start && git bisect bad HEAD && git bisect good v1.2.0
git bisect run /tmp/run_test.sh     # keep the script outside the repo
git bisect reset

git blame -L 40,60 path/to/file
git log -S "functionName" --oneline
git reflog
git stash push -m "wip debugging"
git worktree add ../repro <commit>
```

## Instrumentation tips

```bash
# Shell scripts
set -euxo pipefail
```

```python
import logging
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(threadName)s %(message)s")
# breakpoint()  # drop into pdb at the suspicious line
```

## Rules of thumb

- Change one variable at a time
- If you cannot reproduce it, you cannot claim to have fixed it
- One green run does not prove an intermittent bug is fixed; repeat it
- Verify that the code you edit is the code that actually runs
- Keep the bisect test script outside the repository, or old commits will not contain it
- After 30 minutes without progress, explain the problem in writing (rubber duck)
- Never commit a fix without a test or a documented manual proof

## What to report back

| Field | Content |
|-------|---------|
| Root cause | one paragraph with the evidence that proves it |
| First bad commit | sha and subject, if bisected |
| Fix | files changed and why it is minimal |
| Regression test | file and name, shown failing before the fix |
| Residual risk | similar code paths checked or not |

## Related skills

- `commitsmith`: write the commit message for the fix, naming the root cause
- `pdf-processing`: an example pipeline that benefits from verification-first debugging
- `multi-agent-orchestration`: trace handoff logs to find which agent produced a wrong result