Critérios explícitos e redução de falsos positivos
Objetivos de aprendizagem
- Explicar por que critérios categóricos específicos vencem instruções como "seja conservador" ou "reporte só achados de alta confiança" (task statement 4.1).
- Descrever o impacto de falsos positivos na confiança do desenvolvedor no sistema de revisão.
- Aplicar a tática de desabilitar temporariamente categorias com alta taxa de falso positivo.
- Definir critérios de severidade com exemplos de código concretos para classificação consistente.
O problema: precisão em revisão automatizada
No cenário de CI/CD do exame, Claude Code revisa pull requests automaticamente. O risco número um desses sistemas não é deixar passar bugs — é reportar coisas demais. Um revisor automático que comenta 15 itens por PR, dos quais 12 são irrelevantes, treina os desenvolvedores a ignorar todos os comentários, inclusive os 3 verdadeiros. Falsos positivos em uma categoria minam a confiança nas categorias que funcionam bem.
Por que "seja conservador" não funciona
Instruções de calibração genérica — "seja conservador", "reporte apenas achados de alta confiança", "evite falsos positivos" — pedem que o modelo aplique um filtro interno de confiança que ele não calibra bem. A auto-confiança reportada por um LLM não é um proxy confiável da correção do achado (o mesmo motivo pelo qual escalonamento por confiança auto-reportada falha, no Domínio 5). O resultado prático é pouca ou nenhuma mudança na taxa de falsos positivos.
O que funciona é substituir o filtro subjetivo por critérios categóricos, que o modelo consegue aplicar de forma binária:
| Instrução vaga (falha) | Critério categórico (funciona) |
|---|---|
| "Verifique se os comentários do código estão corretos." | "Sinalize um comentário apenas quando o comportamento que ele descreve contradiz o comportamento real do código." |
| "Reporte apenas problemas importantes." | "Reporte: bugs de lógica, vulnerabilidades de segurança, race conditions. Não reporte: estilo, nomenclatura, padrões locais do arquivo, otimizações micro." |
| "Só aponte problemas de que você tenha certeza." | "Sinalize uso de variável apenas se ela puder estar não inicializada em algum caminho de execução demonstrável no diff." |
Padrão de resposta na prova: entre "instruir o modelo a ser mais cuidadoso/confiante" e "definir critérios explícitos do que reportar e do que ignorar", a segunda é praticamente sempre a correta. Filtragem baseada em confiança auto-reportada é um distrator recorrente.
Categorias com alta taxa de falso positivo: desabilite temporariamente
Quando a telemetria mostra que uma categoria específica (ex.: "problemas de performance") tem taxa de falso positivo alta enquanto outras (ex.: "segurança") vão bem, a ação recomendada é desabilitar temporariamente a categoria ruim — removê-la do prompt de revisão — enquanto seus critérios são refinados offline. Isso restaura imediatamente a confiança dos desenvolvedores nas categorias que funcionam, em vez de deixar o ruído contaminar o sistema inteiro. Depois de melhorar os critérios (e validar em amostra), a categoria volta.
Critérios de severidade com exemplos concretos
Se o prompt pede para classificar achados em critical / major / minor sem definir cada nível, a classificação varia entre execuções. A correção é definir cada severidade com critérios objetivos e exemplos de código concretos para cada nível — um mini few-shot de severidade (a Lição 3 aprofunda few-shot).
import anthropic
client = anthropic.Anthropic()
REVIEW_SYSTEM = """Você é um revisor de código automatizado em um pipeline de CI.
REPORTE apenas estas categorias:
- bug: lógica incorreta demonstrável no diff (ex.: off-by-one, null deref).
- security: vulnerabilidade concreta (ex.: SQL injection, segredo hardcoded).
NÃO REPORTE:
- estilo, formatação, nomenclatura;
- padrões já usados de forma consistente no arquivo;
- sugestões de refatoração sem bug associado.
SEVERIDADE (com exemplos):
- critical: perda de dados, execução remota, credencial exposta.
Exemplo: query montada com concatenação de input do usuário.
- major: comportamento incorreto em fluxo principal.
Exemplo: condição invertida que pula a validação de saldo.
- minor: comportamento incorreto em caso-limite raro.
Exemplo: mensagem de erro trocada em branch de exceção.
Formato de cada achado: arquivo, linha, categoria, severidade,
descrição em 1 frase, correção sugerida."""
def review_diff(diff_text: str):
response = client.messages.create(
model="claude-opus-5",
max_tokens=4096,
system=REVIEW_SYSTEM,
messages=[{
"role": "user",
"content": "<diff>\n" + diff_text + "\n</diff>\n\nRevise o diff acima.",
}],
)
return next(b.text for b in response.content if b.type == "text")
print(review_diff("--- a/billing.py\n+++ b/billing.py\n+ total = price * qty"))
Ciclo de melhoria orientado a dados
Para melhorar precisão de forma sistemática, o sistema precisa saber por que os desenvolvedores descartam achados. Incluir um campo detected_pattern na saída estruturada (qual construção de código disparou o achado) permite agrupar os descartes e descobrir padrões de falso positivo — tema da Lição 5.
flowchart TD
A[Revisão automática gera achados] --> B[Dev aceita ou descarta cada achado]
B --> C[Análise dos descartes por detected_pattern]
C --> D{Categoria com FP alto?}
D -->|Sim| E[Desabilitar categoria temporariamente]
E --> F[Refinar critérios + exemplos e validar em amostra]
F --> G[Reabilitar categoria]
D -->|Não| A
Pegadinhas da prova
- Distrator típico: "adicione 'reporte apenas achados de alta confiança' ao prompt". Confiança auto-reportada de LLM é mal calibrada; a resposta certa define categorias explícitas de incluir/excluir.
- Distrator típico: "peça um score de confiança e filtre por threshold" como primeira resposta para falsos positivos. Sem calibração com dados rotulados, o threshold é arbitrário — critérios categóricos vêm primeiro.
- Distrator típico: diante de uma categoria ruidosa, "desligar a revisão automática inteira" ou "manter tudo ligado e pedir desculpas no onboarding". A ação proporcional é desabilitar somente a categoria problemática enquanto ela é refinada.
- Distrator típico: tratar severidade inconsistente com "use bom senso para classificar" — a correção é definir cada nível com critérios e exemplos concretos de código.
Resumo em 5 linhas
- Falsos positivos corroem a confiança do desenvolvedor em todo o sistema, inclusive nas categorias precisas.
- "Seja conservador" / "só alta confiança" não melhoram precisão — o modelo não calibra bem a própria confiança.
- Critérios categóricos explícitos (o que reportar, o que ignorar) são a forma eficaz de reduzir falsos positivos.
- Categoria com FP alto: desabilite temporariamente, refine os critérios, valide em amostra e reabilite.
- Severidade consistente exige definição objetiva de cada nível com exemplos concretos de código.
Documentação oficial
Questões de fixação
1. O revisor automático da equipe marca comentários de código como "imprecisos" com frequência, mas 80% dessas marcações são descartadas pelos devs. O prompt atual diz "verifique se os comentários estão corretos e seja conservador". Qual mudança tende a reduzir mais os falsos positivos?
Gabarito: B. Critérios categóricos ("contradiz o comportamento real") são aplicáveis de forma binária e reduzem falsos positivos de verdade. A é a mesma instrução vaga com outras palavras. C depende de confiança auto-reportada, mal calibrada e sem validação. D aumenta custo e ainda pode reforçar falsos positivos sistemáticos, que tendem a se repetir nas duas execuções.
2. A telemetria de um sistema de revisão em CI mostra: categoria "security" com 92% de aceitação, categoria "performance" com 25%. Os devs começaram a ignorar todos os comentários do bot. Qual é a ação mais adequada agora?
Gabarito: C. Remover só a categoria ruidosa restaura a confiança nas categorias boas imediatamente e dá tempo de consertar a ruim offline. A joga fora a categoria security, que funciona bem. B já se provou insuficiente — é instrução vaga. D transfere o custo do problema para os devs e acelera o abandono da ferramenta.
3. Achados idênticos recebem severidades diferentes em execuções diferentes (ora "critical", ora "minor"). O prompt atual lista apenas os nomes dos níveis. Qual correção o exame espera?
Gabarito: A. Classificação consistente exige que cada nível tenha definição objetiva e exemplos — o modelo passa a ancorar a decisão em critérios, não em julgamento livre. B reduz aleatoriedade de amostragem, mas não resolve a ambiguidade dos níveis (a classificação continua arbitrária, só que consistentemente arbitrária). C é instrução vaga. D abandona a automação em vez de corrigi-la.
4. (escolha duas) Quais afirmações sobre falsos positivos em revisão automatizada estão corretas?
Gabarito: A e D. A descreve o efeito de contaminação da confiança; D é o princípio central do task statement 4.1. B está errada — filtros de confiança auto-reportada não melhoram precisão de forma confiável. C ignora o custo de atenção e o efeito "ignorar tudo". E abandona a automação; o objetivo é calibrá-la.