Systematic Debugging
Overview
Guessing fixes wastes time and creates new bugs. Quick patches hide root problems.
Core principle: Never fix before finding the root cause. Symptom fixing is failure.
Iron Law
Never propose a fix without root cause investigation.
Phase 0 or Phase 1 must be completed before any fix is proposed.
Phase 0 fixes are ONLY allowed when ALL of these are true:
- External research found an official solution or known issue for this exact error
- Change is single file, single point (config value, import, typo)
- No logic changes
When to Use
All technical problems:
- Test failures, build errors, deploy errors
- Config conflicts, dependency issues
- Infrastructure/environment problems
- Unexpected behavior, performance issues
Especially when:
- Under time pressure (urgency breeds guessing)
- "Let me just quickly fix this" comes to mind
- Multiple fix attempts have already been tried
- Previous fixes didn't work
- You don't fully understand the problem
The Phases
Each Phase must complete before proceeding to the next.
Phase 0: Quick Assessment
Run immediately when an error occurs. Before any fix attempt.
Classify the error — read the error message/symptoms:
- Same code works in different environment? → Environment issue
- After recent dependency/version change? → Dependency issue
- Only fails in specific code path? → Code issue
External research (exact match, 5 min max) — check official docs and GitHub Issues for known issues. Don't rely on self-knowledge alone.
- See:
references/external-research-guide.md
Branch decision:
- All Iron Law conditions met → Fix in Phase 0
- Any condition unmet → Enter Phase 1 full process
- Phase 0 quick-fix fails: Undo (git checkout/undo), enter Phase 1. This attempt counts in the fix counter.
Phase 1: Root Cause Investigation
Before any fix attempt:
Read the error carefully
- Don't skip errors/warnings
- Read the entire stack trace
- Record line numbers, file paths, error codes
Reproduce consistently
- Get exact reproduction steps
- Every time? If intermittent, collect more data
Check recent changes
- git diff, recent commits
- New dependencies, config changes
- Environment differences (env vars, Node/runtime version, OS)
Research external sources (deep read)
- Based on Phase 0 exact match results, investigate further
- Read official docs for the failure mechanism
- Check release notes for breaking changes
- See:
references/external-research-guide.md
Collect evidence in multi-component systems
- Log data in/out at each component boundary
- Run once to find where it breaks
- Then deep-dive into that component
Trace data flow
- Where does the wrong value originate?
- Trace the call stack backwards to the source
- See:
references/root-cause-tracing.md
Phase 2: Pattern Analysis
- Find similar working code in the same codebase
- Compare with reference implementations — read the full reference docs, don't skim
- Identify all differences between working and broken — don't assume "that's irrelevant"
- Map dependencies — what config, environment, other components are needed
Phase 3: Hypothesis and Testing
Before entering Phase 3:
- Verify clean state (git status)
- If not clean: git stash or save checkpoint
- On hypothesis failure: rollback to safe point, try new hypothesis (no cumulative fixes)
- Form a single hypothesis: "X is the root cause because Y" — specific, not vague
- Test minimally: smallest change to verify the hypothesis. One variable at a time.
- Verify before proceeding:
- Success → Phase 4
- Failure → New hypothesis (don't stack fixes on top of failed ones)
Phase 4: Implementation
- Write a failing test — simplest reproduction, automated if possible, before fixing
- Apply a single fix — only the identified root cause, one change at a time, no "while I'm at it"
- Verify the fix — test passes? No other tests broken? Problem actually resolved?
- If fix doesn't work:
- How many fix attempts so far?
- Under 3: return to Phase 1 with new information
- 3 or more: proceed to Phase 4.5
Phase 4.5: Architecture Question
Pattern of 3+ failed fixes:
- Each fix reveals new problems elsewhere
- Fix requires "major refactoring"
- Each fix creates symptoms in other places
Stop immediately and ask fundamental questions:
- Is this pattern itself sound?
- Are we clinging to it out of inertia?
- Should we refactor the architecture instead of fixing symptoms?
Report to user and discuss before any more fix attempts.
Red Flags — If you think this, STOP
- "Let me quickly fix it and investigate later"
- "Let me try changing X and see if it works"
- "Let me bundle multiple changes and test once"
- "Skip tests, just check manually"
- "It's probably X, let me fix it"
- "I don't fully understand but this might work"
- "Let me just try one more fix" (after 2+ attempts)
- "I don't need to check external docs for this one"
- "This is definitely a code issue" (without checking environment)
Any of the above: STOP. Return to Phase 0/1.
3+ fix failures: Architecture Question (Phase 4.5)
Common Rationalizations
| Excuse |
Reality |
| "Simple problem, don't need the process" |
Simple problems have root causes too. The process is fast for simple bugs. |
| "Too urgent for process" |
Systematic debugging is faster than guessing. |
| "Let me try this first, then investigate" |
First fix sets the pattern. Start right. |
| "I'll write tests after fixing" |
Fixes without tests don't last. Test first. |
| "Bundle changes to save time" |
Can't tell what worked. Creates new bugs. |
| "Docs are too long, I'll wing it" |
Partial understanding = guaranteed bugs. Read it all. |
| "I can see the problem, just fix it" |
Seeing symptoms ≠ understanding root cause. |
| "One more fix" (2+ failures) |
3+ failures = architecture problem. Ask, don't fix. |
| "I know this error, no need to check docs" |
LLM confidence ≠ accuracy. Verify externally. |
Supporting Techniques
See references in this directory:
references/external-research-guide.md — External docs/GitHub Issues lookup procedure
references/root-cause-tracing.md — Call stack backtracing to find bug origins
Quick Reference
| Phase |
Key Activity |
Success Criteria |
| 0. Quick Assessment |
Error classification, external research (exact match) |
Error type classified + 1+ external search done |
| 1. Root Cause |
Read errors, reproduce, check changes, deep research |
Understand what breaks and why |
| 2. Pattern |
Find working similar code, compare |
Differences identified |
| 3. Hypothesis |
Single hypothesis, minimal test |
Confirmed or new hypothesis |
| 4. Implementation |
Write test, fix, verify |
Bug fixed, tests pass |
| 4.5. Architecture |
Stop after 3 failures, report |
Architecture review decision |
1---2name: systematic-debugging3description: Structured debugging methodology — use before proposing fixes for any error or failure. Covers: code bugs, build errors, deploy failures, config conflicts, dependency issues, infra problems. Also use when previous fix attempts failed or root cause is unclear.4---56# Systematic Debugging78## Overview910Guessing fixes wastes time and creates new bugs. Quick patches hide root problems.1112**Core principle: Never fix before finding the root cause. Symptom fixing is failure.**1314## Iron Law1516```17Never propose a fix without root cause investigation.18```1920Phase 0 or Phase 1 must be completed before any fix is proposed.21Phase 0 fixes are ONLY allowed when ALL of these are true:22- External research found an official solution or known issue for this exact error23- Change is single file, single point (config value, import, typo)24- No logic changes2526## When to Use2728**All technical problems:**29- Test failures, build errors, deploy errors30- Config conflicts, dependency issues31- Infrastructure/environment problems32- Unexpected behavior, performance issues3334**Especially when:**35- Under time pressure (urgency breeds guessing)36- "Let me just quickly fix this" comes to mind37- Multiple fix attempts have already been tried38- Previous fixes didn't work39- You don't fully understand the problem4041## The Phases4243Each Phase must complete before proceeding to the next.4445### Phase 0: Quick Assessment4647Run immediately when an error occurs. Before any fix attempt.48491. **Classify the error** — read the error message/symptoms:50 - Same code works in different environment? → Environment issue51 - After recent dependency/version change? → Dependency issue52 - Only fails in specific code path? → Code issue53542. **External research (exact match, 5 min max)** — check official docs and GitHub Issues for known issues. Don't rely on self-knowledge alone.55 - See: `references/external-research-guide.md`56573. **Branch decision**:58 - All Iron Law conditions met → Fix in Phase 059 - Any condition unmet → Enter Phase 1 full process60 - **Phase 0 quick-fix fails**: Undo (git checkout/undo), enter Phase 1. This attempt counts in the fix counter.6162### Phase 1: Root Cause Investigation6364**Before any fix attempt:**65661. **Read the error carefully**67 - Don't skip errors/warnings68 - Read the entire stack trace69 - Record line numbers, file paths, error codes70712. **Reproduce consistently**72 - Get exact reproduction steps73 - Every time? If intermittent, collect more data74753. **Check recent changes**76 - git diff, recent commits77 - New dependencies, config changes78 - Environment differences (env vars, Node/runtime version, OS)79804. **Research external sources (deep read)**81 - Based on Phase 0 exact match results, investigate further82 - Read official docs for the failure mechanism83 - Check release notes for breaking changes84 - See: `references/external-research-guide.md`85865. **Collect evidence in multi-component systems**87 - Log data in/out at each component boundary88 - Run once to find where it breaks89 - Then deep-dive into that component90916. **Trace data flow**92 - Where does the wrong value originate?93 - Trace the call stack backwards to the source94 - See: `references/root-cause-tracing.md`9596### Phase 2: Pattern Analysis97981. **Find similar working code** in the same codebase992. **Compare with reference implementations** — read the full reference docs, don't skim1003. **Identify all differences** between working and broken — don't assume "that's irrelevant"1014. **Map dependencies** — what config, environment, other components are needed102103### Phase 3: Hypothesis and Testing104105**Before entering Phase 3:**106- Verify clean state (git status)107- If not clean: git stash or save checkpoint108- On hypothesis failure: rollback to safe point, try new hypothesis (no cumulative fixes)1091101. **Form a single hypothesis**: "X is the root cause because Y" — specific, not vague1112. **Test minimally**: smallest change to verify the hypothesis. One variable at a time.1123. **Verify before proceeding**:113 - Success → Phase 4114 - Failure → **New hypothesis** (don't stack fixes on top of failed ones)115116### Phase 4: Implementation1171181. **Write a failing test** — simplest reproduction, automated if possible, before fixing1192. **Apply a single fix** — only the identified root cause, one change at a time, no "while I'm at it"1203. **Verify the fix** — test passes? No other tests broken? Problem actually resolved?1214. **If fix doesn't work**:122 - How many fix attempts so far?123 - Under 3: return to Phase 1 with new information124 - **3 or more: proceed to Phase 4.5**125126### Phase 4.5: Architecture Question127128**Pattern of 3+ failed fixes:**129- Each fix reveals new problems elsewhere130- Fix requires "major refactoring"131- Each fix creates symptoms in other places132133**Stop immediately and ask fundamental questions:**134- Is this pattern itself sound?135- Are we clinging to it out of inertia?136- Should we refactor the architecture instead of fixing symptoms?137138**Report to user and discuss before any more fix attempts.**139140## Red Flags — If you think this, STOP141142- "Let me quickly fix it and investigate later"143- "Let me try changing X and see if it works"144- "Let me bundle multiple changes and test once"145- "Skip tests, just check manually"146- "It's probably X, let me fix it"147- "I don't fully understand but this might work"148- "Let me just try one more fix" (after 2+ attempts)149- "I don't need to check external docs for this one"150- "This is definitely a code issue" (without checking environment)151152**Any of the above: STOP. Return to Phase 0/1.**153**3+ fix failures: Architecture Question (Phase 4.5)**154155## Common Rationalizations156157| Excuse | Reality |158|--------|---------|159| "Simple problem, don't need the process" | Simple problems have root causes too. The process is fast for simple bugs. |160| "Too urgent for process" | Systematic debugging is **faster** than guessing. |161| "Let me try this first, then investigate" | First fix sets the pattern. Start right. |162| "I'll write tests after fixing" | Fixes without tests don't last. Test first. |163| "Bundle changes to save time" | Can't tell what worked. Creates new bugs. |164| "Docs are too long, I'll wing it" | Partial understanding = guaranteed bugs. Read it all. |165| "I can see the problem, just fix it" | Seeing symptoms ≠ understanding root cause. |166| "One more fix" (2+ failures) | 3+ failures = architecture problem. Ask, don't fix. |167| "I know this error, no need to check docs" | LLM confidence ≠ accuracy. Verify externally. |168169## Supporting Techniques170171See references in this directory:172- **`references/external-research-guide.md`** — External docs/GitHub Issues lookup procedure173- **`references/root-cause-tracing.md`** — Call stack backtracing to find bug origins174175## Quick Reference176177| Phase | Key Activity | Success Criteria |178|-------|-------------|-----------------|179| **0. Quick Assessment** | Error classification, external research (exact match) | Error type classified + 1+ external search done |180| **1. Root Cause** | Read errors, reproduce, check changes, deep research | Understand what breaks and why |181| **2. Pattern** | Find working similar code, compare | Differences identified |182| **3. Hypothesis** | Single hypothesis, minimal test | Confirmed or new hypothesis |183| **4. Implementation** | Write test, fix, verify | Bug fixed, tests pass |184| **4.5. Architecture** | Stop after 3 failures, report | Architecture review decision |