Systematic Debugging

VerifiedCaution

Systematic debugging with root cause investigation. Four phases: investigate, analyze, hypothesize, implement.

Sby Skills Guide Bot
DevelopmentIntermediate
7/23/2026
Claude Code
#debugging#root-cause-analysis#bug-fixing#code-investigation#workflow

Recommended for

Automated summary

Structures debugging into four phases (investigate, analyze, hypothesize, implement) under a strict rule: no fix without an identified root cause.

Strengths

  • Enforces an explicit Iron Law that prevents random symptom patching
  • Concrete phase 1: read stack traces, trace the code path with Grep/Read, inspect recent changes with git log, and try to reproduce
  • Reuses prior investigation history and project learnings to surface recurring or architectural bugs
  • PreToolUse hook on Edit/Write checks the debug scope boundary before any modification

Limitations

  • The supplied file is truncated: only phase 1 and the start of the learnings refresh are visible; phases 2–4 are not described
  • Heavily tied to gstack infrastructure (freeze hooks, gbrain, preamble and context placeholders), so several steps break without it
  • Overkill for trivial, obvious fixes where a four-phase process adds friction
When to use it

Use it whenever a bug, stack trace, or unexpected behavior calls for root cause analysis instead of a quick patch.

When not to use it

Skip it for an obvious typo, a plain code review, or a refactoring request with no symptom to diagnose.

Security analysis

Caution
Quality score80/100

The skill is a debugging methodology: it reads code, runs git log, and optionally queries local helper scripts; there is no destructive command, no curl|sh pipe, no base64 payload, no credential/token exfiltration, and no attempt to disable safety. It uses Bash, file writes, and network search only for their stated legitimate debugging purposes, so it is 'caution' rather than 'safe' primarily because it executes external local scripts at fixed paths and can silently skip its own guard hook.

Findings
  • •Skill runs local helper binaries from hardcoded paths via Bash: ~/.claude/skills/gstack/bin/gstack-learnings-search, gstack-learnings-log, gstack-paths — trust in the skill depends on those external files, which are not part of the audited content.
  • •PreToolUse hooks on Edit/Write invoke check-freeze.sh from sibling directories, but silently no-op (`[ -x "$S" ] && bash "$S" || exit 0`) when the script is absent, so the advertised 'scope lock' protection may be silently missing while the skill still tells the user edits are restricted.
  • •Writes/deletes are possible (Write, Edit) and state files (`freeze-dir.txt`) are created under a state root — legitimate but file-mutating.
  • •Uses WebSearch with error-message content; the skill does include explicit sanitization guidance (strip hostnames, IPs, paths, SQL, customer data) before searching, which mitigates accidental leakage of internal details to a third-party search engine.
  • •PreToolUse hooks for Edit/Write execute a bash script resolved via relative path traversal outside the skill directory (`${CLAUDE_SKILL_DIR}/../freeze/bin/check-freeze.sh` or `../gstack-freeze/...`), which can run arbitrary local code when those sibling paths exist.
  • •`eval "$(~/.claude/skills/gstack/bin/gstack-paths)"` evaluates the output of an external script, a mild code-execution/injection risk.
  • •Invokes several external helper binaries from `~/.claude/skills/gstack/bin/` (gstack-learnings-search, gstack-learnings-log) and writes state files to a gstack state directory.
  • •Broad tool surface (Bash, Write, Edit, WebSearch) with unrestricted shell execution, though all uses shown are legitimate debugging operations.
How this analysis is made

Examples

Diagnose a production 500
Our API started returning 500 errors on the checkout endpoint since this morning's deploy. Debug this and find the root cause before changing anything.
Regression after refactor
This worked yesterday but now the auth middleware rejects valid tokens. Investigate this error and tell me what changed.
Intermittent failure
The test suite fails randomly about one run in five. Do a root cause analysis instead of just adding retries.

name: investigate preamble-tier: 2 version: 1.0.0 description: | Systematic debugging with root cause investigation. Four phases: investigate, analyze, hypothesize, implement. Iron Law: no fixes without root cause. Use when asked to "debug this", "fix this bug", "why is this broken", "investigate this error", or "root cause analysis". Proactively invoke this skill (do NOT debug directly) when the user reports errors, 500 errors, stack traces, unexpected behavior, "it was working yesterday", or is troubleshooting why something stopped working. (gstack) allowed-tools:

  • Bash
  • Read
  • Write
  • Edit
  • Grep
  • Glob
  • AskUserQuestion
  • WebSearch triggers:
  • debug this
  • fix this bug
  • why is this broken
  • root cause analysis
  • investigate this error hooks: PreToolUse:
    • matcher: "Edit" hooks:
      • type: command command: 'bash -c ''S="${CLAUDE_SKILL_DIR}/../freeze/bin/check-freeze.sh"; [ -x "$S" ] || S="${CLAUDE_SKILL_DIR}/../gstack-freeze/bin/check-freeze.sh"; [ -x "$S" ] && bash "$S" || exit 0''' statusMessage: "Checking debug scope boundary..."
    • matcher: "Write" hooks:
      • type: command command: 'bash -c ''S="${CLAUDE_SKILL_DIR}/../freeze/bin/check-freeze.sh"; [ -x "$S" ] || S="${CLAUDE_SKILL_DIR}/../gstack-freeze/bin/check-freeze.sh"; [ -x "$S" ] && bash "$S" || exit 0''' statusMessage: "Checking debug scope boundary..." gbrain: schema: 1 context_queries:
    • id: prior-investigations kind: list filter: type: timeline tags_contains: "repo:{repo_slug}" content_contains: "investigate" sort: updated_at_desc limit: 5 render_as: "## Prior investigations in this repo"
    • id: project-learnings kind: filesystem glob: "~/.gstack/projects/{repo_slug}/learnings.jsonl" tail: 10 render_as: "## Recent learnings (patterns + pitfalls)"
    • id: recent-eureka kind: filesystem glob: "~/.gstack/analytics/eureka.jsonl" tail: 5 render_as: "## Recent eureka moments (cross-project)"

{{PREAMBLE}}

Systematic Debugging

Iron Law

NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST.

Fixing symptoms creates whack-a-mole debugging. Every fix that doesn't address root cause makes the next bug harder to find. Find the root cause, then fix it.


{{GBRAIN_CONTEXT_LOAD}}

Phase 1: Root Cause Investigation

Gather context before forming any hypothesis.

  1. Collect symptoms: Read the error messages, stack traces, and reproduction steps. If the user hasn't provided enough context, ask ONE question at a time via AskUserQuestion.

  2. Read the code: Trace the code path from the symptom back to potential causes. Use Grep to find all references, Read to understand the logic.

  3. Check recent changes:

    git log --oneline -20 -- <affected-files>
    

    Was this working before? What changed? A regression means the root cause is in the diff.

  4. Reproduce: Can you trigger the bug deterministically? If not, gather more evidence before proceeding.

  5. Check investigation history: Search prior learnings for investigations on the same files. Recurring bugs in the same area are an architectural smell. If prior investigations exist, note patterns and check if the root cause was structural.

{{LEARNINGS_SEARCH:query=debug investigation root cause hypothesis bug fix}}

Output: "Root cause hypothesis: ..." — a specific, testable claim about what is wrong and why.

Refresh learnings for the hypothesis you just named

The top-of-skill learnings pull above is keyed to "debug investigation" broadly. Now that you have a specific hypothesis, re-pull learnings keyed to that hypothesis so prior fixes for the same problem-shape surface.

Pick ONE keyword from the hypothesis. The keyword should be a noun: the failing component name, the basename of the file you suspect (without extension), or the bug noun. The keyword MUST be alphanumeric or hyphen only — no quotes, slashes, dots, colons, or whitespace. If your candidate has any of those, simplify to just the alphanumeric stem.

Worked examples (investigate-specific): good keywords are auth-cookie, session-expiry, redirect-loop. Bad: auth.ts:47, fix the auth bug, <hypothesis-keyword>.

~/.claude/skills/gstack/bin/gstack-learnings-search --query "<your-keyword>" --limit 5 2>/dev/null || true

If any learnings come back, name which one applies to your investigation in one sentence. If none come back, continue without reference — the absence of a matching prior learning is itself useful information.


Scope Lock

After forming your root cause hypothesis, lock edits to the affected module to prevent scope creep.

_FREEZE_SCRIPT="${CLAUDE_SKILL_DIR}/../freeze/bin/check-freeze.sh"
[ -x "$_FREEZE_SCRIPT" ] || _FREEZE_SCRIPT="${CLAUDE_SKILL_DIR}/../gstack-freeze/bin/check-freeze.sh"
[ -x "$_FREEZE_SCRIPT" ] && echo "FREEZE_AVAILABLE" || echo "FREEZE_UNAVAILABLE"

If FREEZE_AVAILABLE: Identify the narrowest directory containing the affected files. Write it to the freeze state file:

eval "$(~/.claude/skills/gstack/bin/gstack-paths)"
STATE_DIR="$GSTACK_STATE_ROOT"
mkdir -p "$STATE_DIR"
echo "<detected-directory>/" > "$STATE_DIR/freeze-dir.txt"
echo "Debug scope locked to: <detected-directory>/"

Substitute <detected-directory> with the actual directory path (e.g., src/auth/). Tell the user: "Edits restricted to <dir>/ for this debug session. This prevents changes to unrelated code. Run /unfreeze to remove the restriction."

If the bug spans the entire repo or the scope is genuinely unclear, skip the lock and note why.

If FREEZE_UNAVAILABLE: Skip scope lock. Edits are unrestricted.


Phase 2: Pattern Analysis

Check if this bug matches a known pattern:

| Pattern | Signature | Where to look | |---------|-----------|---------------| | Race condition | Intermittent, timing-dependent | Concurrent access to shared state | | Nil/null propagation | NoMethodError, TypeError | Missing guards on optional values | | State corruption | Inconsistent data, partial updates | Transactions, callbacks, hooks | | Integration failure | Timeout, unexpected response | External API calls, service boundaries | | Configuration drift | Works locally, fails in staging/prod | Env vars, feature flags, DB state | | Stale cache | Shows old data, fixes on cache clear | Redis, CDN, browser cache, Turbo |

Also check:

  • TODOS.md for related known issues
  • git log for prior fixes in the same area — recurring bugs in the same files are an architectural smell, not a coincidence

External pattern search: If the bug doesn't match a known pattern above, WebSearch for:

  • "{framework} {generic error type}" — sanitize first: strip hostnames, IPs, file paths, SQL, customer data. Search the error category, not the raw message.
  • "{library} {component} known issues"

If WebSearch is unavailable, skip this search and proceed with hypothesis testing. If a documented solution or known dependency bug surfaces, present it as a candidate hypothesis in Phase 3.


Phase 3: Hypothesis Testing

Before writing ANY fix, verify your hypothesis.

  1. Confirm the hypothesis: Add a temporary log statement, assertion, or debug output at the suspected root cause. Run the reproduction. Does the evidence match?

  2. If the hypothesis is wrong: Before forming the next hypothesis, consider searching for the error. Sanitize first — strip hostnames, IPs, file paths, SQL fragments, customer identifiers, and any internal/proprietary data from the error message. Search only the generic error type and framework context: "{component} {sanitized error type} {framework version}". If the error message is too specific to sanitize safely, skip the search. If WebSearch is unavailable, skip and proceed. Then return to Phase 1. Gather more evidence. Do not guess.

  3. 3-strike rule: If 3 hypotheses fail, STOP. Use AskUserQuestion:

    3 hypotheses tested, none match. This may be an architectural issue
    rather than a simple bug.
    
    A) Continue investigating — I have a new hypothesis: [describe]
    B) Escalate for human review — this needs someone who knows the system
    C) Add logging and wait — instrument the area and catch it next time
    

Red flags — if you see any of these, slow down:

  • "Quick fix for now" — there is no "for now." Fix it right or escalate.
  • Proposing a fix before tracing data flow — you're guessing.
  • Each fix reveals a new problem elsewhere — wrong layer, not wrong code.

Phase 4: Implementation

Once root cause is confirmed:

  1. Fix the root cause, not the symptom. The smallest change that eliminates the actual problem.

  2. Minimal diff: Fewest files touched, fewest lines changed. Resist the urge to refactor adjacent code.

  3. Write a regression test that:

    • Fails without the fix (proves the test is meaningful)
    • Passes with the fix (proves the fix works)
  4. Run the full test suite. Paste the output. No regressions allowed.

  5. If the fix touches >5 files: Use AskUserQuestion to flag the blast radius:

    This fix touches N files. That's a large blast radius for a bug fix.
    A) Proceed — the root cause genuinely spans these files
    B) Split — fix the critical path now, defer the rest
    C) Rethink — maybe there's a more targeted approach
    

Phase 5: Verification & Report

Fresh verification: Reproduce the original bug scenario and confirm it's fixed. This is not optional.

Run the test suite and paste the output.

Output a structured debug report:

DEBUG REPORT
════════════════════════════════════════
Symptom:         [what the user observed]
Root cause:      [what was actually wrong]
Fix:             [what was changed, with file:line references]
Evidence:        [test output, reproduction attempt showing fix works]
Regression test: [file:line of the new test]
Related:         [TODOS.md items, prior bugs in same area, architectural notes]
Status:          DONE | DONE_WITH_CONCERNS | BLOCKED
════════════════════════════════════════

Log the investigation as a learning for future sessions. Use type: "investigation" and include the affected files so future investigations on the same area can find this:

~/.claude/skills/gstack/bin/gstack-learnings-log '{"skill":"investigate","type":"investigation","key":"ROOT_CAUSE_KEY","insight":"ROOT_CAUSE_SUMMARY","confidence":9,"source":"observed","files":["affected/file1.ts","affected/file2.ts"]}'

{{LEARNINGS_LOG}}

{{GBRAIN_SAVE_RESULTS}}


Important Rules

  • 3+ failed fix attempts → STOP and question the architecture. Wrong architecture, not failed hypothesis.
  • Never apply a fix you cannot verify. If you can't reproduce and confirm, don't ship it.
  • Never say "this should fix it." Verify and prove it. Run the tests.
  • If fix touches >5 files → AskUserQuestion about blast radius before proceeding.
  • Completion status:
    • DONE — root cause found, fix applied, regression test written, all tests pass
    • DONE_WITH_CONCERNS — fixed but cannot fully verify (e.g., intermittent bug, requires staging)
    • BLOCKED — root cause unclear after investigation, escalated

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/systematic-debugging-mrx3xxhk' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/systematic-debugging-mrx3xxhk/download' --output '.skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md.part' && mv '.skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md.part' '.skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md' && test -s '.skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/investigate' && cp -R '.skill-downloads/systematic-debugging-mrx3xxhk' '.claude/skills/investigate'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/systematic-debugging-mrx3xxhk'

openskills read 'systematic-debugging-mrx3xxhk'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills