From code-forge
Use when encountering any bug, test failure, or unexpected behavior — enforces root cause investigation before fixes. Prevents symptom-fixing, masking bugs, and "just try this" approaches. For code-forge features, use code-forge:fix instead.
npx claudepluginhub tercel/tercel-claude-plugins --plugin code-forgeThis skill uses the workspace's default tool permissions.
@../shared/execution-entrypoint.md
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
@../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: