Cada aula deu uma peça: avaliador, critérios, guarda, atalhos, evals, juiz. O portão as põe em fila, das baratas para a cara: o que o código reprova não chega a gastar cota com modelo. Nesta aula você monta o portão, liga no loop headless do curso 2 e sai com o plano datado para fazer o seu.
1As cinco camadas e a ordem: barato primeiro, modelo por último
2portao.env fora do repo: o agente não edita o juiz
3O portão como teste final do loop-longrun.sh
4O mapa do curso e o seu plano com datas
Objetivo: montar o portão em camadas (critérios, guarda, atalhos, evals, avaliador) e ligá-lo ao seu loop, com o plano datado.
01 · Cinco camadas, uma saída
Clique em cada camada. Todas rodam; o avaliador por modelo só se as baratas passarem.
Clique em cada bloco do diagrama para ver o que ele faz.
Camada sem configuração aparece como pulada, nunca como aprovada em silêncio.
02 · Veja o portão rodar
Cada camada é uma etapa. Na primeira execução a guarda reprova: corrija e rode de novo.
camadas a rodar
camada em curso
aprovada
reprovada
Simulação ilustrativa no navegador. O portão de verdade, com agentes falsos, está logo abaixo.
03 · Ensaio: o portão contra o chumba e o bom
O portao.env fica fora do projeto. AVALIADOR_CMD aponta para o avaliador falso: zero chamadas.
Terminal · portão
K=~/projetos/loop-r-eng-verificacao-v72/kit
cat > /tmp/ensaio-verif-portao.env <<EOF
GOAL=/tmp/ensaio-verif/goal.md
GUARDA_DIR=/tmp/ensaio-verif/guarda
ESCONDIDOS=/tmp/ensaio-verif/escondidos
AVALIADOR_CMD=$K/avaliador-falso.sh
EOF
for modo in chumba bom; do
bash $K/ensaio.sh > /dev/null && cd /tmp/ensaio-verif/proj
cp $K/goal-ensaio.md ../goal.md && sed -i '/limpo e bem documentado/d' ../goal.md
GUARDA_DIR=/tmp/ensaio-verif/guarda python3 $K/guarda-testes.py congelar . > /dev/null
$K/agente-falso.sh $modo < /dev/null > /dev/null
echo "## $modo"; $K/portao.sh . /tmp/ensaio-verif-portao.env; echo "saída: $?"
done
Exemplo do repositório
## chumba
criterios REPROVADO → /tmp/portao/criterios.log
guarda OK
atalhos REPROVADO → /tmp/portao/atalhos.log
evals pulada (sem configuração)
avaliador pulada (camada barata já reprovou: não gaste cota)
PORTÃO: REPROVADO em criterios atalhos
saída: 1
## bom
criterios OK
guarda OK
atalhos OK
evals pulada (sem configuração)
avaliador OK
PORTÃO: APROVADO
saída: 0
No chumba a guarda passa (o juiz está intacto); quem reprova é o critério de função com entrada nova (acao-reacao) e os testes escondidos.
Se o portao.env, o goal.md ou os testes escondidos ficam dentro do repositório, o agente pode editá-los, e o portão passa a ser dele. Guarde os três fora (no ensaio, em /tmp; no seu projeto, numa pasta tipo ~/portoes/[projeto]/).
04 · O portão como teste final do loop headless
No loop-longrun.sh do curso 2, TESTE_FINAL decide o "concluído". Ponha o portão lá. Rode depois do bloco anterior (usa o mesmo portao.env).
Terminal · loop com portão (agentes falsos)
K=~/projetos/loop-r-eng-verificacao-v72/kit; L=~/projetos/execucao-longa/tools
bash $K/ensaio.sh > /dev/null && cd /tmp/ensaio-verif/proj
cp $K/goal-ensaio.md ../goal.md && sed -i '/limpo e bem documentado/d' ../goal.md
GUARDA_DIR=/tmp/ensaio-verif/guarda python3 $K/guarda-testes.py congelar . > /dev/null
for m in chumba bom; do printf '#!/usr/bin/env bash\nexec %s/agente-falso.sh %s\n' $K $m > /tmp/agente-$m.sh; chmod +x /tmp/agente-$m.sh; done
$L/novo-longrun.sh $PWD slug > /dev/null && D=$(ls -d $PWD/longrun/*)
echo "Implemente slug() em slug.py. Não mexa em tests/." > $D/prompt.md
cat > $D/loop.env <<ENV
TESTE_RAPIDO="python3 -m pytest -q"
TESTE_FINAL="$K/portao.sh . /tmp/ensaio-verif-portao.env"
PROTEGIDOS="tests/ pytest.ini *conftest.py"
PERMITIDOS="slug.py"
MAX_CICLOS=2
MIN_CICLO=2
MEM=1G
ESTAGNACAO=3
ENV
git add -A && git commit -qm "longrun: pasta"
CODEX_BIN=/tmp/agente-chumba.sh $L/loop-longrun.sh $D; echo "saída: $?"
CODEX_BIN=/tmp/agente-bom.sh $L/loop-longrun.sh $D; echo "saída: $?"
Exemplo do repositório
2026-10-19 06:19:56 início: rápido=0 passed · agente=codex · teto 2x2min · mem 1G
2026-10-19 06:19:56 ciclo 1: começa
2026-10-19 06:19:56 ciclo 1: agente saiu rc=0 em 0s
2026-10-19 06:19:56 ciclo 1: rápido=3 passed (melhor antes: 0)
2026-10-19 06:19:56 ciclo 1: checkpoint commitado
(… ciclo 2 igual, rápido=3 passed …)
2026-10-19 06:19:58 PARADO: teto de 2 ciclos atingido sem passar o teste final
saída: 1
2026-10-19 06:19:59 início: rápido=3 passed · agente=codex · teto 2x2min · mem 1G
2026-10-19 06:19:59 ciclo 1: começa
2026-10-19 06:19:59 ciclo 1: agente saiu rc=0 em 0s
2026-10-19 06:19:59 ciclo 1: rápido=3 passed (melhor antes: 3)
2026-10-19 06:19:59 ciclo 1: checkpoint commitado
2026-10-19 06:20:00 CONCLUÍDO no ciclo 1: teste final passou ()
saída: 0
O chumba fez o teste rápido ir de 0 para 3 passed: pelo teste visível, parecia progresso. O portão segurou o "concluído". Os parênteses vazios só dizem que o portão não imprime "N passed".
O loop-longrun.sh commita o checkpoint antes de rodar o TESTE_FINAL. Quando o portão roda, o git diff HEAD já está vazio: as linhas CHUMBADO e SILENCIA do atalhos.py e o diff do avaliador não veem o trabalho do ciclo. No ensaio quem reprovou foram os critérios e os testes escondidos. Se você depende da leitura do diff no loop, compare com o commit de base (antes do primeiro ciclo), não com HEAD.
05 · Prática final
O portão no ensaio e no seu loop.
E21 · Portão contra chumba e bom
10 min
Rode o bloco do portão e depois o do loop com portão.
Pronto quando: o portão imprime PORTÃO: REPROVADO em criterios atalhos (saída: 1) para o chumba e PORTÃO: APROVADO (saída: 0) para o bom; o loop termina primeiro com PARADO: teto de 2 ciclos e depois com CONCLUÍDO no ciclo 1.
E22 · O portão do seu loop
60 min
No seu projeto: goal.md conferido (aula 2), guarda congelada no commit de base (aula 3), 3 testes escondidos (aula 4) e, se a tarefa mexe no comportamento de um agente, o conjunto de ouro (aula 5). Escreva o portao.env fora do repo (com o conjunto de ouro: EVAL_AGENTE, EVAL_BASE, EVAL_CASOS e EVAL_PROMPT apontando para os seus arquivos da aula 5) e rode o portão antes e depois do trabalho.
Pronto quando: antes do trabalho, $K/portao.sh . [seu portao.env]; echo $? → PORTÃO: REPROVADO e 1; depois, → PORTÃO: APROVADO e 0, com no máximo uma camada pulada.
06 · O mapa do curso
Quatro entregas, na ordem. Clique num exercício para ver o "pronto quando".
Aula 806 · O mapa do cursoQuatro entregas, na ordem. Clique num exercício para ver o "pronto quando".
Dia 1Quem confere
aulas 1 e 2
3 exercícios
Avaliador separado e goal.md conferido por comando.
Você acertou {a} de {n}. Acertando todas, a aula é marcada como concluída.
Escolha uma alternativa. A explicação aparece depois da sua tentativa.
09 · O curso em três frases
Quem fez não confereAvaliador separado, critério por comando e prova impressa: o relato do agente não decide nada.
O juiz fica fora do alcanceTestes congelados com tudo o que o pytest lê, escondidos e portao.env fora do repo; teste suspeito vira relato, nunca ajuste.
Medir com honestidadeConjunto de ouro com regressão, juiz calibrado e pass^k com variância; e o portão em camadas como teste final do loop.