Débogage systématique

VérifiéPrudence

Débogage systématique avec investigation de cause racine. Quatre phases : enquêter, analyser, hypothétiser, implémenter.

Spar Skills Guide Bot
DeveloppementIntermédiaire
23/07/2026
Claude Code
#debugging#root-cause-analysis#bug-fixing#code-investigation#workflow

Recommandé pour

Synthèse automatique

Encadre le débogage en quatre phases (investigation, analyse, hypothèse, correctif) avec une règle stricte : aucun correctif sans cause racine identifiée.

Points forts

  • Impose une discipline explicite (« Iron Law ») qui empêche de corriger les symptômes au hasard
  • Phase 1 concrète : lecture des traces, parcours du code avec Grep/Read, vérification des changements récents via git log, tentative de reproduction
  • Réutilise l'historique des investigations et les apprentissages passés pour repérer les bugs récurrents ou architecturaux
  • Hook PreToolUse sur Edit/Write qui vérifie le périmètre de débogage avant toute modification

Limites

  • Le fichier fourni est tronqué : seules la phase 1 et le début du rafraîchissement des apprentissages sont visibles, les phases 2 à 4 ne sont pas décrites
  • Dépend fortement de l'infrastructure gstack (hooks freeze, gbrain, préambule et placeholders) : sans elle, plusieurs étapes ne fonctionnent pas
  • Peu adapté aux correctifs triviaux et évidents, où le processus en quatre phases ajoute de la lourdeur
Quand l'utiliser

À utiliser dès qu'un bug, une trace de pile ou un comportement inattendu nécessite une analyse de cause racine plutôt qu'un patch rapide.

Quand l'éviter

À éviter pour une faute de frappe évidente, une simple revue de code ou une demande de refactorisation sans symptôme à diagnostiquer.

Analyse de sécurité

Prudence
Score qualité80/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.

Points d'attention
  • •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.
Comment cette analyse est faite

Exemples

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

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

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. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

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 doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/systematic-debugging-mrx3xxhk'

openskills read 'systematic-debugging-mrx3xxhk'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/systematic-debugging-mrx3xxhk/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires