systematic-debugging
obra/superpowers
Ermitteln Sie die Ursachen für Fehler, Testausfälle oder unerwartetes Verhalten, bevor Sie Korrekturen vorschlagen.
...Alle erweiternSystematische Fehlersuche
Überblick
Zufällige Korrekturen verschwenden Zeit und verursachen neue Fehler. Schnellreparaturen verschleiern die zugrunde liegenden Probleme.
Grundprinzip: Finden Sie IMMER die Ursache, bevor Sie Korrekturen vornehmen. Die Behebung von Symptomen ist zum Scheitern verurteilt.
Wer den Wortlaut dieses Prozesses missachtet, verstößt gegen den Geist der Fehlerbehebung.
Das eiserne Gesetz
KEINE BEHEBUNGEN OHNE VORHERIGE UNTERSUCHUNG DER URSACHE
Wenn Sie Phase 1 nicht abgeschlossen haben, dürfen Sie keine Korrekturen vorschlagen.
Anwendungsbereich
Bei JEDEM technischen Problem anwenden:
- Testfehler
- Fehler in der Produktion
- Unerwartetes Verhalten
- Leistungsprobleme
- Fehler beim Build
- Integrationsprobleme
Verwenden Sie dies INSBESONDERE, wenn:
- Sie unter Zeitdruck stehen (in Notfällen ist es verlockend, einfach zu raten)
- „Nur eine schnelle Lösung“ scheint naheliegend
- Sie bereits mehrere Lösungen ausprobiert haben
- Die vorherige Lösung hat nicht funktioniert
- Sie das Problem nicht vollständig verstehen
Überspringe diesen Schritt nicht, wenn:
- das Problem einfach erscheint (auch einfache Fehler haben Ursachen)
- Sie es eilig haben (Eile garantiert Nacharbeit)
- Der Vorgesetzte will, dass es JETZT behoben wird (systematisches Vorgehen ist schneller als wildes Herumprobieren)
Die vier Phasen
Sie MÜSSEN jede Phase abschließen, bevor Sie zur nächsten übergehen.
Phase 1: Untersuchung der Grundursache
BEVOR du IRGENDEINE Korrekturmaßnahme versuchst:
Lesen Sie die Fehlermeldungen sorgfältig durch
- Überspringen Sie keine Fehler oder Warnungen
- Sie enthalten oft die genaue Lösung
- Lesen Sie die Stack-Traces vollständig durch
- Notieren Sie sich Zeilennummern, Dateipfade und Fehlercodes
Reproduzieren Sie den Fehler konsistent
- Können Sie den Fehler zuverlässig auslösen?
- Was sind die genauen Schritte?
- Tritt der Fehler jedes Mal auf?
- Wenn nicht reproduzierbar → sammeln Sie weitere Daten, raten Sie nicht
Überprüfe die letzten Änderungen
- Was hat sich geändert, das dies verursachen könnte?
- Git-Diff, aktuelle Commits
- Neue Abhängigkeiten, Konfigurationsänderungen
- Unterschiede in der Umgebung
Beweismaterial in Systemen mit mehreren Komponenten sammeln
WENN das System aus mehreren Komponenten besteht (CI → Build → Signierung, API → Dienst → Datenbank):
Bevor Sie Korrekturen vorschlagen, fügen Sie Diagnoseinstrumente hinzu:
Für JEDE Komponentengrenze: - Protokollieren Sie, welche Daten in die Komponente eingehen - Protokollieren Sie, welche Daten die Komponente verlassen - Überprüfen Sie die Weitergabe von Umgebungs- und Konfigurationsdaten - Überprüfen Sie den Zustand auf jeder Ebene Führen Sie dies einmal aus, um Nachweise darüber zu sammeln, WO der Fehler auftritt DANN analysieren Sie die Nachweise, um die fehlerhafte Komponente zu identifizieren DANN untersuchen Sie diese spezifische KomponenteBeispiel (mehrschichtiges System):
# Ebene 1: Workflow echo "=== Im Workflow verfügbare Geheimnisse: ===" echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}" # Ebene 2: Build-Skript echo "=== Umgebungsvariablen im Build-Skript: ===" env | grep IDENTITY || echo "IDENTITY nicht in der Umgebung" # Ebene 3: Signierungsskript echo "=== Status des Schlüsselbunds: ===" security list-keychains security find-identity -v # Ebene 4: Tatsächliche Signierung codesign --sign "$IDENTITY" --verbose=4 "$APP"Dies zeigt: Welche Ebene versagt (Geheimnisse → Workflow ✓, Workflow → Build ✗)
Datenfluss nachverfolgen
WENN der Fehler tief in der Aufrufstapel liegt:
Siehe
„root-cause-tracing.md“in diesem Verzeichnis für die vollständige Technik der Rückverfolgung.Kurzfassung:
- Woher stammt der fehlerhafte Wert?
- Was hat dies mit dem fehlerhaften Wert aufgerufen?
- Verfolgen Sie die Kette weiter nach oben, bis Sie die Quelle gefunden haben
- Beheben Sie das Problem an der Quelle, nicht am Symptom
Phase 2: Musteranalyse
Finden Sie das Muster, bevor Sie das Problem beheben:
Finde funktionierende Beispiele
- Suchen Sie ähnlichen, funktionierenden Code in derselben Codebasis
- Was funktioniert, das dem defekten Code ähnelt?
Mit Referenzen vergleichen
- Wenn Sie ein Muster implementieren, lesen Sie die Referenzimplementierung GRÜNDLICH durch
- Nicht nur überfliegen – jede Zeile lesen
- Verstehen Sie das Muster vollständig, bevor Sie es anwenden
Identifizieren Sie Unterschiede
- Was ist der Unterschied zwischen einer funktionierenden und einer fehlerhaften Lösung?
- Listen Sie jeden Unterschied auf, egal wie klein er auch sein mag
- Gehen Sie nicht davon aus, dass „das keine Rolle spielen kann“
Verstehen Sie die Abhängigkeiten
- Welche anderen Komponenten werden dafür benötigt?
- Welche Einstellungen, Konfigurationen, Umgebungen?
- Von welchen Voraussetzungen geht es aus?
Phase 3: Hypothese und Testen
Wissenschaftliche Methode:
Eine einzige Hypothese aufstellen
- Klar formulieren: „Ich glaube, X ist die Ursache, weil Y“
- Schreibe sie auf
- Sei konkret, nicht vage
Minimal testen
- Nehmen Sie die MÖGLICHST KLEINE Änderung vor, um die Hypothese zu testen
- Jedes Mal nur eine Variable
- Korrigieren Sie nicht mehrere Dinge gleichzeitig
Überprüfen Sie das Ergebnis, bevor Sie fortfahren
- Hat es funktioniert? Ja → Phase 4
- Hat es nicht funktioniert? Formuliere eine NEUE Hypothese
- Füge KEINE weiteren Korrekturen hinzu
Wenn du es nicht weißt
- Sagen Sie: „Ich verstehe X nicht“
- Tu nicht so, als wüsstest du es
- Bitte um Hilfe
- Recherchiere weiter
Phase 4: Umsetzung
Behebe die Ursache, nicht das Symptom:
Erstellen Sie einen fehlgeschlagenen Testfall
- Möglichst einfache Reproduktion
- Wenn möglich, automatisierten Test
- Einmaliges Testskript, falls kein Framework vorhanden ist
- MUSS vor der Behebung vorhanden sein
- Nutzen Sie die
Superkraft: „testgetriebene Entwicklung“, um korrekte fehlgeschlagene Tests zu schreiben
Einzelne Korrektur implementieren
- Beheben Sie die identifizierte Grundursache
- JEDES Mal nur EINE Änderung
- Keine Verbesserungen nach dem Motto „Wenn ich schon mal dabei bin“
- Keine gebündelten Refactorings
Korrektur überprüfen
- Wird der Test jetzt bestanden?
- Sind keine anderen Tests fehlgeschlagen?
- Ist das Problem tatsächlich behoben?
Wenn die Korrektur nicht funktioniert
- STOP
- Zählung: Wie viele Korrekturversuche haben Sie bereits unternommen?
- Wenn < 3: Zurück zu Phase 1, erneute Analyse mit neuen Informationen
- Wenn ≥ 3: STOP und hinterfrage die Architektur (Schritt 5 unten)
- Versuchen Sie nicht, Lösung Nr. 4 ohne architektonische Diskussion anzuwenden
Wenn 3 oder mehr Korrekturmaßnahmen fehlgeschlagen sind: Hinterfragen Sie die Architektur
Muster, das auf ein Architekturproblem hindeutet:
- Jede Korrektur deckt an anderer Stelle einen neuen gemeinsamen Zustand, eine neue Kopplung oder ein neues Problem auf
- Die Korrekturen erfordern eine „umfassende Refaktorisierung“, um sie umzusetzen
- Jede Korrektur verursacht an anderer Stelle neue Symptome
HALTEN Sie inne und hinterfragen Sie die Grundlagen:
- Ist dieses Muster grundsätzlich solide?
- Halten wir „nur aus reiner Trägheit daran fest“?
- Sollten wir die Architektur umgestalten oder weiterhin nur Symptome beheben?
Besprechen Sie dies mit Ihrem menschlichen Partner, bevor Sie weitere Korrekturen vornehmen
Dies ist KEINE gescheiterte Hypothese – dies ist eine falsche Architektur.
Warnsignale – STOPP und befolge den Prozess
Wenn Sie sich dabei ertappen, zu denken:
- „Erst mal eine schnelle Lösung, später untersuchen“
- „Probier einfach mal, X zu ändern, und schau, ob es funktioniert“
- „Füge mehrere Änderungen hinzu und führe Tests durch“
- „Den Test überspringen, ich überprüfe das manuell“
- „Es ist wahrscheinlich X, das werde ich beheben“
- „Ich verstehe es nicht ganz, aber das könnte funktionieren“
- „Das Muster sieht X vor, aber ich werde es anders anpassen.“
- „Hier sind die Hauptprobleme: [listet Lösungen auf, ohne sie zu untersuchen]“
- Lösungsvorschläge, bevor der Datenfluss nachverfolgt wurde
- „Noch ein weiterer Korrekturversuch“ (obwohl bereits 2+ versucht wurden)
- Jede Korrektur deckt an anderer Stelle ein neues Problem auf
ALL dies bedeutet: STOP. Zurück zu Phase 1.
Wenn drei oder mehr Korrekturversuche fehlgeschlagen sind: Hinterfrage die Architektur (siehe Phase 4.5)
Signale Ihres menschlichen Partners, dass Sie es falsch machen
Achte auf diese Umlenkungen:
- „Passiert das nicht?“ – Du hast eine Annahme getroffen, ohne sie zu überprüfen
- „Wird uns das zeigen …?“ – Du hättest weitere Beweise sammeln sollen
- „Hör auf zu raten“ – Du schlägst Lösungen vor, ohne die Situation zu verstehen
- „Denk mal ganz gründlich darüber nach“ – Hinterfrage die Grundlagen, nicht nur die Symptome
- „Wir kommen nicht weiter?“ (frustriert) – Dein Ansatz funktioniert nicht
Wenn du diese Aussagen hörst: HÖR AUF. Kehre zu Phase 1 zurück.
Häufige Rationalisierungen
| Ausrede | Realität |
|---|---|
| „Das Problem ist einfach, da braucht es keinen Prozess“ | Auch einfache Probleme haben Ursachen. Bei einfachen Fehlern ist der Prozess schnell. |
| „Notfall, keine Zeit für den Prozess“ | Systematisches Debuggen ist SCHNELLER als das Herumprobieren nach dem Prinzip „Raten und Prüfen“. |
| „Probier das erst mal aus, dann schau nach“ | Die erste Korrektur legt das Muster fest. Mach es von Anfang an richtig. |
| „Ich schreibe den Test, nachdem ich überprüft habe, ob die Korrektur funktioniert“ | Ungetestete Korrekturen halten nicht. Erst das Testen beweist es. |
| „Mehrere Korrekturen auf einmal sparen Zeit.“ | Man kann nicht feststellen, was funktioniert hat. Das verursacht neue Fehler. |
| „Der Referenztext ist zu lang, ich passe das Muster an.“ | Ein unvollständiges Verständnis führt garantiert zu Fehlern. Lies es vollständig durch. |
| „Ich sehe das Problem, ich werde es beheben“ | Symptome zu erkennen ≠ die Ursache zu verstehen. |
| „Noch ein Versuch, das Problem zu beheben“ (nach 2 oder mehr Fehlversuchen) | 3 oder mehr Fehlversuche = architektonisches Problem. Hinterfrage das Muster, versuche nicht erneut, es zu beheben. |
Kurzanleitung
| Phase | Wichtige Aktivitäten | Erfolgskriterien |
|---|---|---|
| 1. Grundursache | Fehler analysieren, reproduzieren, Änderungen überprüfen, Belege sammeln | Verstehen, WAS und WARUM |
| 2. Muster | Funktionsfähige Beispiele finden, vergleichen | Unterschiede identifizieren |
| 3. Hypothese | Theorie aufstellen, minimal testen | Bestätigte oder neue Hypothese |
| 4. Umsetzung | Test erstellen, Fehler beheben, überprüfen | Fehler behoben, Tests bestanden |
Wenn der Prozess „keine Grundursache“ ergibt
Wenn eine systematische Untersuchung ergibt, dass das Problem tatsächlich umgebungsbedingt, zeitabhängig oder extern ist:
- Haben Sie den Prozess abgeschlossen
- Dokumentieren Sie Ihre Untersuchungsergebnisse
- Implementieren Sie geeignete Maßnahmen (Wiederholversuch, Timeout, Fehlermeldung)
- Fügen Sie Überwachungs- und Protokollierungsmaßnahmen für zukünftige Untersuchungen hinzu
Aber: 95 % der Fälle, in denen „keine Ursache“ festgestellt wird, sind auf unvollständige Untersuchungen zurückzuführen.
Unterstützende Techniken
Diese Techniken sind Teil der systematischen Fehlersuche und in diesem Verzeichnis verfügbar:
root-cause-tracing.md– Verfolgen Sie Fehler rückwärts über den Aufrufstapel, um den ursprünglichen Auslöser zu findendefense-in-depth.md– Fügen Sie nach dem Auffinden der Grundursache Validierungen auf mehreren Ebenen hinzucondition-based-waiting.md– Beliebige Timeouts durch bedingte Abfragen ersetzen
Verwandte Fähigkeiten:
- superpowers:test-driven-development – Zum Erstellen eines fehlgeschlagenen Testfalls (Phase 4, Schritt 1)
- superpowers:verification-before-completion – Vor der Erfolgsmeldung überprüfen, ob die Korrektur funktioniert hat
Auswirkungen in der Praxis
Aus Debugging-Sitzungen:
- Systematischer Ansatz: 15–30 Minuten bis zur Behebung
- Zufälliger Ansatz bei der Fehlerbehebung: 2–3 Stunden mühsames Herumprobieren
- Erfolgsquote beim ersten Versuch: 95 % gegenüber 40 %
- Neu entstandene Fehler: Nahezu null gegenüber häufig
---
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
Alle Dateien
0 Dateiensystematic-debugging installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.
git clone https://github.com/obra/superpowers/tree/main/skills/systematic-debugging # Copy SKILL.md to your .claude/skills/ directory
Kopieren





Heim
