systematic-debugging
Four-phase root cause investigation before attempting fixes. Use when debugging bugs, test failures, or unexpected behavior.
When & Why to Use This Skill
The Systematic Debugging skill implements a rigorous, four-phase root cause investigation framework designed to eliminate trial-and-error coding. By prioritizing evidence-based analysis—including pattern recognition, hypothesis testing, and data flow tracing—this skill ensures that software fixes address the underlying issue rather than just masking symptoms, significantly improving code reliability and developer productivity.
Use Cases
- Case 1: Resolving intermittent test failures or 'flaky' tests by performing backward data flow tracing to identify where invalid states originate.
- Case 2: Investigating complex production bugs where multiple system components interact, using pattern analysis to compare differences between working and broken environments.
- Case 3: Validating architectural integrity when repeated 'quick fixes' fail, helping teams determine if a deeper refactor is required instead of further patching.
- Case 4: Implementing Test-Driven Development (TDD) for bug fixes by creating failing test cases based on verified root causes before writing any solution code.
| name | systematic-debugging |
|---|---|
| description | Four-phase root cause investigation before attempting fixes. Use when debugging bugs, test failures, or unexpected behavior. |
Systematic Debugging
ALWAYS find root cause before attempting fixes. Symptom fixes are failure.
When to Use
- Encountering bugs or test failures
- Unexpected behavior in code
- Before proposing any fix
The Four Phases
Phase 1: Root Cause Investigation
Before proposing any solution:
- Read error messages thoroughly - Don't skip warnings or stack traces; they often contain exact solutions
- Reproduce consistently - Verify you can trigger the issue reliably with documented steps
- Check recent changes - Examine
git diff, dependencies, and configuration modifications - Gather diagnostic evidence - In multi-component systems, add instrumentation at component boundaries
- Trace data flow - Backward trace from the error to find where bad values originate
Phase 2: Pattern Analysis
Establish the pattern before fixing:
- Locate similar working code in the codebase
- Read reference implementations completely (not skimmed)
- List every difference between working and broken code
- Understand all dependencies and assumptions
Phase 3: Hypothesis Testing
Apply scientific method:
- State your hypothesis clearly: "I believe X is failing because Y, evidenced by Z"
- Test with the smallest possible change
- Change only ONE variable at a time
- Verify results before proceeding
Phase 4: Implementation
Fix the root cause systematically:
- Create a failing test case first (TDD)
- Implement a single fix addressing only the root cause
- Verify the fix resolves the issue without breaking other tests
- If fix doesn't work, return to Phase 1
Red Flags - STOP Immediately
- Proposing fixes without understanding the issue
- Attempting multiple simultaneous changes
- Assuming problems without verification
- Skipping evidence gathering
- Making "quick fixes" before investigation
When 3+ Fixes Fail
STOP. This signals an architectural problem, not a fixable bug:
- Do not attempt another fix
- Return to Phase 1
- Question whether the underlying pattern/design is sound
- Ask: "Should we refactor architecture vs. continue fixing symptoms?"
Random fixes waste time and create new bugs. Quick patches mask underlying issues.
Results
Systematic approach: 15-30 minutes to resolution with 95% first-time success vs. Trial-and-error: 2-3 hours of thrashing with 40% success and new bugs introduced