systematic-debugging
obra/superpowers
Identifiez les causes profondes des bogues, des échecs de test ou des comportements inattendus avant de proposer des corrections.
...Développer toutDébogage systématique
Présentation
Les corrections aléatoires font perdre du temps et créent de nouveaux bugs. Les correctifs rapides ne font que masquer les problèmes sous-jacents.
Principe fondamental : il faut TOUJOURS identifier la cause première avant de tenter toute correction. Se contenter de corriger les symptômes est voué à l'échec.
Enfreindre la lettre de ce processus revient à enfreindre l’esprit même du débogage.
La règle d’or
PAS DE CORRECTION SANS ENQUÊTE PRÉALABLE SUR LA CAUSE PROFONDE
Si vous n’avez pas terminé la phase 1, vous ne pouvez pas proposer de corrections.
Quand l'utiliser
À utiliser pour TOUT problème technique :
- Échecs de test
- Bugs en production
- Comportement inattendu
- Problèmes de performances
- Échecs de compilation
- Problèmes d'intégration
Utilisez cette option NOTAMMENT lorsque :
- Vous êtes pressé par le temps (les situations d’urgence incitent à agir à l’aveuglette)
- Une « solution rapide » semble évidente
- Vous avez déjà essayé plusieurs solutions
- La solution précédente n’a pas fonctionné
- Vous ne comprenez pas entièrement le problème
Ne passez pas à l’étape suivante lorsque :
- Le problème semble simple (les bugs simples ont eux aussi des causes profondes)
- Vous êtes pressé (la précipitation garantit des retouches)
- Votre responsable veut que le problème soit résolu IMMÉDIATEMENT (une approche systématique est plus rapide que de s’agiter dans tous les sens)
Les quatre phases
Vous DEVEZ mener à bien chaque phase avant de passer à la suivante.
Phase 1 : Recherche de la cause profonde
AVANT de tenter TOUTE correction :
Lisez attentivement les messages d'erreur
- Ne passez pas outre les erreurs ou les avertissements
- Ils contiennent souvent la solution exacte
- Lisez intégralement les traces de pile
- Notez les numéros de ligne, les chemins d'accès aux fichiers et les codes d'erreur
Reproduisez l'erreur de manière cohérente
- Pouvez-vous reproduire le problème de manière fiable ?
- Quelles sont les étapes exactes ?
- Cela se produit-il à chaque fois ?
- Si le problème n'est pas reproductible → recueillez davantage de données, ne vous fiez pas à des suppositions
Vérifier les modifications récentes
- Quels changements ont pu provoquer cela ?
- Git diff, commits récents
- Nouvelles dépendances, modifications de configuration
- Différences d'environnement
Recueillir des preuves dans les systèmes à composants multiples
LORSQUE le système comporte plusieurs composants (CI → build → signature, API → service → base de données) :
AVANT de proposer des corrections, ajoutez des outils de diagnostic :
Pour CHAQUE limite de composant : - Enregistrer les données entrant dans le composant - Enregistrer les données sortant du composant - Vérifier la propagation de l’environnement et de la configuration - Vérifier l’état à chaque couche Exécuter une fois pour recueillir des preuves indiquant OÙ se produit la défaillance PUIS analyser les preuves pour identifier le composant défaillant PUIS examiner ce composant spécifiqueExemple (système multicouche) :
# Couche 1 : Workflow echo "=== Secrets disponibles dans le workflow : ===" echo "IDENTITY : ${IDENTITY:+SET}${IDENTITY:-UNSET}" # Couche 2 : script de compilation echo "=== Variables d’environnement dans le script de compilation : ===" env | grep IDENTITY || echo "IDENTITY absent de l’environnement" # Couche 3 : script de signature echo "=== État du trousseau : ===" security list-keychains security find-identity -v # Couche 4 : signature proprement dite codesign --sign "$IDENTITY" --verbose=4 "$APP"Cela permet de déterminer : quelle couche échoue (secrets → workflow ✓, workflow → compilation ✗)
Suivi du flux de données
LORSQUE l’erreur se trouve profondément dans la pile d’appels :
Consultez
le fichier root-cause-tracing.mddans ce répertoire pour découvrir la technique complète de traçage en amont.Version rapide :
- D’où provient la valeur erronée ?
- Qu'est-ce qui a appelé cette fonction avec cette valeur erronée ?
- Continuez à remonter la piste jusqu’à ce que vous trouviez la source
- Corrigez le problème à la source, pas au niveau du symptôme
Phase 2 : Analyse des schémas
Identifiez le schéma avant de corriger :
Trouvez des exemples qui fonctionnent
- Repérez du code fonctionnel similaire dans la même base de code
- Qu'est-ce qui fonctionne et qui est similaire à ce qui ne fonctionne pas ?
Comparez avec les références
- Si vous implémentez un modèle, lisez l'implémentation de référence DANS SON INTÉGRALITÉ
- Ne vous contentez pas de survoler le texte : lisez chaque ligne
- Comprenez parfaitement le modèle avant de l'appliquer
Identifiez les différences
- Qu'est-ce qui différencie une implémentation qui fonctionne d'une qui ne fonctionne pas ?
- Énumérez toutes les différences, aussi minimes soient-elles
- Ne partez pas du principe que « ça n’a pas d’importance »
Comprenez les dépendances
- De quels autres composants cela a-t-il besoin ?
- Quels paramètres, quelle configuration, quel environnement ?
- Sur quelles hypothèses repose-t-il ?
Phase 3 : Hypothèses et tests
Méthode scientifique :
Formuler une hypothèse unique
- Formuler clairement : « Je pense que X est la cause première parce que Y »
- Notez-la par écrit
- Soyez précis, ne restez pas vague
Tester de manière minimale
- Apportez la plus PETITE modification possible pour tester l’hypothèse
- Une variable à la fois
- Ne corrigez pas plusieurs éléments à la fois
Vérifiez avant de continuer
- Ça a marché ? Oui → Phase 4
- Ça n’a pas fonctionné ? Formulez une NOUVELLE hypothèse
- N'ajoutez PAS d'autres corrections par-dessus
Quand vous ne comprenez pas
- Dites « Je ne comprends pas X »
- Ne faites pas semblant de savoir
- Demandez de l'aide
- Faites des recherches supplémentaires
Phase 4 : Mise en œuvre
Traitez la cause profonde, pas le symptôme :
Créez un cas de test défaillant
- Reproduction la plus simple possible
- Test automatisé si possible
- Script de test ponctuel en l’absence de framework
- À réaliser IMPÉRATIVEMENT avant toute correction
- Utiliser la compétence «
superpowers:test-driven-development» pour écrire des tests échouant correctement
Mettre en œuvre une correction unique
- Traiter la cause première identifiée
- UNE modification à la fois
- Pas d’améliorations du type « tant que j’y suis »
- Pas de refactorisation groupée
Vérifier la correction
- Le test est-il réussi maintenant ?
- Aucun autre test n'est-il défaillant ?
- Le problème est-il réellement résolu ?
Si la correction ne fonctionne pas
- ARRÊTEZ
- Nombre : combien de solutions avez-vous essayées ?
- Si < 3 : revenez à la phase 1, réanalysez en tenant compte des nouvelles informations
- Si ≥ 3 : ARRÊTEZ et remettez en question l'architecture (étape 5 ci-dessous)
- N'essayez PAS la solution n° 4 sans discussion sur l'architecture
Si 3 solutions ou plus ont échoué : remettez en question l’architecture
Modèle indiquant un problème d’architecture :
- Chaque solution révèle un nouvel état partagé, un nouveau couplage ou un nouveau problème à un endroit différent
- Les solutions nécessitent une « refactorisation massive » pour être mises en œuvre
- Chaque solution crée de nouveaux symptômes ailleurs
ARRÊTEZ-VOUS et remettez en question les principes fondamentaux :
- Ce schéma est-il fondamentalement solide ?
- Sommes-nous en train de « nous y accrocher par pure inertie » ?
- Faut-il refactoriser l'architecture plutôt que de continuer à corriger les symptômes ?
Discutez-en avec votre collègue avant de tenter d’autres corrections
Ce n’est PAS une hypothèse erronée : c’est une architecture défaillante.
Signaux d'alerte : ARRÊTEZ-VOUS et suivez la procédure
Si vous vous surprenez à penser :
- « Une solution rapide pour l'instant, on verra plus tard »
- « Essayons simplement de modifier X et voyons si ça marche »
- « Ajoutez plusieurs modifications, puis lancez les tests »
- « Je passe le test, je vais vérifier manuellement »
- « C'est sûrement X, je vais corriger ça »
- « Je ne comprends pas tout, mais ça pourrait marcher »
- « Le modèle prévoit X, mais je vais l’adapter différemment. »
- « Voici les principaux problèmes : [liste des corrections sans analyse préalable] »
- Proposer des solutions avant d'avoir tracé le flux de données
- « Encore une tentative de correction » (alors qu’on en a déjà essayé au moins deux)
- Chaque correction révèle un nouveau problème à un autre endroit
TOUT cela signifie : ARRÊTEZ. Revenez à la phase 1.
Si 3 corrections ou plus ont échoué : remettez en question l’architecture (voir la phase 4.5)
Les signaux de votre partenaire humain indiquant que vous vous y prenez mal
Soyez attentif à ces réorientations :
- « Est-ce que ça ne se produit pas ? » – Vous avez émis une hypothèse sans vérifier
- « Est-ce que ça va nous montrer… ? » – Vous auriez dû collecter davantage de preuves
- « Arrête de deviner » – Tu proposes des solutions sans comprendre
- « Réfléchis-y à fond » – Remets en question les fondements, pas seulement les symptômes
- « On est bloqués ? » (frustré) – Votre approche ne fonctionne pas
Lorsque vous voyez ces phrases : ARRÊTEZ-VOUS. Revenez à la phase 1.
Rationalisations courantes
| Excuse | Réalité |
|---|---|
| « Le problème est simple, pas besoin de processus » | Les problèmes simples ont eux aussi des causes profondes. La procédure est rapide pour les bugs simples. |
| « C’est une urgence, on n’a pas le temps de suivre la procédure » | Un débogage systématique est PLUS RAPIDE que de tâtonner en avançant par hypothèses. |
| « Essayez d'abord ça, puis analysez le problème » | La première correction définit la marche à suivre. Faites-le correctement dès le départ. |
| « J'écrirai le test après avoir vérifié que la correction fonctionne » | Les corrections non testées ne tiennent pas la route. C’est le test qui le prouve en premier. |
| « Apporter plusieurs corrections à la fois permet de gagner du temps » | Impossible d’identifier ce qui a fonctionné. Ça provoque de nouveaux bugs. |
| « La référence est trop longue, je vais adapter le modèle. » | Une compréhension partielle garantit l’apparition de bugs. Lisez-le dans son intégralité. |
| « Je vois le problème, je vais le corriger » | Voir les symptômes ≠ comprendre la cause profonde. |
| « Encore une tentative de correction » (après au moins deux échecs) | Au moins trois échecs = problème d’architecture. Remettez en question le modèle, ne tentez pas une nouvelle correction. |
Référence rapide
| Phase | Activités clés | Critères de réussite |
|---|---|---|
| 1. Cause première | Lire les erreurs, reproduire le problème, vérifier les modifications, rassembler des preuves | Comprendre QUOI et POURQUOI |
| 2. Modèle | Trouver des exemples qui fonctionnent, comparer | Identifier les différences |
| 3. Hypothèse | Élaborer une théorie, la tester de manière sommaire | Hypothèse confirmée ou nouvelle |
| 4. Mise en œuvre | Créer un test, corriger, vérifier | Bug résolu, tests réussis |
Lorsque le processus révèle « aucune cause première »
Si une enquête systématique révèle que le problème est véritablement lié à l’environnement, dépendant du moment ou d’origine externe :
- Vous avez terminé le processus
- Documentez les éléments que vous avez examinés
- Mettez en place la gestion appropriée (nouvelle tentative, délai d'expiration, message d'erreur)
- Ajoutez des mécanismes de surveillance/journalisation pour de futures analyses
Mais : 95 % des cas où « aucune cause première » n’est identifiée sont dus à une analyse incomplète.
Techniques d'appui
Ces techniques font partie du débogage systématique et sont disponibles dans ce répertoire :
root-cause-tracing.md- Remonter la piste des bogues à travers la pile d'appels pour trouver le déclencheur d'originedefense-in-depth.md- Ajouter des validations à plusieurs niveaux après avoir identifié la cause premièrecondition-based-waiting.md- Remplacer les délais d’attente arbitraires par une interrogation conditionnelle
Compétences associées :
- superpowers:test-driven-development - Pour créer un cas de test échouant (Phase 4, Étape 1)
- superpowers:verification-before-completion - Vérifier que la correction a fonctionné avant de déclarer la réussite
Impact concret
À partir des sessions de débogage :
- Approche systématique : 15 à 30 minutes pour corriger le problème
- Approche par corrections aléatoires : 2 à 3 heures de tâtonnements
- Taux de résolution dès la première tentative : 95 % contre 40 %
- Nouveaux bugs introduits : quasi nul contre fréquents
---
name: systematic-debugging
description: Find root causes of bugs, test failures, or unexpected behavior before proposing any fixes.
---
# Systematic Debugging
## Overview
Random fixes waste time and create new bugs. Quick patches mask underlying issues.
**Core principle:** ALWAYS find root cause before attempting fixes. Symptom fixes are failure.
**Violating the letter of this process is violating the spirit of debugging.**
## The Iron Law
```
NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST
```
If you haven't completed Phase 1, you cannot propose fixes.
## When to Use
Use for ANY technical issue:
- Test failures
- Bugs in production
- Unexpected behavior
- Performance problems
- Build failures
- Integration issues
**Use this ESPECIALLY when:**
- Under time pressure (emergencies make guessing tempting)
- "Just one quick fix" seems obvious
- You've already tried multiple fixes
- Previous fix didn't work
- You don't fully understand the issue
**Don't skip when:**
- Issue seems simple (simple bugs have root causes too)
- You're in a hurry (rushing guarantees rework)
- Manager wants it fixed NOW (systematic is faster than thrashing)
## The Four Phases
You MUST complete each phase before proceeding to the next.
### Phase 1: Root Cause Investigation
**BEFORE attempting ANY fix:**
1. **Read Error Messages Carefully**
- Don't skip past errors or warnings
- They often contain the exact solution
- Read stack traces completely
- Note line numbers, file paths, error codes
2. **Reproduce Consistently**
- Can you trigger it reliably?
- What are the exact steps?
- Does it happen every time?
- If not reproducible → gather more data, don't guess
3. **Check Recent Changes**
- What changed that could cause this?
- Git diff, recent commits
- New dependencies, config changes
- Environmental differences
4. **Gather Evidence in Multi-Component Systems**
**WHEN system has multiple components (CI → build → signing, API → service → database):**
**BEFORE proposing fixes, add diagnostic instrumentation:**
```
For EACH component boundary:
- Log what data enters component
- Log what data exits component
- Verify environment/config propagation
- Check state at each layer
Run once to gather evidence showing WHERE it breaks
THEN analyze evidence to identify failing component
THEN investigate that specific component
```
**Example (multi-layer system):**
```bash
# Layer 1: Workflow
echo "=== Secrets available in workflow: ==="
echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"
# Layer 2: Build script
echo "=== Env vars in build script: ==="
env | grep IDENTITY || echo "IDENTITY not in environment"
# Layer 3: Signing script
echo "=== Keychain state: ==="
security list-keychains
security find-identity -v
# Layer 4: Actual signing
codesign --sign "$IDENTITY" --verbose=4 "$APP"
```
**This reveals:** Which layer fails (secrets → workflow ✓, workflow → build ✗)
5. **Trace Data Flow**
**WHEN error is deep in call stack:**
See `root-cause-tracing.md` in this directory for the complete backward tracing technique.
**Quick version:**
- Where does bad value originate?
- What called this with bad value?
- Keep tracing up until you find the source
- Fix at source, not at symptom
### Phase 2: Pattern Analysis
**Find the pattern before fixing:**
1. **Find Working Examples**
- Locate similar working code in same codebase
- What works that's similar to what's broken?
2. **Compare Against References**
- If implementing pattern, read reference implementation COMPLETELY
- Don't skim - read every line
- Understand the pattern fully before applying
3. **Identify Differences**
- What's different between working and broken?
- List every difference, however small
- Don't assume "that can't matter"
4. **Understand Dependencies**
- What other components does this need?
- What settings, config, environment?
- What assumptions does it make?
### Phase 3: Hypothesis and Testing
**Scientific method:**
1. **Form Single Hypothesis**
- State clearly: "I think X is the root cause because Y"
- Write it down
- Be specific, not vague
2. **Test Minimally**
- Make the SMALLEST possible change to test hypothesis
- One variable at a time
- Don't fix multiple things at once
3. **Verify Before Continuing**
- Did it work? Yes → Phase 4
- Didn't work? Form NEW hypothesis
- DON'T add more fixes on top
4. **When You Don't Know**
- Say "I don't understand X"
- Don't pretend to know
- Ask for help
- Research more
### Phase 4: Implementation
**Fix the root cause, not the symptom:**
1. **Create Failing Test Case**
- Simplest possible reproduction
- Automated test if possible
- One-off test script if no framework
- MUST have before fixing
- Use the `superpowers:test-driven-development` skill for writing proper failing tests
2. **Implement Single Fix**
- Address the root cause identified
- ONE change at a time
- No "while I'm here" improvements
- No bundled refactoring
3. **Verify Fix**
- Test passes now?
- No other tests broken?
- Issue actually resolved?
4. **If Fix Doesn't Work**
- STOP
- Count: How many fixes have you tried?
- If < 3: Return to Phase 1, re-analyze with new information
- **If ≥ 3: STOP and question the architecture (step 5 below)**
- DON'T attempt Fix #4 without architectural discussion
5. **If 3+ Fixes Failed: Question Architecture**
**Pattern indicating architectural problem:**
- Each fix reveals new shared state/coupling/problem in different place
- Fixes require "massive refactoring" to implement
- Each fix creates new symptoms elsewhere
**STOP and question fundamentals:**
- Is this pattern fundamentally sound?
- Are we "sticking with it through sheer inertia"?
- Should we refactor architecture vs. continue fixing symptoms?
**Discuss with your human partner before attempting more fixes**
This is NOT a failed hypothesis - this is a wrong architecture.
## Red Flags - STOP and Follow Process
If you catch yourself thinking:
- "Quick fix for now, investigate later"
- "Just try changing X and see if it works"
- "Add multiple changes, run tests"
- "Skip the test, I'll manually verify"
- "It's probably X, let me fix that"
- "I don't fully understand but this might work"
- "Pattern says X but I'll adapt it differently"
- "Here are the main problems: [lists fixes without investigation]"
- Proposing solutions before tracing data flow
- **"One more fix attempt" (when already tried 2+)**
- **Each fix reveals new problem in different place**
**ALL of these mean: STOP. Return to Phase 1.**
**If 3+ fixes failed:** Question the architecture (see Phase 4.5)
## your human partner's Signals You're Doing It Wrong
**Watch for these redirections:**
- "Is that not happening?" - You assumed without verifying
- "Will it show us...?" - You should have added evidence gathering
- "Stop guessing" - You're proposing fixes without understanding
- "Ultra-think this" - Question fundamentals, not just symptoms
- "We're stuck?" (frustrated) - Your approach isn't working
**When you see these:** STOP. Return to Phase 1.
## Common Rationalizations
| Excuse | Reality |
|--------|---------|
| "Issue is simple, don't need process" | Simple issues have root causes too. Process is fast for simple bugs. |
| "Emergency, no time for process" | Systematic debugging is FASTER than guess-and-check thrashing. |
| "Just try this first, then investigate" | First fix sets the pattern. Do it right from the start. |
| "I'll write test after confirming fix works" | Untested fixes don't stick. Test first proves it. |
| "Multiple fixes at once saves time" | Can't isolate what worked. Causes new bugs. |
| "Reference too long, I'll adapt the pattern" | Partial understanding guarantees bugs. Read it completely. |
| "I see the problem, let me fix it" | Seeing symptoms ≠ understanding root cause. |
| "One more fix attempt" (after 2+ failures) | 3+ failures = architectural problem. Question pattern, don't fix again. |
## Quick Reference
| Phase | Key Activities | Success Criteria |
|-------|---------------|------------------|
| **1. Root Cause** | Read errors, reproduce, check changes, gather evidence | Understand WHAT and WHY |
| **2. Pattern** | Find working examples, compare | Identify differences |
| **3. Hypothesis** | Form theory, test minimally | Confirmed or new hypothesis |
| **4. Implementation** | Create test, fix, verify | Bug resolved, tests pass |
## When Process Reveals "No Root Cause"
If systematic investigation reveals issue is truly environmental, timing-dependent, or external:
1. You've completed the process
2. Document what you investigated
3. Implement appropriate handling (retry, timeout, error message)
4. Add monitoring/logging for future investigation
**But:** 95% of "no root cause" cases are incomplete investigation.
## Supporting Techniques
These techniques are part of systematic debugging and available in this directory:
- **`root-cause-tracing.md`** - Trace bugs backward through call stack to find original trigger
- **`defense-in-depth.md`** - Add validation at multiple layers after finding root cause
- **`condition-based-waiting.md`** - Replace arbitrary timeouts with condition polling
**Related skills:**
- **superpowers:test-driven-development** - For creating failing test case (Phase 4, Step 1)
- **superpowers:verification-before-completion** - Verify fix worked before claiming success
## Real-World Impact
From debugging sessions:
- Systematic approach: 15-30 minutes to fix
- Random fixes approach: 2-3 hours of thrashing
- First-time fix rate: 95% vs 40%
- New bugs introduced: Near zero vs common
Tous les fichiers
0 fichiersInstaller systematic-debugging
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/obra/superpowers/tree/main/skills/systematic-debugging # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
