Trace bugs backward through call stacks to find the original trigger.
Copy the install command and let the AI configure it · recommended for beginners
Please install the "Root Cause Tracing" skill from askskill: 1. Download https://raw.githubusercontent.com/obra/clank/main/skills/debugging/root-cause-tracing/SKILL.md 2. Save it as ~/.claude/skills/root-cause-tracing/SKILL.md 3. Reload skills and tell me it's ready
Using this stack trace and relevant code, trace the null pointer exception backward through the call chain. Show each function's inputs, outputs, and suspicious variables, then provide the most likely root cause and fix suggestion.
A step-by-step root cause analysis identifying the earliest failure point and a fix approach.
Here are the failed async job logs, scheduling flow, and related service calls. Starting from the error point, trace backward to determine which upstream parameter, state change, or retry logic first caused the failure, and summarize it as an investigation report.
A report showing the failure propagation path, original trigger, and affected chain.
I have a production regression: after a new release, a feature returns incorrect results. Use the commit history, call stack, and observed test behavior to trace the root cause backward, identify the most likely change that introduced it, and provide verification steps.
A regression analysis with the suspected change, root cause judgment, and verification plan.
Bugs often manifest deep in the call stack (git init in wrong directory, file created in wrong location, database opened with wrong path). Your instinct is to fix where the error appears, but that's treating a symptom.
Core principle: Trace backward through the call chain until you find the original trigger, then fix at the source.
digraph when_to_use {
"Bug appears deep in stack?" [shape=diamond];
"Can trace backwards?" [shape=diamond];
"Fix at symptom point" [shape=box];
"Trace to original trigger" [shape=box];
"BETTER: Also add defense-in-depth" [shape=box];
"Bug appears deep in stack?" -> "Can trace backwards?" [label="yes"];
"Can trace backwards?" -> "Trace to original trigger" [label="yes"];
"Can trace backwards?" -> "Fix at symptom point" [label="no - dead end"];
"Trace to original trigger" -> "BETTER: Also add defense-in-depth";
}
Use when:
Error: git init failed in /Users/jesse/project/packages/core
What code directly causes this?
await execFileAsync('git', ['init'], { cwd: projectDir });
WorktreeManager.createSessionWorktree(projectDir, sessionId)
→ called by Session.initializeWorkspace()
→ called by Session.create()
→ called by test at Project.create()
What value was passed?
projectDir = '' (empty string!)cwd resolves to process.cwd()Where did empty string come from?
const context = setupCoreTest(); // Returns { tempDir: '' }
Project.create('name', context.tempDir); // Accessed before beforeEach!
When you can't trace manually, add instrumentation:
// Before the problematic operation
async function gitInit(directory: string) {
const stack = new Error().stack;
console.error('DEBUG git init:', {
directory,
cwd: process.cwd(),
nodeEnv: process.env.NODE_ENV,
stack,
});
await execFileAsync('git', ['init'], { cwd: directory });
}
Critical: Use console.error() in tests (not logger - may not show)
Run and capture:
npm test 2>&1 | grep 'DEBUG git init'
Analyze stack traces:
If something appears during tests but you don't know which test:
Use the bisection script: @find-polluter.sh
./find-polluter.sh '.git' 'src/**/*.test.ts'
Runs tests one-by-one, stops at first polluter. See script for usage.
Symptom: .git created in packages/core/ (source code)
Trace chain:
git init runs in process.cwd() ← empty cwd parametercontext.tempDir before beforeEach{ tempDir: '' } initiallyRoot cause: Top-level variable initialization accessing empty value
Fix: Made tempDir a getter that throws if accessed before beforeEach
Also added defense-in-depth:
digraph principle {
"Found immediate cause" [shape=ellipse];
"Can trace one level up?" [shape=diamond];
"Trace backwards" [shape=box];
"Is this the source?" [shape=diamond];
…
Write evergreen comments focused on what and why, not historical context.
Compare 2-3 approaches before execution to choose a stronger solution.
Plan with pseudocode first, refine approaches, then translate into working code.
Search past Claude Code chats to recover facts, decisions, and context.
Design systems by hiding implementation details behind domain-level interfaces.
Name code by domain meaning to improve clarity and team alignment.
Trace errors backward through execution paths to identify the true root cause.
Systematically investigate bugs before fixing them with a four-phase debugging framework.
Debug issues with a four-phase method that finds root causes before fixes.
Analyze bugs and tracebacks to find root causes and likely fixes.
Systematically investigate bugs, test failures, and unexpected behavior before fixing.
Systematically triage failures and fix broken builds or unexpected runtime issues.