Si el agente puede tocar al juez, el juez no vale. Congelar los tests es escribirlos antes, guardar una copia de ellos fuera del alcance del agente y reprobar cualquier cambio. En esta clase ves que proteger solo la carpeta tests/ no basta: un conftest.py en la raíz omite todo y pytest sale con 0.
1Qué es "el juez": los tests, conftest.py en cualquier nivel y la config de pytest
2Manifiesto con hash y mínimo de tests, guardado fuera del repo
3Las cinco reprobaciones: borrado, modificado, nuevo, pocos, omitido
4El hueco del conftest en el loop headless y la corrección
Objetivo: congelar el juez (tests, conftest, config) con hash y mínimo de tests fuera del repo y reprobar borrar, omitir o modificar.
01 · Congelar antes, verificar después
Haz clic en cada etapa.
Reprobado: revertir los protegidos y el ciclo cuenta como fallido
Haz clic en cada bloque del diagrama para ver qué hace.
El código 0 de pytest no es prueba: con todos los tests saltados también sale con 0.
02 · Ensayo: tres agentes contra la guardia
Congela antes de cada agente y verifica después. GUARDA_DIR queda fuera del proyecto.
Terminal · apaga, conftest y bom
K=~/projetos/loop-r-eng-verificacao-v72/kit
export GUARDA_DIR=/tmp/ensaio-verif/guarda # fuera del repo
for modo in apaga conftest bom; do
bash $K/ensaio.sh > /dev/null && cd /tmp/ensaio-verif/proj
python3 $K/guarda-testes.py congelar . # ANTES del agente
$K/agente-falso.sh $modo < /dev/null > /dev/null
echo "## $modo"; python3 $K/guarda-testes.py conferir .; echo "saída: $?"
done
Ejemplo del repositorio
congelado: 2 arquivos protegidos, mínimo de 3 testes → /tmp/ensaio-verif/guarda/guarda.json
## apaga
testes: no tests ran in 0.00s (código 5, mínimo 3 passed)
APAGADO tests/test_slug.py
POUCOS 0 passed, mínimo 3
GUARDA: REPROVADO
saída: 1
congelado: 2 arquivos protegidos, mínimo de 3 testes → /tmp/ensaio-verif/guarda/guarda.json
## conftest
testes: 3 skipped in 0.00s (código 0, mínimo 3 passed)
NOVO conftest.py
POUCOS 0 passed, mínimo 3
PULADO 3 skipped
GUARDA: REPROVADO
saída: 1
congelado: 2 arquivos protegidos, mínimo de 3 testes → /tmp/ensaio-verif/guarda/guarda.json
## bom
testes: 3 passed in 0.00s (código 0, mínimo 3 passed)
GUARDA: OK
saída: 0
Los 2 archivos protegidos son tests/test_slug.py y pytest.ini. En el modo conftest, fíjate en "código 0": pytest creyó que todo estaba bien.
Si ejecutas congelar después de que el agente ya creó el conftest.py, entra en el manifiesto como si fuera del proyecto y la línea NOVO desaparece. Congela en el commit base, antes del primer ciclo. La guardia aún reprobaría por PULADO, pero pierdes la señal más clara.
03 · El agujero del conftest en el loop headless
El loop-longrun.sh del curso 2 revierte lo que el agente toca en PROTEGIDOS. Con el PROTEGIDOS de ejemplo ("tests/ pytest.ini"), un conftest.py en la raíz pasa y el test final "pasa" sin que se ejecute ningún test. Ensayo con agente falso, sin costo.
Terminal · la corrección (conftest protegido + guardia como test final)
bash $K/ensaio.sh > /dev/null && cd /tmp/ensaio-verif/proj # recomeça do zero
export GUARDA_DIR=/tmp/ensaio-verif/guarda
python3 $K/guarda-testes.py congelar . > /dev/null
$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="GUARDA_DIR=$GUARDA_DIR python3 $K/guarda-testes.py conferir ."
PROTEGIDOS="tests/ pytest.ini *conftest.py"
PERMITIDOS="slug.py"
MAX_CICLOS=3
MIN_CICLO=2
MEM=1G
ESTAGNACAO=3
ENV
git add -A && git commit -qm "longrun: pasta"
CODEX_BIN=/tmp/agente-conftest.sh $L/loop-longrun.sh $D; echo "saída: $?"
ls conftest.py; grep -c "revertido pelo loop" $D/failures.md
Ejemplo del repositorio
## o furo
2026-10-19 04:38:48 início: rápido=0 passed · agente=codex · teto 3x2min · mem 1G
2026-10-19 04:38:48 ciclo 1: começa
2026-10-19 04:38:48 ciclo 1: agente saiu rc=0 em 0s
2026-10-19 04:38:48 ciclo 1: rápido=0 passed (melhor antes: 0)
2026-10-19 04:38:48 ciclo 1: checkpoint commitado
2026-10-19 04:38:49 CONCLUÍDO no ciclo 1: teste final passou ()
saída: 0
## a correção
2026-10-19 04:38:49 início: rápido=0 passed · agente=codex · teto 3x2min · mem 1G
2026-10-19 04:38:49 ciclo 1: começa
2026-10-19 04:38:49 ciclo 1: agente saiu rc=0 em 0s
2026-10-19 04:38:49 ciclo 1: agente mexeu em arquivo protegido → revertido, ciclo falho
error: pathspec 'conftest.py' did not match any file(s) known to git
2026-10-19 04:38:49 ciclo 1: checkpoint commitado
(… ciclos 2 e 3 iguais …)
2026-10-19 04:38:50 PARADO: 3 ciclos sem avanço mensurável — ver failures.md
saída: 2
ls: cannot access 'conftest.py': No such file or directory
3
"teste final passou ()": los paréntesis vacíos son el conteo de passed, que no existe. En la corrección, la línea error: pathspec es inofensiva: el git checkout no conoce el archivo nuevo y el git clean justo después lo elimina.
El loop-longrun.sh (kit execucao-longa, 18/10/2026) decide "terminado" por el código de salida del TESTE_FINAL. pytest sale con 0 cuando todos los tests se saltan, y el conftest.py en la raíz no estaba en PROTEGIDOS. Dos cerrojos lo resuelven: proteger *conftest.py (y la config de pytest que tenga el proyecto) y usar un TESTE_FINAL que exija el mínimo de passed sin saltados, como el guarda-testes.py conferir.
04 · Práctica
Ensayo de la guardia, el agujero del loop y la guardia en tu proyecto.
E7 · Tres agentes contra la guardia
10 min
Ejecuta el bucle apaga, conftest, bom.
Listo cuando: apaga y conftest terminan en GUARDA: REPROVADO con saída: 1 (conftest con la línea NOVO conftest.py); bom termina en GUARDA: OK con saída: 0.
E8 · Ver el agujero y cerrarlo
15 min
Ejecuta los dos bloques del loop headless. Necesitas el kit execucao-longa en ~/projetos/execucao-longa (curso 2).
Listo cuando: el primero imprime CONCLUÍDO no ciclo 1: teste final passou () y saída: 0; el segundo PARADO: 3 ciclos sem avanço mensurável, saída: 2, y el último comando imprime 3.
E9 · Guardia en tu proyecto
15 min
En un proyecto tuyo con pytest, congela en el commit base y verifica. Si el proyecto usa otro archivo de config de pytest, ponlo en PROTEGIDOS.
Listo cuando:python3 $K/guarda-testes.py congelar . imprime congelado: N arquivos protegidos, mínimo de M testes con M igual al total de tests, y python3 $K/guarda-testes.py conferir .; echo $? → GUARDA: OK y 0.
05 · Test de la clase
Pregunta 1 de 4
¿Por qué el manifiesto de la guardia queda en GUARDA_DIR, fuera del repo?competencia
Correcto
Un verificador al alcance del agente es un verificador que el agente puede ajustar. El manifiesto, los tests ocultos y goal.md quedan donde él no escribe.
No es esa
Un verificador al alcance del agente es un verificador que el agente puede ajustar. El manifiesto, los tests ocultos y goal.md quedan donde él no escribe.Repasar: Congelar antes, verificar después
Pregunta 2 de 4
El agente creó conftest.py en la raíz marcando todos los tests como skip. ¿Qué devuelve pytest?competencia
Correcto
Los tests omitidos no son fallas: pytest sale con 0. Por eso la guardia exige el mínimo de passed y reprueba cualquier skipped.
En loop-longrun.sh con PROTEGIDOS="tests/ pytest.ini", ¿qué le pasa al agente del conftest?
Correcto
El conftest.py de la raíz no está protegido y el TESTE_FINAL (pytest -q) sale con 0. Se corrige con *conftest.py en PROTEGIDOS y un test final que exija passed.
No es esa
El conftest.py de la raíz no está protegido y el TESTE_FINAL (pytest -q) sale con 0. Se corrige con *conftest.py en PROTEGIDOS y un test final que exija passed.Repasar: Ensayo: tres agentes contra la guardia
Pregunta 4 de 4
¿Cuándo congelar?
Correcto
Congelar después incorpora al manifiesto lo que el agente ya cambió. La foto tiene que ser del juez que tú aprobaste.