Quando o mesmo contexto escreve e aprova, “parece pronto” vira critério. Um crítico
separado, que roda comando de verdade e devolve nota 0-100, transforma isso em evidência — ou diz
exatamente o que falta.
O problema: quem constrói não pode dar a nota
Agente que revisa o próprio trabalho não revisa nada: ele confirma a intenção que já tinha. O
sintoma é conhecido — rodadas de revisão que não convergem, “já está pronto” repetido, e o defeito
aparecendo depois, na mão de quem confiou.
A correção não é pedir “seja rigoroso”. É tirar a nota de dentro do agente: um script que mede,
com comandos reais, e um contexto separado que audita a nota.
Quatro papéis, nunca fundidos no mesmo contexto
- Orquestradoro agente que executa a tarefa: escolhe os checks, roda as rodadas,
conserta a infraestrutura e assina o relatório.
- Construtorquem escreveu o artefato: corrige uma classe de falha por passada.
- Críticoum script que você escreve (
loop_runner.py + seus checks):
executa cada comando, guarda a saída crua e imprime SCORE= e GAPS=.
- Revisoroutro agente/modelo, contexto novo, sem a justificativa do construtor:
pode reabrir o loop.
Regra zero: construtor ≠ crítico ≠ revisor. Se o mesmo contexto faz os três, o loop é teatro.
O loop, passo a passo
- Declare os checks antes de escrever códigoPara cada check: nome, comando, peso e o
que significa “passar”. Os pesos somam 100.
{"checks":[{"name":"pytest","cmd":"set -o pipefail; pytest -q","weight":40},
{"name":"no_secret_scan","cmd":"gitleaks detect --no-banner","weight":30}]}
- Rode o críticoEle executa cada comando de verdade, grava a evidência e nunca
pergunta a um modelo se o trabalho está bom — mede.
python scripts/loop_runner.py --config loop.json --round 1
- Nota, comparação, decisãoNota acima do limite vai para o revisor; abaixo, pegue a
maior lacuna, corrija e rode de novo. Limite as rodadas (8 é bastante): se nunca converge, o
conjunto de checks está errado, não o código.
- Revisão independente antes de entregarMesmo artefato, contexto novo, sem a
justificativa do construtor. Painel de 2-3 especialistas (qualidade e segurança sempre) devolvendo
JSON estrito.
- Gate de segurança, fail-closedSegredo no diff ou no histórico, achado de alta
severidade, falha de autenticação/travessia de caminho/injeção bloqueiam a entrega mesmo com
testes perfeitos. Resposta inconclusiva conta como bloqueio, nunca como passe.
- Relate com nota, evidência e o que não foi verificávelO relatório diz o que foi
medido, com a saída crua, e o que não deu para verificar — sem “provavelmente ok”.
Como é a saída real
Vermelho é o caso quebrado (o gate barra); verde é o que passa. Os dois abaixo são execuções de
verdade, não ilustração.
$ python scripts/loop_runner.py --config loop.json --round 3
SCORE=55
GAPS=[pytest::exit_1, no_secret_scan::missing]
GATE=failed
$ echo $?
1
$ python scripts/loop_runner.py --config loop.json --round 7
SCORE=100
GATE=passed
$ echo $?
0
Os quatro jeitos de um loop verde mentir
- O pipe esconde o código de saída
pytest | tail devolve o código do
tail (0) e o crítico dá nota 100 com um teste falhando escondido na saída. Use
set -o pipefail dentro de cada check.
- Timeout menor que o check é zero silenciosoO crítico morre pelo próprio timeout e
o orquestrador lê nota 0 com lista de lacunas vazia — e roda de novo sem ter o que corrigir.
Timeout acima da duração real, sempre com o log cru guardado.
- Um “passou” de curto-circuitoUm servidor que responde 200 pode ser o servidor
errado: em colisão de porta o check testa outro app e falha pelo motivo errado. Verifique
identidade (título, versão, um payload conhecido), não só alcance.
- Baseline regenerado para ficar verdeRefazer a referência visual “para passar”
apaga a regressão que o teste deveria pegar. Baseline muda por decisão explícita, com justificativa
no histórico — nunca para calar o check.
O que isso muda no dia a dia
O efeito prático não é a nota: é a conversa. “Está pronto?” deixa de ser opinião de quem
construiu e passa a ser SCORE=100 com a saída dos comandos anexada — ou uma lista de
lacunas com nome e peso. Quando algo não pôde ser verificado, isso aparece escrito, em vez de virar
um verde falso.
É o mesmo padrão em qualquer entrega: código, pipeline, migração de dados, documento que alguém
vai usar para decidir.
Comece agora
A skill que faz isso está publicada como AI Test Loop — o pacote traz o
loop_runner.py, a rubrica de pontuação, o prompt do revisor e os checks de segurança.
O repositório é aberto (MIT) e a versão da loja inclui os guardas prontos.
Ver a skill AI Test Loop
Pegar a versão grátis
Prefere que eu instale no seu projeto? Setup guiado a partir de
R$ 1.500, com o primeiro ciclo rodado junto.
← todas as skills
Pagamento processado pelo
Stripe — nenhum dado de cartão passa por este servidor. Entrega imediata após a confirmação.
Termos, entrega e reembolso.