E16 · Calibrar el juez falso
10 minEjecuta el ensayo con el juez falso.
Listo cuando: la última línea antes del código es JUIZ DESCALIBRADO em R1, R2: não use para aprovar y saída: 1.
Lección 6 · 22 min
No todo se convierte en test: "¿el mensaje explica el porqué?" pide lectura. Un modelo puede juzgar eso, siempre que la rúbrica sea sí/no, el juicio se repita y el juez haya sido comparado con etiquetas tuyas antes de valer. En esta clase calibras un juez falso (que falla), después uno real, y ves cómo la calibración encuentra una rúbrica ambigua.
Comenzar la clase
Objetivo: escribir una rúbrica sí/no, ejecutar un juez con repeticiones y usarlo solo después de calibrado contra etiquetas humanas.
Haz clic en cada etapa.
Sesgos conocidos del juez por modelo: prefiere la respuesta más larga, la posición de una de las opciones en una comparación y el estilo del propio modelo.
Mensajes de commit escritos por un agente. 10 mensajes en kit/juiz/artefatos.jsonl, con las etiquetas de una persona en humano.csv.
# Rúbrica — mensaje de commit escrito por el agente Criterios sim/nao. Nunca nota de 1 a 10. (invariável) = un "nao" reprueba el mensaje, independientemente del resto. Lo que se puede comprobar por código (tamaño de la 1ª línea, formato) NO entra aquí: va a un test. R1 | ¿El mensaje dice POR QUÉ se hizo el cambio, no solo qué cambió? | qualidade R2 | ¿Todo CAMBIO que cita el mensaje está en el diff (no inventa archivo, test ni efecto)? El motivo puede venir de fuera del diff. | invariável R3 | ¿Quien no vio el diff entiende qué cambió solo por el mensaje? | qualidade
J=~/projetos/loop-r-eng-verificacao-v72/kit/juiz python3 $J/juiz.py --rep 3 --saida /tmp/juiz-falso.csv python3 $J/calibrar.py $J/humano.csv /tmp/juiz-falso.csv; echo "saída: $?"
a01 R1=sim R2=sim R3=sim a02 R1=nao R2=sim R3=nao a03 R1=sim R2=sim R3=sim (… a04 a a10 …) → /tmp/juiz-falso.csv 10 artefatos rotulados pelos dois R1 concordância 80% kappa 0.55 REESCREVA ou troque o juiz (discorda em a03 a09) R2 concordância 70% kappa 0.00 REESCREVA ou troque o juiz (discorda em a03 a05 a09) R3 concordância 100% kappa 1.00 ok JUIZ DESCALIBRADO em R1, R2: não use para aprovar saída: 1
El juez falso dice "sí" en R2 para todo: nunca revisa el diff. La calibración lo detectó. Fíjate en R1: 80% de concordancia parece aprobar, pero el kappa (0,55) muestra que buena parte es azar.
Si casi todo es "sí", un juez que responde "sí" siempre ya coincide mucho contigo. El kappa de Cohen descuenta esa concordancia esperada por azar: 1 es perfecto, 0 es igual a adivinar. FEC pide 0,6 con 30 muestras etiquetadas; LOOP-R pide 80% de concordancia. calibrar.py exige los dos.
Consume la cuota de tu suscripción: 30 llamadas (10 mensajes × 3). El 19/10/2026 esto se ejecutó dos veces; la primera mostró un defecto de la rúbrica, no del juez.
JUIZ_CMD='claude -p --tools ""' python3 $J/juiz.py --rep 3 --saida /tmp/juiz-real.csv python3 $J/calibrar.py $J/humano.csv /tmp/juiz-real.csv; echo "saída: $?"
a01 R1=sim R2=sim R3=sim a02 R1=nao R2=sim R3=nao a03 R1=nao R2=nao R3=sim instável: R1 2×1, R3 2×1 REPROVA (R2 invariável) a04 R1=sim R2=sim R3=sim a05 R1=sim R2=sim R3=sim (… a06 a a08 …) a09 R1=nao R2=nao R3=sim instável: R1 2×1 REPROVA (R2 invariável) a10 R1=sim R2=sim R3=sim → /tmp/juiz-real.csv 10 artefatos rotulados pelos dois R1 concordância 100% kappa 1.00 ok R2 concordância 90% kappa 0.74 ok (discorda em a05) R3 concordância 100% kappa 1.00 ok JUIZ CALIBRADO saída: 0
Claude Code 2.1.303, modelo predeterminado de la suscripción, 3 min 12 s. La divergencia que quedó: a05 dice que aumentar la sesión "melhora a segurança"; la persona lo marcó como efecto inventado, el juez lo aceptó.
En la primera ronda real, R2 decía "Tudo o que a mensagem afirma aparece no diff (nada inventado)?". El juez reprobó mensajes buenos, porque el MOTIVO de un cambio nunca está en el diff:
a01 R1=sim R2=nao R3=sim REPROVA (R2 invariável) a04 R1=sim R2=nao R3=sim REPROVA (R2 invariável)
El juez tenía razón según la letra; la rúbrica era la ambigua. El criterio se reescribió ("toda MUDANÇA citada está no diff; o motivo pode vir de fora") y la segunda ronda calibró. Para eso sirve la calibración: encontrar el criterio malo antes de que decida algo.
En la misma primera ronda, la suscripción alcanzó el límite de sesión a partir del 6.º artefacto. La versión antigua de juiz.py contó la respuesta ausente como "nao" y reprobó todo. La versión actual lo separa: imprime SEM RESPOSTA do juiz, deja el artefacto fuera del CSV y termina con JUIZ FALHOU em N chamada(s) y un código distinto de 0. Un juez que no respondió no reprobó ni aprobó.
Juez falso, juez real y la rúbrica de tu caso.
Ejecuta el ensayo con el juez falso.
Listo cuando: la última línea antes del código es JUIZ DESCALIBRADO em R1, R2: não use para aprovar y saída: 1.
Ejecuta el bloque real con claude -p o codex exec en solo lectura.
Listo cuando: calibrar.py imprime una línea para cada uno de R1, R2 y R3 y termina en JUIZ CALIBRADO (código 0) o JUIZ DESCALIBRADO (código 1). Si se descalibró, di qué criterio reescribirías.
Elige un artefacto subjetivo de tu agente (resumen, respuesta, mensaje). Escribe 3 criterios sí/no, uno invariable, y etiqueta tú mismo 10 artefactos en humano.csv. Ejecuta el juez real y calibra.
Listo cuando: python3 $J/calibrar.py humano.csv /tmp/juiz.csv → primera línea 10 artefatos rotulados pelos dois; cada criterio con ok o reescrito hasta quedar ok.
Pregunta 1 de 4
¿Por qué la rúbrica es sí/no y no una nota de 1 a 10?competencia
Pregunta 2 de 4
R1 tuvo 80% de concordancia y kappa 0,55. ¿Sirve el juez para R1?competencia
Pregunta 3 de 4
En la 1.ª ronda real, el juez reprobó mensajes buenos en R2. ¿Qué estaba mal?
Pregunta 4 de 4
El juez no respondió (límite de la suscripción). ¿Cómo contarlo?
Elige una alternativa. La explicación aparece después de tu intento.