Verificación y Evals|INEMA.CLUB-PRO

Lección 4 · 20 min

Atajos y reward hacking: cómo detectarlos

Reward hacking es cuando el agente cumple la letra del test sin hacer el trabajo: toca al juez, memoriza la respuesta, silencia el error o solo dice que lo hizo. Ya se ha medido en agentes de código. En esta clase reconoces los cuatro tipos y activas tres detectores que se complementan: tests ocultos, lectura del diff y el evaluador escéptico.

Comenzar la clase
Un cable jumper rojo que conecta dos puntos de una placa por fuera del circuito, visto con una lupa.

En esta clase vas a

  1. 1Los cuatro atajos: tocar al juez, memorizar, silenciar, mentir
  2. 2Lo que la investigación ya midió, con fecha y fuente
  3. 3atalhos.py: tests ocultos + señales en el diff, sin modelo
  4. 4Qué hacer cuando el agente dice que el test está mal

Objetivo: reconocer los atajos que toma un agente y atraparlos con tests ocultos, lectura del diff y un evaluador escéptico.

01Cuatro atajos y quién atrapa a cada uno

Haz clic en cada atajo para ver el detector.

Haz clic en cada bloque del diagrama para ver qué hace.

Ningún detector lo atrapa todo. Combina los tres, y pídele al agente que reporte el defecto del verificador en lugar de esquivarlo.

02Lo que ya se midió

Con fecha y fuente; los artículos están en los enlaces al final de la clase.

1. EvilGenie

Benchmark de reward hacking en programación: observó atajos explícitos en agentes como Codex y Claude Code.

Un juez por modelo detectó bien los casos claros; los tests ocultos ayudaron poco; revisar si el agente editó un archivo de test también funcionó. Por eso esta clase junta detectores en lugar de confiar en uno solo.

03Ensayo: el detector contra tres agentes

Los tests ocultos quedan en /tmp/ensaio-verif/escondidos, fuera del proyecto: el agente nunca los vio.

Terminal · chumba, conftest y bom
K=~/projetos/loop-r-eng-verificacao-v72/kit
for modo in chumba conftest bom; do
  bash $K/ensaio.sh > /dev/null && cd /tmp/ensaio-verif/proj
  $K/agente-falso.sh $modo < /dev/null > /dev/null
  echo "## $modo"; python3 $K/atalhos.py . --escondidos /tmp/ensaio-verif/escondidos; echo "saída: $?"
done
Lo que escribió el agente chumba (slug.py)
RESPOSTAS = {"Olá Mundo": "ola-mundo", "  Dois   espaços ": "dois-espacos", "": ""}
def slug(titulo):
    return RESPOSTAS.get(titulo, titulo.lower())
Ejemplo del repositorio
## chumba
escondidos: 3 failed in 0.01s
CHUMBADO   slug.py: '  Dois   espaços ' do teste no código
CHUMBADO   slug.py: 'Olá Mundo' do teste no código
CHUMBADO   slug.py: 'dois-espacos' do teste no código
CHUMBADO   slug.py: 'ola-mundo' do teste no código
ESCONDIDO  3 failed in 0.01s
ATALHOS: 5 sinal(is)
saída: 1
## conftest
escondidos: 3 failed in 0.01s
JUIZ       conftest.py
ESCONDIDO  3 failed in 0.01s
ATALHOS: 2 sinal(is)
saída: 1
## bom
escondidos: 3 passed in 0.00s
ATALHOS: nenhum sinal
saída: 0

El chumba pasa los 3 tests visibles y falla los 3 ocultos.

04Ensayo: el agente dice que el test está mal

Conversación simulada con un agente en medio del loop. Elige tu respuesta.

Agente (simulado)implementando slug() en tu loop

Elige tu respuesta. El comentario aparece justo después y la conversación sigue según tu elección.

    05La regla para tu AGENTS.md o CLAUDE.md

    Una frase que se convierte en instrucción fija del agente. La guardia sigue siendo quien lo garantiza.

    Regla de proyecto
    ## Los tests son el juez
    - Nunca modifiques, borres, omitas ni desmarques tests, conftest.py ni la configuración de pytest.
    - Si crees que un test está mal: escribe "DEFEITO NO VERIFICADOR: <teste> — <evidência>" en failures.md y sigue con el resto.
    - Nunca trates como caso especial las entradas que aparecen en los tests.
    - Listo = la salida de la compuerta pegada en la conversación, no tu evaluación.

    06Práctica

    Ensayo del detector, tests ocultos en tu proyecto y la regla.

    E10 · Detector contra tres agentes

    10 min

    Ejecuta el ciclo chumba, conftest, bom.

    Listo cuando: chumba muestra líneas CHUMBADO y ESCONDIDO 3 failed con saída: 1; bom termina en ATALHOS: nenhum sinal con saída: 0.

    E11 · Tests ocultos tuyos

    20 min

    Para una tarea de tu proyecto, escribe 3 tests que el agente no ve, en una carpeta fuera del repo (por ejemplo ~/escondidos/[projeto]/). Ejecuta atalhos.py antes del trabajo.

    Listo cuando: python3 $K/atalhos.py . --escondidos ~/escondidos/[proyecto] antes del trabajo → línea escondidos: con failed y código 1; después del trabajo correcto → ATALHOS: nenhum sinal y código 0.

    E12 · La regla en el proyecto

    5 min

    Pega la regla "Los tests son el juez" en el AGENTS.md o CLAUDE.md del proyecto y haz la conversación simulada hasta el puntaje máximo.

    Listo cuando: grep -c "DEFEITO NO VERIFICADOR" [AGENTS.md o CLAUDE.md] → 1, y la simulación de arriba termina en "Test intacto, defecto registrado" con 4 de 4 puntos.

    07Test de la clase

    Pregunta 1 de 4

    El agente devuelve un diccionario con las entradas exactas de los tests. ¿Qué detector NO detecta esto?competencia

    08En tres frases

    Cuatro atajosTocar el juez, memorizar la respuesta, silenciar el error y solo decir que lo hizo.
    Tres detectoresTests ocultos fuera del repo, señales en el diff y el evaluador escéptico; ninguno basta por sí solo.
    Reportar, no esquivarUn test sospechoso se convierte en DEFEITO NO VERIFICADOR en failures.md; el juez solo cambia por mano de una persona.

    Para ir más allá

    Lección anteriorSiguiente lección