Verificación y Evals|INEMA.CLUB-PRO

Lección 3 · 20 min

Tests congelados y guardia de diff en los tests

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.

Comenzar la clase
Placas de referencia selladas en bolsas antiestáticas y cajas de acrílico sobre un estante de acero.

En esta clase vas a

  1. 1Qué es "el juez": los tests, conftest.py en cualquier nivel y la config de pytest
  2. 2Manifiesto con hash y mínimo de tests, guardado fuera del repo
  3. 3Las cinco reprobaciones: borrado, modificado, nuevo, pocos, omitido
  4. 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.

01Congelar antes, verificar después

Haz clic en cada etapa.

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.

02Ensayo: 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.

03El 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 · el agujero (PROTEGIDOS de ejemplo)
K=~/projetos/loop-r-eng-verificacao-v72/kit; L=~/projetos/execucao-longa/tools
bash $K/ensaio.sh > /dev/null && cd /tmp/ensaio-verif/proj
printf '#!/usr/bin/env bash\nexec %s/agente-falso.sh conftest\n' $K > /tmp/agente-conftest.sh
chmod +x /tmp/agente-conftest.sh
$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="python3 -m pytest -q"
PROTEGIDOS="tests/ pytest.ini"
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: $?"
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.

04Prá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.

05Test de la clase

Pregunta 1 de 4

¿Por qué el manifiesto de la guardia queda en GUARDA_DIR, fuera del repo?competencia

06En tres frases

El juez es más grande que tests/conftest.py en cualquier nivel y la config de pytest también deciden qué se ejecuta.
Foto fuera de su alcanceHash y mínimo de tests guardados antes del agente, en un lugar donde él no escribe.
Código 0 no bastaExige el mínimo de passed y ningún omitido; eso es lo que cierra el hueco del loop headless.

Para ir más allá

Lección anteriorSiguiente lección