Como investigar um bug em produção com o Claude Code sem sair chutando correção

fluxo de debug com Claude Code para investigar bug em produção antes de corrigir
Resposta rápida

Debug com Claude Code funciona quando a correção é a última etapa, não a primeira. O roteiro: abrir sessão limpa com /clear, travar o plan mode (somente leitura, com as edições bloqueadas até você aprovar o plano), descrever o sintoma em fato observável, colar os logs pedindo causas-raiz ranqueadas por probabilidade, mapear o caminho do código arquivo por arquivo e delegar a varredura pesada a um subagente de contexto isolado. Se a correção piorar, o menu de rewind (/rewind ou Esc duas vezes com o prompt vazio) volta ao estado anterior

Fala aí, beleza? Bug estourou em produção e o reflexo é sempre o mesmo: copiar o stack trace, colar no Claude Code e escrever "conserta isso"

Aí vem o remendo

Só que quase sempre em cima do lugar errado, porque ninguém chegou a entender o caminho do código: olhou a última linha que quebrou e tratou o sintoma

Bug em produção tem pressa, e a pressa é EXATAMENTE o que faz o Claude Code editar arquivo antes de investigar

Então aqui vai um roteiro de investigação onde a correção é a última etapa, não a primeira

Bora?

O que ter em mãos antes de abrir o Claude Code

Investigação sem material é adivinhação com sotaque técnico 🙂

Do teu lado, junta isso aqui:

  • O sintoma em comportamento observável, não em suposição: "a listagem mostra o nome antigo depois do salvamento", e não "o cache quebrou"
  • Logs e stack trace do ambiente de produção, do período do problema
  • A janela de tempo em que a coisa começou (isso vale ouro na hora de perguntar o que mudou)
  • O repositório aberto na mesma versão que está no ar, senão tu investiga um código que ninguém está rodando

Do lado do Claude Code:

  • Um CLAUDE.md do projeto: ele é lido no início de cada sessão e entra no system prompt da conversa. O /init faz o Claude examinar o código e gerar esse arquivo, e o /memory lista os arquivos de memória nos escopos de usuário e de projeto, criando se ainda não existir
  • Uma sessão limpa com /clear, pra investigação não herdar contexto de outra tarefa
  • A consciência de que o checkpointing captura o estado do código antes de cada prompt teu, que é a rede de segurança do último passo
Domine o Claude Code do básico ao avançado
Pré-inscrição Formação Claude Code

Domine o Claude Code do básico ao avançado

Você vai aprender a criar sistemas completos com Claude Code, sem precisar ser programador. Inscreva-se para ter acesso a um desconto de lançamento e bônus especiais!

E um aviso honesto antes de começar…

A própria Anthropic reconhece que muitos problemas de produção só acontecem sob condições específicas, combinando carga do sistema, comportamento de terceiros e dados reais de usuário, coisa que ambiente de staging não replica

Ou seja: o alvo aqui é evidência, não necessariamente reprodução local

Passo a passo: do sintoma à correção sem chutar

A lógica é simples: cada passo tem que produzir uma evidência, e a correção só nasce quando as evidências apontam pro mesmo lugar

  1. Abra a sessão limpa e trave o modo somente leitura

Começa com /clear, que zera o histórico mantendo a memória do projeto

Depois cicla os modos de permissão com Shift+Tab na CLI do Claude Code até cair no plan mode

Os modos disponíveis são default, acceptEdits, plan, auto e dontAsk

No plan mode ele lê arquivos e roda comandos de exploração, escreve um plano, mas não edita o código-fonte: as edições ficam bloqueadas até você aprovar

O erro comum deste passo: começar num modo que aceita edição e deixar o Claude "consertar" enquanto ele ainda está lendo

  1. Descreva o sintoma em fato observável, sem embutir a sua teoria
   Sintoma em produção: depois de salvar o formulário de perfil, a listagem
   continua mostrando o nome antigo por alguns minutos.
   Começou ontem por volta das 14h.
   Não quero correção ainda, quero entender o caminho do código.

O erro comum deste passo: escrever "o cache está quebrado" no lugar de "a página retorna dado antigo depois do salvamento". Sua teoria vira a hipótese número 1 do modelo, e a investigação já nasce enviesada

  1. Cole os logs e peça causas-raiz ranqueadas por probabilidade

Esse formato é sugerido pela própria Anthropic: a partir do log, apontar o serviço, a mudança de configuração ou o caminho de código responsável

   Segue o log do período.
   Liste as causas-raiz mais prováveis, ranqueadas por probabilidade, dizendo em
   cada uma se o responsável é um serviço, uma mudança de configuração ou um
   caminho de código. Sem propor correção.

O erro comum deste passo: pedir a correção junto. O ranqueamento vira enfeite e ele pula direto pro patch

  1. Mapeie o caminho do código, arquivo por arquivo

Agora a pergunta é a rota: do ponto onde o sintoma aparece até a origem do dado, com trecho citado em cada parada

   Trace o caminho do sintoma até a origem do dado.
   Para cada etapa: arquivo, linha e o trecho real citado.
   Se você não abriu o arquivo, diga que não abriu.

O erro comum deste passo: aceitar nome de função sem o arquivo aberto. Nome bonito de função é onde mora o chute mais convincente 😀

  1. Delegue a varredura pesada a um subagente

Subagente é uma instância isolada do Claude, com janela de contexto própria: ele recebe a tarefa, executa e devolve só o resultado, deixando as chamadas de ferramenta e os passos intermediários lá dentro

O Claude Code já traz os nativos Explore e Plan, então dá pra usar sem montar nada

Só que se liga nisso: a janela do subagente começa VAZIA, sem a conversa do agente pai. O único canal é o texto do prompt, então caminho de arquivo, mensagem de erro e decisões já tomadas precisam ir escritos ali

   Tarefa: varrer todos os pontos que leem ou gravam o perfil do usuário.
   Contexto (não presuma nada além disso): sintoma é listagem com nome antigo
   após o salvamento; log mostra "stale read on profile"; já descartamos a
   camada de template.
   Devolva só: arquivo, linha, trecho e por que entra na lista.

O erro comum deste passo: escrever "investigue aquele bug" e o subagente não ter absolutamente nada do que vocês conversaram

  1. Confronte as hipóteses antes de escolher uma
   Para cada hipótese: qual trecho de código a sustenta, e qual observação no
   log ou nos dados derrubaria ela?
   Se não houver evidência no código, escreva "sem evidência".

Hipótese que não pode ser derrubada por nenhuma observação não é hipótese, é opinião

O erro comum deste passo: parar na primeira que soa plausível, que costuma ser a mais parecida com o que você já achava no passo 2

  1. Só agora aprove o plano e saia do somente leitura

O plano bom cita arquivo, linha e o que muda em cada ponto

O erro comum deste passo: aprovar plano que fala em "ajustar o tratamento de erro" sem apontar onde. Isso não é plano, é intenção

  1. Se a correção piorar, volta atrás

O menu de rewind abre com /rewind ou apertando Esc duas vezes com o campo de prompt vazio

Detalhes que evitam susto: as opções de restaurar código só aparecem quando o checkpoint selecionado tem alteração de arquivo rastreada (sem edição capturada, sobra restaurar conversa, resumir e cancelar), o histórico guarda os 100 checkpoints mais recentes da sessão, e só entram arquivos editados dentro da sessão atual

Alteração manual feita fora do Claude Code, ou edição de outra sessão rodando em paralelo, normalmente não é capturada

Ah, e checkpoint não é arquivo morto eterno: ele some junto com a sessão depois de 30 dias, período configurável pelo cleanupPeriodDays

O erro comum deste passo: contar com o rewind pra desfazer o que tu mesmo editou na mão no editor ao lado

Como o roteiro muda conforme o tipo de bug

O esqueleto é o mesmo, o peso de cada passo muda bastante

Tipo de bug O que carrega a investigação Onde é fácil escorregar
Erro que explode com stack trace O ranqueamento por probabilidade a partir do log Corrigir a linha que quebrou em vez da que produziu o dado ruim
Regressão depois de um deploy A pergunta "o que mudou nesse caminho", comparando o estado atual do código com o comportamento esperado Culpar o deploy inteiro sem isolar o caminho do sintoma
Bug silencioso, sem exceção Mapeamento do caminho do código e hipóteses falseáveis Pedir correção sem ter uma única evidência citada

No terceiro caso não existe log pra colar, e é aí que o roteiro faz mais diferença: o passo 4 e o passo 6 viram o trabalho inteiro

E tem o clássico bug intermitente que não reproduz na tua máquina de jeito nenhum

Aceita: a condição de produção pode simplesmente não ser replicável no teu ambiente, então mira em evidência no código em vez de gastar o dia perseguindo a reprodução

Agora, se o que está lento e estranho é o próprio assistente, e não o teu app, a investigação é outra história: vale entender por que o Claude Code fica lento antes de mexer no projeto

Quando a investigação sai do trilho: três padrões e como prevenir

Esses três aparecem sempre, e todos são problema de processo, não do bug

1. O Claude propõe correção antes de citar código

Sintoma: primeira resposta já vem com patch pronto e zero trecho citado

Causa: o prompt pediu solução, não diagnóstico

Solução: reformular pedindo hipóteses com evidência, cada uma amarrada a arquivo e linha

Como prevenir: trabalhar em plan mode, onde as edições ficam bloqueadas até você aprovar o plano. Modo somente leitura é guardrail de processo, não frescura

2. A resposta fica genérica e perde a pista depois de muita ida e volta

Sintoma: ele começa a repetir generalidade e esquece o que já foi descartado

Causa: contexto poluído ou resumido

Solução: reiniciar a investigação com /clear, que zera o histórico mantendo a memória do projeto, em vez de apostar no /compact, que pede um resumo da conversa e substitui o histórico por ele (processo com perda, e o que se perde costuma ser justamente o detalhe que você descartou com trabalho)

Como prevenir: registrar as conclusões da investigação FORA do chat, num arquivo mesmo, e recolar o essencial na sessão nova

3. O subagente devolve resultado que não bate com o problema

Sintoma: ele volta com uma lista bonita de arquivos que não têm nada a ver

Causa: prompt incompleto, porque o contexto do agente pai não é herdado

Solução: reescrever o prompt com caminho de arquivo, mensagem de erro e decisões já tomadas

Como prevenir: padronizar um subagente de investigação. Eles são arquivos Markdown com frontmatter YAML, guardados em .claude/agents/ (nível de projeto, compartilhado com o time) ou em ~/.claude/agents/ (nível de usuário, disponível em todos os projetos). Desde a versão 2.1.198 o /agents não abre mais assistente interativo de criação: ele imprime um lembrete pra você pedir ao Claude ou editar o diretório direto

Tome cuidado com um detalhe chato: o Claude Code não observa a pasta .claude/agents/ dentro de diretórios adicionados com --add-dir ou /add-dir, então subagente criado ou editado ali só carrega depois de reiniciar

E antes de sair copiando o subagente do vizinho, vale a mesma lógica de quando uma skill copiada de outro projeto simplesmente não funciona no seu: o que muda é o contexto do projeto, não a esperteza do modelo

O próximo passo

A inversão central é essa: o valor do debug com Claude Code não está na correção rápida, está em chegar na correção com uma hipótese sustentada por evidência no código

Correção rápida em cima de palpite é dívida com juros, tu paga de novo na semana que vem

Próximo passo prático: pega o próximo bug real e roda o roteiro inteiro em plan mode, do sintoma até o plano aprovado

Depois transforma o que funcionou em instrução no CLAUDE.md do projeto, que é lido no início de cada sessão, pra próxima investigação já começar com o método montado

Menos chute, mais evidência 😀

até o próximo post!

Perguntas frequentes

Qual a diferença entre o plan mode e os outros modos de permissão na hora de investigar um bug?

O plan mode é somente leitura: o Claude lê arquivos e roda comandos de exploração, escreve um plano, mas não edita o código-fonte até você aprovar. Os outros modos disponíveis são default, acceptEdits, auto e dontAsk, que liberam edição em graus diferentes. Pra investigação, o plan mode é o que trava a tentação de já sair corrigindo. Na CLI do Claude Code, você alterna entre os modos com Shift+Tab.

Como reverter uma edição que o Claude Code fez no arquivo errado durante a investigação?

O menu de rewind abre com /rewind ou apertando Esc duas vezes com o campo de prompt vazio. Ele usa os checkpoints, que são um snapshot automático do código capturado antes de cada prompt seu, guardando os 100 mais recentes da sessão. A opção de restaurar código só aparece se aquele checkpoint tiver alteração de arquivo rastreada, senão o menu só oferece restaurar conversa, resumir ou cancelar. Vale lembrar que só entram no checkpoint os arquivos editados na sessão atual, edição manual feita fora do Claude Code normalmente fica de fora.

Vale a pena usar um subagente pra investigar bug em produção, ou é melhor fazer tudo na sessão principal?

Pra varredura pesada, sim: o subagente é uma instância isolada, com contexto próprio, que executa a tarefa e devolve só o resultado, sem lotar a sessão principal com passos intermediários. O detalhe é que a janela dele começa vazia, sem a conversa que você teve com o agente pai. Então caminho de arquivo, mensagem de erro e o que já foi descartado precisam ir escritos no próprio prompt da tarefa. O Claude Code já traz os subagentes nativos Explore e Plan prontos pra isso, sem precisar montar nada.

Por que às vezes não dá pra reproduzir o bug de produção localmente antes de investigar?

Porque, segundo a própria Anthropic, muitos problemas de produção só acontecem sob condições específicas: carga do sistema, comportamento de terceiros e dados reais de usuário combinados. Ambiente de staging normalmente não replica essa combinação. Por isso o alvo do roteiro é reunir evidência (logs, stack trace, janela de tempo) e não insistir em reproduzir tudo local antes de investigar.

Quando usar /clear antes de investigar um bug, e quando isso pode atrapalhar?

/clear zera o histórico da conversa mas mantém a memória do projeto, então é o comando certo pra abrir uma investigação sem herdar contexto de outra tarefa que você tava fazendo antes. Ele é diferente do /compact, que pede um resumo ao modelo e substitui o histórico por esse resumo, um processo com perda. Se a investigação depende de algo que só existe na conversa anterior (uma decisão, um trecho já discutido), esse contexto se perde com o /clear e precisa ser reescrito.

O CLAUDE.md do projeto realmente faz diferença numa investigação de bug?

Faz, porque ele é lido no início de cada sessão e entra no system prompt da conversa, ou seja, o Claude já começa a investigação com esse contexto carregado. Se o projeto ainda não tem um, o /init faz o Claude examinar o código e gerar esse arquivo. O /memory lista os arquivos de memória nos escopos de usuário e de projeto, e cria o arquivo se ele ainda não existir.



Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares