🔀 Imperativo vs declarativo
A diferença sutil entre "faça X" e "X deve passar". Imperativo manda fazer. Declarativo dá um critério de parada.
🎯 Karpathy disse
"LLMs são excepcionalmente bons em looping até bater uma meta específica... Não diga o que fazer, dê critérios de sucesso e assista."
✗ Imperativo (frágil)
O LLM não sabe quando parou. Adicionou alguma validação ≠ resolveu o problema.
✓ Declarativo (sólido)
- email vazio → erro
- email inválido → erro
- senha <8 → erro
- válido → submit"
Critério binário. Passou = pronto.
📋 Transformações comuns
🧪 Testes-primeiro como critério
A forma mais barata de garantir que o entregue resolve o que foi pedido: pedir os testes antes. O LLM escreve teste, vê falhar, implementa até passar.
Red — escreve o teste que falha
"Escreva o teste para o comportamento desejado. Rode. Confirme que falha (porque ainda não está implementado)."
Green — implementa até passar
"Implemente o mínimo necessário para o teste passar. Não mais, não menos."
Refactor — limpa mantendo verde
"Agora simplifique a implementação. Os testes continuam passando? Pronto."
💡 Por que funciona com LLM
O teste é uma spec executável. O LLM não precisa interpretar texto vago — ele tem um sinal claro: passou ou falhou. Loop fechado.
🔁 O loop autônomo
Com critério verificável, o LLM pode rodar testes, ajustar, rodar de novo — sem intervenção a cada iteração. É a superpotência dos agentes modernos.
🎯 Anatomia do loop
✓ Condições pro loop funcionar
- ✓Teste rápido (segundos, não minutos)
- ✓Mensagem de erro clara
- ✓Critério binário (passa/falha)
- ✓Limite de iterações (5-10 max)
✗ Quando o loop trava
- ✗Teste flaky (passa/falha aleatório)
- ✗Erro vago: "something went wrong"
- ✗Sem limite — pode loop infinito
- ✗Critério subjetivo: "ficou bom"
📊 Custo do loop
Cada iteração consome tokens. Vale a pena se a tarefa exige iteração genuína. Não vale para coisa trivial — vira overkill.
📊 Critérios fortes vs fracos
"Faz funcionar" não é critério. É vibes. Critério bom é mensurável, binário, e descreve um fim claro.
✗ Critérios fracos
- • "Funciona bem"
- • "Está limpo"
- • "Performance ok"
- • "Cobertura razoável"
- • "Que pareça profissional"
Todos subjetivos. LLM não consegue verificar.
✓ Critérios fortes
- • "
npm testpassa, 0 failing" - • "Função abaixo de 30 linhas"
- • "Latency < 200ms para input N=1000"
- • "Coverage ≥ 80% nesse módulo"
- • "
lintpassa sem warnings"
Todos mensuráveis. LLM consegue rodar e verificar.
💡 Teste SMART para critérios
Antes de mandar pro LLM, seu critério é:
- Specífico — não "funciona", mas "comando X retorna Y"?
- Mensurável — dá pra rodar e ver passa/falha?
- Atingível — está no escopo da tarefa?
- Relevante — resolve o problema real?
- Time-bound — tem ETA / limite de iterações?
🗺️ Planos com verificação por passo
Para tarefas com múltiplos passos, cada passo deve ter um critério de "passou" antes de seguir. Sem checkpoints, erros se acumulam até o fim.
🔧 Formato de plano com checkpoints
Fail-fast
Se o passo 1 falha, para. Não esconde no passo 2. Erro cedo é barato; erro tarde é caro.
Granularidade
Passos de ~30-60 min cada. Maiores que isso ficam difíceis de verificar.
Reporte
Cada passo termina com "passo X concluído, verify: [resultado]". Status visível.
🐛 Bug fix = reproduzir + passar
A receita universal para corrigir bugs com LLM: primeiro um teste que reproduz, depois implementação que passa. Garante que o bug não volta.
Reproduzir isoladamente
"Escreva um teste mínimo que dispara o bug. Rode. Confirme que falha exatamente como o bug descrito."
Diagnosticar
"Por que esse teste falha? Mostre a causa raiz, não o sintoma."
Corrigir
"Implemente a correção. Roda o teste. Confirma que passa. Roda os outros. Confirma que nenhum quebrou."
Commit do teste
"O teste fica no repo. Daqui pra frente, se alguém reintroduzir o bug, CI pega na hora."
🎯 Por que isso é poderoso
- • Prova de que foi corrigido: teste passa.
- • Prevenção de regressão: CI roda sempre.
- • Documentação viva: próximo dev vê o teste e entende o caso.
- • Loop fechado para o LLM: critério binário, sem ambiguidade.
💡 Prompt-padrão para bug fix
📝Resumo do Módulo
🎓 Você concluiu a trilha!
Agora aplique no seu projeto: copie o CLAUDE.md do repo, adapte ao seu contexto e veja os diffs ficarem cirúrgicos.