opção

systematic-debugging

obra/superpowers obra/superpowers

Identifique as causas principais dos bugs, falhas nos testes ou comportamentos inesperados antes de propor quaisquer correções.

...Expandir tudo
21
Tempo atualizado 3 de Setembro de 2026

Depuração sistemática

Visão geral

Correções aleatórias desperdiçam tempo e geram novos bugs. Correções rápidas apenas mascaram os problemas subjacentes.

Princípio fundamental: SEMPRE identifique a causa raiz antes de tentar correções. Corrigir apenas os sintomas é um fracasso.

Violar a letra deste processo é violar o espírito da depuração.

A Lei de Ferro

NENHUMA CORREÇÃO SEM A INVESTIGAÇÃO PRÉVIA DA CAUSA RAÍZ

Se você não concluiu a Fase 1, não pode propor correções.

Quando usar

Use para QUALQUER problema técnico:

  • Falhas nos testes
  • Bugs em produção
  • Comportamento inesperado
  • Problemas de desempenho
  • Falhas na compilação
  • Problemas de integração

Use isso ESPECIALMENTE quando:

  • Estiver sob pressão de tempo (situações de emergência tornam tentador recorrer a suposições)
  • “Apenas uma solução rápida” parece óbvia
  • Você já tentou várias soluções
  • A solução anterior não funcionou
  • Você não compreende totalmente o problema

Não pule esta etapa quando:

  • O problema parecer simples (mesmo bugs simples têm causas profundas)
  • Você estiver com pressa (a pressa garante que o trabalho terá que ser refeito)
  • O gerente quer que seja corrigido AGORA (uma abordagem sistemática é mais rápida do que agir às cegas)

As quatro fases

Você DEVE concluir cada fase antes de passar para a próxima.

Fase 1: Investigação da causa raiz

ANTES de tentar QUALQUER correção:

  1. Leia as mensagens de erro com atenção

    • Não ignore erros ou avisos
    • Elas geralmente contêm a solução exata
    • Leia os rastreamentos de pilha na íntegra
    • Anote os números das linhas, os caminhos dos arquivos e os códigos de erro
  2. Reproduza o erro de forma consistente

    • Você consegue reproduzir o problema de forma confiável?
    • Quais são as etapas exatas?
    • Isso acontece todas as vezes?
    • Se não for reproduzível → reúna mais dados, não faça suposições
  3. Verifique as alterações recentes

    • O que mudou que poderia ter causado isso?
    • Git diff, commits recentes
    • Novas dependências, alterações na configuração
    • Diferenças no ambiente
  4. Reunir evidências em sistemas com múltiplos componentes

    QUANDO o sistema possui vários componentes (CI → compilação → assinatura, API → serviço → banco de dados):

    ANTES de propor correções, adicione instrumentação de diagnóstico:

    Para CADA limite de componente:
      - Registre quais dados entram no componente
      - Registre quais dados saem do componente
      - Verifique a propagação do ambiente/configuração
      - Verifique o estado em cada camada
    
    Execute uma vez para coletar evidências que mostrem ONDE ocorre a falha
    DEPOIS, analise as evidências para identificar o componente com falha
    DEPOIS, investigue esse componente específico
    

    Exemplo (sistema multicamadas):

    # Camada 1: Fluxo de trabalho
    echo "=== Segredos disponíveis no fluxo de trabalho: ==="
    echo "IDENTITY: ${IDENTITY:+SET}${IDENTITY:-UNSET}"
    
    # Camada 2: Script de compilação
    echo "=== Variáveis de ambiente no script de compilação: ==="
    env | grep IDENTITY || echo "IDENTITY não está no ambiente"
    
    # Camada 3: Script de assinatura
    echo "=== Estado do Keychain: ==="
    security list-keychains
    security find-identity -v
    
    # Camada 4: Assinatura propriamente dita
    codesign --sign "$IDENTITY" --verbose=4 "$APP"
    

    Isso revela: qual camada falha (segredos → fluxo de trabalho ✓, fluxo de trabalho → compilação ✗)

  5. Rastrear o fluxo de dados

    QUANDO o erro estiver em uma camada profunda da pilha de chamadas:

    Consulte o arquivo root-cause-tracing.md neste diretório para conhecer a técnica completa de rastreamento retroativo.

    Versão resumida:

    • De onde vem o valor incorreto?
    • O que chamou isso com o valor incorreto?
    • Continue rastreando até encontrar a origem
    • Corrija na origem, não no sintoma

Fase 2: Análise de Padrões

Identifique o padrão antes de corrigir:

  1. Encontre exemplos que funcionam

    • Localize código semelhante que esteja funcionando na mesma base de código
    • O que funciona e é semelhante ao que está com problema?
  2. Compare com referências

    • Se for implementar um padrão, leia a implementação de referência NA ÍNTEGRA
    • Não dê uma olhada superficial — leia cada linha
    • Entenda o padrão completamente antes de aplicá-lo
  3. Identifique as diferenças

    • O que difere entre o que funciona e o que não funciona?
    • Liste todas as diferenças, por menores que sejam
    • Não presuma que “isso não importa”
  4. Entenda as dependências

    • De quais outros componentes isso depende?
    • Quais são as configurações, ajustes e ambiente?
    • Quais são as suposições feitas?

Fase 3: Hipótese e testes

Método científico:

  1. Formular uma única hipótese

    • Afirme claramente: “Acho que X é a causa principal porque Y”
    • Anote
    • Seja específico, não vago
  2. Teste de forma mínima

    • Faça a menor alteração possível para testar a hipótese
    • Uma variável por vez
    • Não corrija várias coisas de uma vez
  3. Verifique antes de continuar

    • Deu certo? Sim → Fase 4
    • Não funcionou? Formule uma NOVA hipótese
    • NÃO acrescente mais correções
  4. Quando você não sabe

    • Diga “Não entendo X”
    • Não finja que sabe
    • Peça ajuda
    • Pesquise mais

Fase 4: Implementação

Corrija a causa raiz, não o sintoma:

  1. Crie um caso de teste com falha

    • Reprodução o mais simples possível
    • Teste automatizado, se possível
    • Script de teste pontual, caso não haja estrutura
    • É OBRIGATÓRIO ter isso antes de corrigir
    • Use a habilidade “superpoderes: desenvolvimento orientado a testes” para escrever testes de falha adequados
  2. Implemente uma correção única

    • Resolva a causa raiz identificada
    • UMA alteração por vez
    • Sem melhorias do tipo “já que estou aqui”
    • Sem refatoração agrupada
  3. Verifique a correção

    • O teste passou agora?
    • Nenhum outro teste falhou?
    • O problema foi realmente resolvido?
  4. Se a correção não funcionar

    • PARE
    • Contagem: quantas correções você já tentou?
    • Se < 3: Volte à Fase 1 e reanalise com as novas informações
    • Se ≥ 3: PARE e questione a arquitetura (etapa 5 abaixo)
    • NÃO tente a correção nº 4 sem discutir a arquitetura
  5. Se 3 ou mais soluções falharem: questione a arquitetura

    Padrão que indica um problema de arquitetura:

    • Cada correção revela um novo estado compartilhado/acoplamento/problema em um local diferente
    • As correções exigem uma “refatoração massiva” para serem implementadas
    • Cada correção gera novos sintomas em outros lugares

    PARE e questione os fundamentos:

    • Esse padrão é fundamentalmente válido?
    • Estamos “persistindo nisso por pura inércia”?
    • Devemos refatorar a arquitetura ou continuar corrigindo os sintomas?

    Discuta com seu colega antes de tentar mais correções

    Isso NÃO é uma hipótese falha — é uma arquitetura errada.

Sinais de alerta — PARE e siga o processo

Se você se pegar pensando:

  • “Solução rápida por enquanto, investigo depois”
  • “É só tentar mudar X e ver se funciona”
  • “Adicione várias alterações, execute os testes”
  • “Pule o teste, vou verificar manualmente”
  • “Provavelmente é o X, vou corrigir isso”
  • “Não entendo totalmente, mas isso pode funcionar”
  • “O padrão diz X, mas vou adaptá-lo de outra forma”
  • “Aqui estão os principais problemas: [lista correções sem investigação]”
  • Propor soluções antes de rastrear o fluxo de dados
  • “Mais uma tentativa de correção” (quando já foram tentadas duas ou mais)
  • Cada correção revela um novo problema em um lugar diferente

TUDO isso significa: PARE. Volte à Fase 1.

Se três ou mais correções falharem: questione a arquitetura (consulte a Fase 4.5)

Sinais do seu parceiro humano de que você está fazendo errado

Fique atento a esses redirecionamentos:

  • “Isso não está acontecendo?” — Você presumiu sem verificar
  • “Isso vai nos mostrar...?” – Você deveria ter coletado mais evidências
  • “Pare de adivinhar” – Você está propondo soluções sem entender
  • “Pense bem nisso” – Questione os fundamentos, não apenas os sintomas
  • “Estamos empacados?” (frustrado) – Sua abordagem não está funcionando

Quando você perceber isso: PARE. Volte para a Fase 1.

Racionalizações comuns

Desculpa Realidade
“O problema é simples, não precisa de processo” Mesmo questões simples têm causas fundamentais. O processo é rápido para bugs simples.
“É uma emergência, não dá tempo para seguir o processo” A depuração sistemática é MAIS RÁPIDA do que ficar tentando adivinhar e verificando.
“Tente isso primeiro, depois investigue” A primeira correção define o padrão. Faça certo desde o início.
“Vou escrever o teste depois de confirmar que a correção funciona” Correções não testadas não duram. Testar primeiro comprova isso.
“Várias correções de uma vez economizam tempo” Não dá para identificar o que funcionou. Isso gera novos bugs.
“A referência é muito longa, vou adaptar o padrão” A compreensão parcial garante a presença de bugs. Leia na íntegra.
“Eu vejo o problema, deixa eu corrigir” Perceber os sintomas ≠ compreender a causa raiz.
“Mais uma tentativa de correção” (após 2 ou mais falhas) Mais de 3 falhas = problema de arquitetura. Questione o padrão, não tente corrigir novamente.

Referência rápida

Fase Atividades-chave Critérios de sucesso
1. Causa raiz Identificar erros, reproduzi-los, verificar alterações, reunir evidências Compreender O QUÊ e O PORQUÊ
2. Padrão Encontrar exemplos que funcionam, comparar Identificar diferenças
3. Hipótese Formule uma teoria, teste de forma mínima Hipótese confirmada ou nova
4. Implementação Criar teste, corrigir, verificar Bug resolvido, testes aprovados

Quando o processo revela “nenhuma causa raiz”

Se a investigação sistemática revelar que o problema é realmente ambiental, dependente do momento ou externo:

  1. Você concluiu o processo
  2. Documente o que você investigou
  3. Implemente o tratamento adequado (nova tentativa, tempo limite, mensagem de erro)
  4. Adicione monitoramento/registro para investigações futuras

Mas: 95% dos casos sem “causa raiz” resultam de investigações incompletas.

Técnicas de apoio

Essas técnicas fazem parte da depuração sistemática e estão disponíveis neste diretório:

  • root-cause-tracing.md — Rastreie os bugs retroativamente pela pilha de chamadas para encontrar o gatilho original
  • defense-in-depth.md – Adicione validação em várias camadas após identificar a causa raiz
  • condition-based-waiting.md – Substituir tempos limite arbitrários por sondagem de condições

Habilidades relacionadas:

  • superpowers:test-driven-development - Para criar um caso de teste com falha (Fase 4, Etapa 1)
  • superpowers:verification-before-completion - Verifique se a correção funcionou antes de declarar sucesso

Impacto no mundo real

A partir de sessões de depuração:

  • Abordagem sistemática: 15 a 30 minutos para corrigir
  • Abordagem de correções aleatórias: 2 a 3 horas de tentativas frustradas
  • Taxa de correção na primeira tentativa: 95% vs 40%
  • Novos bugs introduzidos: Quase zero x comum
Ver no GitHub
---
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

Todos os arquivos

0 arquivos

Instalar systematic-debugging

Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.

Baixar ZIP

Clone o repositório e copie os arquivos da habilidade para o seu projeto.

git clone https://github.com/obra/superpowers/tree/main/skills/systematic-debugging # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuração rápida: Copie a pasta da habilidade para .claude/skills/ O Claude detectará e utilizará automaticamente a habilidade
Repositório obra/superpowers

Habilidades relacionadas

algorithmic-art
Tempo atualizado 27 de Agosto de 2026
receiving-code-review
Tempo atualizado 3 de Setembro de 2026
tech-debt-tracker
Tempo atualizado 29 de Agosto de 2026
deprecation-and-migration
Tempo atualizado 3 de Setembro de 2026
OR