Avaliando qualidade do output — quando confiar, quando revisar

TL;DR

Claude Code produz código que vai de excelente a sutilmente quebrado, e o nível de confiança depende do tipo de tarefa, do contexto fornecido, e do quanto você consegue verificar o resultado. Tarefas mecânicas e bem especificadas merecem mais autonomia; mudanças que afetam regra de negócio, dados, ou produção exigem revisão linha a linha. A calibração não é estática — ela melhora à medida que você acumula evidência de onde o agente acerta e onde erra.

A gradação de confiança

O erro mais comum é tratar Claude Code como confiável ou não confiável de forma binária. A realidade tem nuance:

Alta confiança   ─── tarefas mecânicas em contexto bem especificado
                 ─── refatorações com testes existentes que passam
                 ─── geração de boilerplate, documentação, formatação
                 ─── ajustes de tipos, lint, formato

Confiança média  ─── implementação de features pequenas com TDD
                 ─── debugging de bugs com reprodução clara
                 ─── revisão de PRs (catch de erros óbvios)
                 ─── migrations de estrutura simples

Baixa confiança  ─── lógica de domínio com regras de negócio sutis
                 ─── decisões arquiteturais
                 ─── mudanças em código de pagamento, autenticação, dados
                 ─── operações irreversíveis em produção

Cada categoria pede um modo de revisão diferente. Tarefa mecânica: olhar o diff e confirmar que parece razoável. Lógica de domínio: ler linha por linha, executar manualmente, validar com testes.

Sinais de output confiável

Quando o agente produz output que merece confiança, alguns sinais aparecem:

  • Testes incluídos e passando: o agente escreveu testes que cobrem o novo comportamento, e eles passam
  • Mudanças focadas: o diff toca só o necessário, sem refatorações paralelas
  • Comentários ausentes onde não precisam: código autoexplicativo, sem narração redundante
  • Decisões justificadas no chat: quando o agente fez uma escolha não-óbvia, explicou o porquê
  • Lida com casos de borda: input vazio, null, lista única, valor extremo
  • Não introduz dependências novas sem motivo: usa o que já existe no projeto

Sinais de output suspeito

Inversamente, sinais que pedem revisão atenta:

  • Testes “fake”: o agente afirma que testou, mas o teste não exercita o caminho relevante
  • Try/catch genérico engolindo erros: catch (e) { console.log(e) } esconde problemas
  • Comentários explicando o óbvio: sinal de que o agente está preenchendo espaço, não pensando
  • Variáveis renomeadas sem motivo: refatoração paralela que aumenta área de superfície do PR
  • TODO genérico no meio do código: ”// TODO: handle this case” — vai ficar lá pra sempre
  • Soluções complexas para problemas simples: três classes onde uma função basta
  • Mocks em testes de integração: o teste passa mas não valida nada real
  • Dependências novas sem motivo: adiciona biblioteca para o que poderia ser 5 linhas de código

Estratégias de verificação por tipo de tarefa

Refatoração

Pergunta-chave: o comportamento mudou?

Verificação:
1. Os testes existentes passam sem modificação?
2. Se testes foram modificados, por quê? (justificativa válida?)
3. O diff visual: faz sentido a mudança?
4. Spot check de 2-3 caminhos críticos manualmente

Refatoração com testes existentes que continuam passando é o caso mais seguro de delegação.

Implementação de feature

Pergunta-chave: a feature funciona conforme especificado?

Verificação:
1. Os testes novos cobrem os casos esperados?
2. Casos de borda: lista vazia, input inválido, concorrência?
3. Caminho feliz manual: roda no dev server, exercita a feature
4. Caminho infeliz manual: o que acontece com input ruim?
5. Integração: a feature interage corretamente com o resto do sistema?

Tests passing não é suficiente — o agente pode ter escrito testes incompletos. Manual testing complementa.

Bug fix

Pergunta-chave: o bug foi corrigido sem introduzir outro?

Verificação:
1. Existe teste de regressão? Roda?
2. O fix é local ou tem efeitos colaterais?
3. A causa raiz está clara, ou é só sintoma sumido?
4. Reproduzir o bug manualmente antes e depois do fix

Cuidado especial: agentes às vezes “corrigem” um bug suprimindo a manifestação sem entender a causa. Sempre exija o teste de regressão.

Lógica de domínio

Pergunta-chave: as regras de negócio estão corretas?

Verificação:
1. As regras estão documentadas em algum lugar (PRD, ticket, código existente)?
2. O agente teve acesso a essa documentação?
3. Walk-through linha a linha com a regra em mente
4. Cenários de teste cobrem todas as variações da regra
5. Revisão com alguém do produto/domínio

Lógica de domínio sutil é onde Claude Code mais falha — porque o agente não tem contexto que só existe na cabeça das pessoas.

Mudança em produção

Pergunta-chave: o que acontece se isto estiver errado?

Verificação:
1. Existe rollback claro?
2. Mudança pode ser feita em staging primeiro?
3. Existe feature flag para desligar rapidamente?
4. Logs/alertas vão detectar problema rapidamente?
5. Revisão por outra pessoa do time

Para mudanças em produção, nunca aceite o output do agente sem revisão humana adicional. Independente de quão bem ele parece estar funcionando localmente.

Calibrando confiança ao longo do tempo

Mantenha uma noção empírica de onde o agente acerta e onde erra no seu contexto específico:

DomínioNotas observadas
Boilerplate (DTOs, controllers)Quase sempre correto
Validação de inputMete any quando aperta — sempre revisar tipos
Queries SQLBoa em CRUD; complica em agregações
Testes unitáriosBoa estrutura; cobre casos óbvios, falha em borda
ConcorrênciaFrequentemente erra timing/race conditions
Configuração de CIBoa quando há template; inventa quando não há

Essa tabela é pessoal — cada projeto e estilo de prompt produz padrões diferentes. Vale anotar surpresas (boas e ruins) ao longo das primeiras semanas.

Gates de qualidade por estágio

Defina quais checks são pré-requisito antes de aceitar output em cada estágio:

Antes de commitar

  • Type check passa
  • Lint passa
  • Testes locais passam
  • Spot check visual do diff

Antes de abrir PR

  • Testes de integração passam
  • Manual testing da feature na branch
  • Diff revisado linha a linha
  • CLAUDE.md ainda reflete o estado do projeto

Antes de mergear

  • CI passa
  • Code review humano (não só agente)
  • Para mudanças de risco: aprovação adicional do tech lead

Antes de deploy em produção

  • Deploy em staging
  • Smoke tests em staging
  • Feature flag pronto se aplicável

Quando NÃO usar Claude Code

Reconhecer os limites é parte da calibração:

  • Quando você não consegue verificar o output: se você não entende o código que o agente vai produzir, não dá pra revisar. Use para aprender, mas não para mergear cego.
  • Mudanças com requisitos ambíguos: o agente vai inferir, e a inferência pode estar errada. Esclareça antes.
  • Decisões que envolvem stakeholders: arquitetura, escolhas de tooling, mudanças de contrato — converse com o time antes.
  • Sistemas críticos sem boa cobertura de teste: o agente vai parecer correto e ninguém vai pegar o bug até produção.
  • Lógica de domínio extremamente sutil: regras de imposto, cálculo financeiro, conformidade legal — esses casos pedem expert humano dirigindo.

O paradoxo da confiança crescente

Conforme você usa Claude Code mais, a tendência natural é confiar mais. Isso pode ser perigoso:

  • O agente acerta 95% das vezes, então você começa a só revisar o diff superficialmente
  • Mas é nos 5% que o bug entra — e a calibração relaxada permite que passe
  • O bug em produção te lembra de revisar mais
  • Aí você fica paranoico e revisa tudo linha a linha, perdendo a velocidade

A solução não é confiar mais ou menos — é manter ritual de revisão proporcional ao risco da mudança. Refatoração simples? Diff superficial é OK. Pagamento? Linha a linha sempre.

Métricas para o time

Se o time quer entender saúde da adoção, alguns indicadores:

  • % de PRs gerados com Claude Code que precisam de correção pós-merge: alta = revisão fraca
  • Tempo médio de PR review: deve diminuir com adoção, mas não para zero
  • Cobertura de testes em PRs com Claude Code: deve manter ou melhorar
  • Bugs em produção atribuídos a mudanças geradas pelo agente: tracking simples descobre padrões
  • Confiança auto-relatada do time: pergunte em retro: “você confia no output do agente quando revisa?”

Armadilhas

Confiar porque os testes passam: testes podem ser superficiais. Verifique se cobrem o que importa.

Revisar pouco porque “o agente faz bem”: viés de confirmação. Você lembra das vezes que acertou, esquece das que precisou corrigir.

Revisar tudo porque “não confio no agente”: o oposto é igualmente custoso. Você perde a alavanca da ferramenta.

Tratar revisão como formalidade: passar o olho sem entender o diff não é revisão — é teatro de revisão.

Não documentar padrões de erro: se o agente sempre comete o mesmo tipo de erro no seu projeto, isso vai pro CLAUDE.md como restrição.

Esperar perfeição: Claude Code não substitui pensamento; complementa. Mesmo quando funciona, você precisa entender o resultado.

Veja também