Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes
Random fixes waste time and create new bugs. Quick patches mask underlying issues.
Core principle: ALWAYS find root cause before attempting fixes. Symptom fixes are failure.
Violating the letter of this process is violating the spirit of debugging.
NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
If you haven't completed Phase 1, you cannot propose fixes.
Use for ANY technical issue:
Use this ESPECIALLY when:
Don't skip when:
You MUST complete each phase before proceeding to the next.
BEFORE attempting ANY fix:
Read Error Messages Carefully
Reproduce Consistently
Check Recent Changes
Gather Evidence in Multi-Component Systems
WHEN system has multiple components (CI → build → signing, API → service → database):
BEFORE proposing fixes, add diagnostic instrumentation:
For EACH component boundary:
- Log what data enters component
- Log what data exits component
- Verify environment/config propagation
- Check state at each layer
Run once to gather evidence showing WHERE it breaks
THEN analyze evidence to identify failing component
THEN investigate that specific component
Example (multi-layer system):
# Layer 1: Workflow
echo "=== Secrets available in workflow: ==="
echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"
# Layer 2: Build script
echo "=== Env vars in build script: ==="
env | grep IDENTITY || echo "IDENTITY not in environment"
# Layer 3: Signing script
echo "=== Keychain state: ==="
security list-keychains
security find-identity -v
# Layer 4: Actual signing
codesign --sign "$IDENTITY" --verbose=4 "$APP"
This reveals: Which layer fails (secrets → workflow ✓, workflow → build ✗)
Trace Data Flow
WHEN error is deep in call stack:
See root-cause-tracing.md in this directory for the complete backward tracing technique.
Quick version:
Find the pattern before fixing:
Find Working Examples
Compare Against References
Identify Differences
Understand Dependencies
Scientific method:
For each hypothesis, score and document:
| Hypothesis | Probability | Evidence | Falsification | Test Approach |
|------------|-------------|----------|---------------|---------------|
| H1: DB pool exhausted | 85% | Timeout errors every 30s | Check active connections < max | SHOW PROCESSLIST or pool metrics |
| H2: Network latency | 30% | Intermittent not consistent | Ping DB host | curl timing, traceroute |
Scoring guide:
Always state: "Highest-probability hypothesis is H1 (85%) because [evidence]."
Use when root cause is unclear after initial hypothesis. Ask "Why?" 5 times:
Example:
Error: Database connection timeout after 30s
Why? The database connection pool was exhausted
Why? All connections were held by long-running queries
Why? A new feature introduced N+1 query patterns
Why? The ORM lazy-loading wasn't properly configured
Why? Code review didn't catch the performance regression
Root cause: Missing performance review criteria in PR checklist
Stop when you reach: a process failure, a human decision, or an external constraint. The answer to the 5th "Why?" is your fix target.
Test Minimally
Verify Before Continuing
When You Don't Know
Fix the root cause, not the symptom:
Create Failing Test Case
leverage-patterns.md test-first protocol: write the test that defines success, then implement until it passesImplement Single Fix
Verify Fix
If Fix Doesn't Work
If 3+ Fixes Failed: Question Architecture
Pattern indicating architectural problem:
STOP and question fundamentals:
Discuss with the developer before attempting more fixes.
This is NOT a failed hypothesis — this is a wrong architecture.
The "3 fixes failed" counter is a backstop, not the first signal. A loop is usually stuck several attempts earlier — detect it structurally instead of waiting to exhaust the count (loop-engineering no-progress signals):
| Signal | What it looks like | Response | |---|---|---| | Repeated error | The SAME error recurs after your change — compare the normalized form (strip timestamps, IDs, paths, line offsets), not the raw text | Do not re-try the same class of fix. Form a genuinely new hypothesis (Phase 3) or escalate. | | Ping-pong edit | Your new diff reverts a previous attempt's diff (alternating file hashes) | Stop — you are oscillating between two wrong states. The real cause is elsewhere; escalate. | | Strategy repetition | You are about to run an approach already recorded as failed | Reject it without new evidence. A previously-failed strategy needs a NEW fact to be worth re-running. | | Verifier stagnation | Failing-test count / error signature does not improve across attempts | Treat as no progress even if each attempt "looks" different. |
Rule of thumb: a repeated normalized error signature with no new strategy = escalate
now — do not spend the remaining attempts. Record the normalized signature when you log
an attempt so repeats are detectable across a long session (that is exactly what
ralph-state.local.md's ## Attempt counts is for in an autonomous /ralph-loop).
If you catch yourself thinking:
ALL of these mean: STOP. Return to Phase 1.
If 3+ fixes failed: Question the architecture (see Phase 4.5)
Watch for these redirections:
When you see these: STOP. Return to Phase 1.
| Excuse | Reality | |--------|---------| | "Issue is simple, don't need process" | Simple issues have root causes too. Process is fast for simple bugs. | | "Emergency, no time for process" | Systematic debugging is FASTER than guess-and-check thrashing. | | "Just try this first, then investigate" | First fix sets the pattern. Do it right from the start. | | "I'll write test after confirming fix works" | Untested fixes don't stick. Test first proves it. | | "Multiple fixes at once saves time" | Can't isolate what worked. Causes new bugs. | | "Reference too long, I'll adapt the pattern" | Partial understanding guarantees bugs. Read it completely. | | "I see the problem, let me fix it" | Seeing symptoms ≠ understanding root cause. | | "One more fix attempt" (after 2+ failures) | 3+ failures = architectural problem. Question pattern, don't fix again. |
| Phase | Key Activities | Success Criteria | |-------|---------------|------------------| | 1. Root Cause | Read errors, reproduce, check changes, gather evidence | Understand WHAT and WHY | | 2. Pattern | Find working examples, compare | Identify differences | | 3. Hypothesis | Form theory, test minimally | Confirmed or new hypothesis | | 4. Implementation | Create test, fix, verify | Bug resolved, tests pass |
If systematic investigation reveals issue is truly environmental, timing-dependent, or external:
But: 95% of "no root cause" cases are incomplete investigation.
These techniques are available in this directory:
root-cause-tracing.md — Trace bugs backward through call stack to find original triggerdefense-in-depth.md — Add validation at multiple layers after finding root causecondition-based-waiting.md — Replace arbitrary timeouts with condition pollingRelated skills:
leverage-patterns.md test-first protocol — for creating failing test case (Phase 4, Step 1).claude/skills/verification-before-completion/SKILL.md — verify fix worked before claiming successFrom debugging sessions:
npx skills add kumaran-is/systematic-debugging下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer