From code-forge
Enforces root cause investigation before fixes for bugs, test failures, or unexpected behavior. Prevents symptom-fixing and guessing.
How this skill is triggered — by the user, by Claude, or both
Slash command
/code-forge:debugThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
@../shared/execution-entrypoint.md
@../shared/execution-entrypoint.md
For this skill: start at the first executable step. If you catch yourself about to say "falling back to manual debugging", STOP and go to the indicated step.
Systematic root cause debugging for any technical issue.
For code-forge features: Use /code-forge:fix instead — it adds upstream document tracing and state tracking on top of this methodology.
NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST.
No "let me just try this." No "obvious fix." No guessing. Investigate first.
Root Cause Investigation → Pattern Analysis → Hypothesis Testing → Implementation (TDD fix)
Before investigating, build situational awareness of the codebase:
@../shared/project-analysis.md
Execute steps PA.1 (Project Profile) and PA.2 (Architecture Analysis) at minimum. For complex bugs, also run PA.3 (Language-Specific Deep Scan) on the affected module and PA.4 (Relationship Mapping) to understand how the bug might propagate.
This context informs Phase 1-4: knowing the architecture tells you WHERE to look; knowing relationships tells you WHAT ELSE might be affected.
Complete each phase before moving to the next.
git diff, git log for what changedIf you don't know: say so. Don't pretend. "I don't understand why X happens" is valuable information.
Count your fix attempts:
Bug: "UserService.getProfile() returns null for valid user IDs"
Phase 1 — Investigate:
$ grep -r "getProfile" src/ → found in UserService.ts:42, UserController.ts:15
$ git log --oneline -5 src/services/UserService.ts → recent refactor changed query
Phase 2 — Compare:
Working: getById() uses parameterized query with $1
Broken: getProfile() concatenates id into string (bug introduced in refactor)
Phase 3 — Hypothesis:
"getProfile builds wrong SQL — id is treated as string, not integer"
Test: hardcode known id=1 → returns null. Confirmed.
Phase 4 — Fix:
Write test: expect(getProfile(1)).resolves.toMatchObject({id: 1})
Fix: use parameterized query ($1) instead of string interpolation
Verify: test passes, full suite 42/42 green
Apply these checks before acting:
| If you're about to... | Instead... | Why |
|---|---|---|
| Skip Phase 1 because the cause seems obvious | Run Phase 1 anyway — it will be fast if you're right | Obvious causes are often symptoms of deeper issues |
| Apply a fix without reproducing first | Reproduce the bug with a reliable trigger | A fix you can't verify is not a fix |
| Revert to a working state without understanding | Investigate WHY it broke, then fix | Blind reverts leave the root cause active |
| Trust the error message at face value | Trace backward from the error through the call chain | Error messages point to symptoms, not causes |
| Add logging everywhere | Add targeted logging at component boundaries only | Shotgun logging creates noise and obscures signal |
| Try the same approach again | STOP after 3 failed attempts — reassess your mental model | Repeated failure means wrong diagnosis, not wrong execution |
Halt and reassess if:
npx claudepluginhub tercel/tercel-claude-plugins --plugin code-forgeGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.