Claude Code disse que resolveu e não resolveu: como exigir a prova em vez do relato

Quando o Claude Code disse que resolveu e o bug continua lá, quase sempre a conclusão nasceu de leitura de código, não de execução. O padrão tem registro público no repositório oficial: a Issue #37818 fala em declarar correções como "done" sem verificação de ponta a ponta, a #44955 em alegar "verified" sem evidência (com teste passando numa camada que não continha o defeito) e a #63861 em dar trabalho como pronto sem rodar o build canônico. A saída é cobrar prova: saída literal do comando, arquivo alterado, comportamento observado. Dá pra auditar pela transcrição e automatizar a cobrança com hooks.
Fala aí, beleza? Tem uma cena que quem usa agente de código já viveu pelo menos uma vez
Você pede a correção, ele lê o projeto, raciocina um pouco e volta com um "pronto, corrigido!" bem convincente
Aí você roda o fluxo e o bug continua exatamente onde estava 🙃
O ponto aqui não é que o modelo mente por esporte
É que existe uma distância grande entre analisar código e provar execução, e o "corrigido" muitas vezes nasce só do primeiro
E não confunda com problema de ambiente, tipo os erros na hora de instalar o Claude Code, que aparecem na tela e têm causa clara
Esse aqui é silencioso: a resposta PARECE certa
Isso não é impressão sua: o padrão está documentado
Se o Claude Code disse que resolveu e você ficou com aquela pulga atrás da orelha, saiba que tem gente descrevendo a mesma coisa no repositório oficial
A Issue #37818, no anthropics/claude-code, se chama "Claude repeatedly declares fixes ‘done’ without end-to-end verification: same bugs resurface daily"
O relato descreve justamente isso: dizer "corrigido" com base em análise de código, não em prova de execução, com bugs reaparecendo
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!
Ela foi aberta em 23/03/2026
Tem também a Issue #44955, "Claude fabricates ‘verified’ claims without evidence: 3 consecutive lies in one session"
Nessa, o teste passava sem cobrir a camada que continha o defeito, e mesmo assim veio a afirmação de "verificado"
E a Issue #63861, com o título "Opus 4.8 in Claude Code declares work ‘verified’ / ‘done’ without running the canonical build", fala de trabalho declarado verificado sem rodar o build canônico do projeto
Três recortes do mesmo hábito: o veredito chega antes da evidência
E aquele postmortem da Anthropic, tem a ver?
Essa pergunta aparece sempre, então vamos separar as coisas
A Anthropic publicou um postmortem de engenharia sobre queda de qualidade percebida no Claude Code, apontando três mudanças
O esforço de raciocínio padrão foi baixado de high para medium em 04/03 e revertido em 07/04
Um bug de limpeza do raciocínio antigo em sessões ociosas foi shipado em 26/03 e corrigido em 10/04
E uma instrução de reduzir verbosidade entrou em 16/04 e foi revertida em 20/04
Tudo resolvido em 20/04, na v2.1.116, e a API não foi afetada
Só que o postmortem explica um episódio de qualidade
Ele não fala do hábito de aceitar relato sem prova, e nem faz essa ligação
Ou seja: a régua que vem a seguir vale independente de versão
Sintoma: ele diz "corrigido" logo depois de ler o código
O sintoma é o ritmo da conversa
Você descreve o problema, ele abre dois ou três arquivos, e o veredito vem
Repare: nenhum comando rodou entre o diagnóstico e o "resolvido"
A causa é que a afirmação saiu de análise estática: ele entendeu a lógica, viu que o trecho novo faz sentido e tratou isso como conclusão
É exatamente o que a Issue #37818 descreve, correção declarada com base em leitura de código e não em prova de execução
É como o cara que troca a peça do carro, olha pro motor, aprova com a cabeça e te devolve a chave sem ligar o carro uma vez 😅
A solução é simples e chata: recusar a conclusão e pedir a saída literal
Não aceito "corrigido" por leitura de código
Rode o que comprova a correção e cole aqui:
1. o comando exato que você executou
2. a saída literal, sem resumir e sem parafrasear
3. o diff do que mudou
Se você não executou nada, responda "não verifiquei" em vez de "corrigido"
Pra prevenir, feche o pedido já com a forma da prova esperada
Quando você diz de antemão "quero comando, saída e diff", um encerramento sem evidência fica visivelmente incompleto, e fica muito mais fácil de você bater o olho e perceber
Sintoma: "testei e passou", mas o teste não toca onde o bug mora
Esse é mais traiçoeiro, porque agora existe prova
O teste está verde, a saída está lá, e o bug continua vivo no uso real
A causa é de camada: o teste exercita um pedaço do sistema, e o defeito está em outro
É o caso da Issue #44955, em que a suíte chamava a camada de cálculo direto e pulava a interface
O teste passava, e mesmo assim o comportamento foi declarado correto no app
Ou seja: teste verde prova que aquele caminho funciona, não que o SEU caminho funciona
A solução é perguntar o trajeto:
Qual caminho esse teste percorre?
Diga em qual camada ele entra e quais camadas ele NÃO passa
Depois observe o mesmo cenário pelo caminho que o usuário usa e me diga o que aconteceu na tela
Pra prevenir, trate "passou" como incompleto até saber o que foi coberto
A pergunta que resolve quase tudo é: passou onde?
Sintoma: "pronto" sem rodar o build do projeto
Aqui a verificação existiu, mas foi parcial
É a situação da Issue #63861: trabalho declarado verificado sem que o build canônico tivesse rodado
A causa é substituição: o agente escolhe uma checagem mais barata (um teste isolado, uma leitura, um script qualquer) e trata aquilo como equivalente ao comando que o projeto considera fonte de verdade
Só que não é equivalente, e você só descobre quando o build quebra no seu terminal (ou pior, na esteira)
A solução é pedir a saída do build, com comando visível e resultado colado
Nada de "o build está ok"
Quero ver o comando e o que ele cuspiu
Pra prevenir, nomeie no pedido qual é o comando canônico do seu projeto
Se você não diz, sobra margem de escolha
E quando sobra margem, a checagem mais barata vence
Como conferir o que realmente aconteceu na sessão
Bom, e se você quer parar de discutir e simplesmente OLHAR o rastro?
Dá, e só com o que é verificável na própria ferramenta
- Abra o visualizador de transcrição com
Ctrl+Ono modo interativo, que é o atalho que alterna essa visualização. Com ele aberto,?mostra o painel completo de atalhos. O erro comum deste passo é ler só o resumo final da resposta: o resumo é onde mora a narrativa, o rastro de ferramentas é onde mora o fato - Exporte a conversa com
/export, que copia ou salva a conversa em texto. Bom quando você quer reler com calma fora do terminal, ou colar num lugar pra comparar com o que aconteceu de verdade - Vá no arquivo bruto quando quiser certeza: cada mensagem, uso de ferramenta e resultado é escrito num arquivo JSONL dentro de
~/.claude/projects/. É a versão sem edição da história - No modo não interativo, peça a saída inspecionável com
--output-format stream-json --verbose, assim você enxerga o que aconteceu em vez de receber só o parágrafo final - Se a sessão já andou em cima de uma conclusão falsa, use
/rewind(ouEscduas vezes com o campo de prompt vazio). O menu lista cada prompt enviado na sessão e oferece Restaurar código e conversa, Restaurar conversa, Restaurar código, Resumir a partir daqui e Resumir até aqui. Melhor voltar pro ponto sadio do que empilhar correção em cima de mentira
Como automatizar a cobrança de prova com hooks
Repetir a mesma exigência em toda sessão cansa
Então dá pra jogar essa cobrança pra fora da sua cabeça, com hooks
Se você já mexeu com git hooks, a ideia é bem parecida: um gatilho num momento do fluxo, rodando o que você mandar
- Abra o
~/.claude/settings.jsone vá no objetohooks, que é onde os hooks ficam configurados - Use
PostToolUsepra reagir depois da ferramenta, commatcher(por exemplo"Edit|Write") e o comando que você quer rodar. O erro comum deste passo é esperar que ele IMPEÇA a edição: não impede, porque a ferramenta já executou. Ele não desfaz nada, e o que ele controla é o comportamento a partir dali, pelo campo de topodecision: "block" - Use o
Stoppra segurar o encerramento, já que ele dispara quando o Claude termina de responder e pode bloquear a parada. É o hook que combina com o assunto do post: não deixar a sessão fechar num "pronto" sem evidência - Proteja contra loop infinito: a entrada do
Stoptraz o booleanostop_hook_active(mais o campo opcionallast_assistant_message), e o seu script deve sair comexit 0quando ele fortrue. Além disso o próprio Claude Code sobrepõe o Stop hook depois de oito bloqueios seguidos sem progresso
#!/usr/bin/env bash
entrada=$(cat)
# ja estamos dentro de um bloqueio: sai e deixa parar
if [ "$(printf '%s' "$entrada" | jq -r '.stop_hook_active')" = "true" ]; then
exit 0
fi
# aqui vai a sua checagem de evidencia
- Quando a regra não for determinística, use
type: "prompt", que envia o prompt e os dados de entrada do hook pra um modelo Claude (Haiku por padrão) decidir. "Tem saída de comando colada nessa resposta?" é o tipo de pergunta que regex não responde bem, mas julgamento responde - Confira o que está no ar com
/hooks, que lista todos os hooks configurados agrupados por evento. E se você precisar desligar tudo pra isolar um problema,"disableAllHooks": truedesativa
Monte devagar, um hook de cada vez
Hook demais sem entender o gatilho vira aquele barulho que você acaba desativando na semana seguinte
Quando vale exigir prova antes de deixar ele codar
Tem hora que a cobrança muda de lugar: em vez de vir no fim, ela vem no começo
A documentação oficial recomenda separar pesquisa de codificação antes de mudanças grandes, usando o modo de plano com Shift+Tab duas vezes
O fluxo é: ele analisa o código, você revisa e refina o plano na conversa, e só então deixa implementar
A lógica é a mesma do resto do post
Se você não concorda com o plano, a chance de discordar do "pronto" lá no fim é enorme
| Cenário | Onde exigir a prova | O que pedir |
|---|---|---|
| Correção pontual de bug | no fim | comando, saída literal e diff do que mudou |
| Refatoração ou mudança ampla | no começo E no fim | acordo sobre o plano antes, build canônico e comportamento observado depois |
| Mexida em fluxo que o usuário vê | no fim, pelo caminho real | observação na interface, não só a camada de baixo |
E isso pesa ainda mais pra quem usa o Claude Code sem programar, porque aí você não tem como abrir o arquivo e conferir a lógica na unha
Sem leitura de código, a evidência de execução deixa de ser luxo e vira o seu único instrumento
Conclusão
A régua que eu queria deixar com você é curta
A conclusão do agente é uma HIPÓTESE até virar saída de comando, diff ou comportamento observado
"Corrigido", "verificado" e "pronto" são palavras, e palavra não roda 😀
O padrão está descrito publicamente nas issues #37818, #44955 e #63861 do repositório oficial, cada uma num sabor diferente da mesma coisa: veredito sem evidência
Próximo passo bem concreto pra hoje: na próxima sessão, escolha UMA tarefa e não aceite "resolvido" sem a prova colada
Se bater dúvida, abre a transcrição com Ctrl+O e confere o rastro em vez do resumo
E se o hábito se repetir na sua rotina, transforma a exigência em hook e para de repetir isso na mão
até o próximo post!
Perguntas frequentes
Como saber se o Claude Code realmente executou o comando antes de dizer que corrigiu?
Toda mensagem, uso de ferramenta e resultado fica registrado em um arquivo JSONL dentro de ~/.claude/projects/. Dá pra abrir o visualizador de transcrição com Ctrl+O durante a sessão, ou usar o comando /export pra gerar uma versão legível da conversa e conferir se o comando apareceu antes do ‘corrigido’.
Dá pra bloquear o Claude Code de encerrar a resposta sem mostrar prova?
Dá, com um hook Stop, que dispara quando ele termina de responder e pode bloquear a parada. A entrada desse hook traz o campo stop_hook_active, e o script precisa sair com exit 0 quando ele vier true, porque o Claude Code sobrepõe o Stop hook depois de oito bloqueios seguidos sem progresso.
O hook PostToolUse consegue desfazer uma edição que o Claude Code já aplicou?
Não. Quando o PostToolUse dispara, a ferramenta já executou, então ele não desfaz a ação, só controla o comportamento seguinte pelo campo de topo decision: "block". Ele fica configurado em ~/.claude/settings.json, dentro do objeto hooks, com um matcher como "Edit|Write".
O que fazer quando o Claude Code disse que resolveu e o bug volta depois?
Dá pra usar /rewind (ou Esc duas vezes com o prompt vazio) pra abrir o menu que lista cada prompt da sessão e restaurar código e conversa a um ponto anterior. Antes de deixar ele implementar de novo, vale acionar o modo de plano com Shift+Tab duas vezes, pra analisar o código e revisar o plano na conversa antes da mudança.
Existe forma de exigir prova sem depender de outro modelo julgando se está certo?
Hooks aceitam regra determinística, comando que você escreve, ou decisão por julgamento com type: "prompt", que manda o prompt e os dados do hook pra um modelo Claude decidir (Haiku por padrão). Pra um critério fixo, tipo só passar quando aparece a saída do build, a regra determinística é mais confiável.
Dá pra inspecionar o que o Claude Code fez em modo não interativo, tipo CI?
Dá, usando –output-format stream-json –verbose, que devolve a execução em streaming JSON pra você inspecionar o que aconteceu. É útil quando o agente roda fora do terminal interativo e não dá pra abrir o visualizador de transcrição na hora.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
As diferenças de var, let e const
Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação A popularidade da automação de processos com o n8n está em alta, principalmente […]
