Evita que el agente cante victoria pronto
A los modelos se les entrena para sonar terminados y satisfechos. Gran instinto para un chatbot, pésimo para la ingeniería, donde «parece hecho» y «está hecho» son cosas muy distintas.
A ningún delantero se le permite concederse su propio gol, por seguro que esté de que entró. Decide un árbitro con una línea clara. La puerta de verificación es ese árbitro: el agente puede creer que terminó, pero un script de shell con un código de salida es quien lo canta.
Por qué el falso «hecho» es lo normal
Sonar terminado se premia; estar terminado no es directamente observable para el modelo. Así que el camino de menor resistencia es un resumen seguro, «he implementado la función y funciona», emitido antes de que el build esté en verde o se manejen los casos límite. No es mentir; es el modelo optimizando aquello para lo que fue entrenado. El harness tiene que aportar lo que no fue.
flowchart LR
A["El agente cree que termino"] --> Stop["Se detiene y espera"]
Stop --> V{"verify.sh"}
V -->|exit 0| Done["done"]
V -->|distinto de cero| Retry["Reinyecta el fallo"]
Retry --> V
Retry -->|tras max_retries| Blocked["blocked, no fingido"]
linkStyle 2 stroke:#2ea043,stroke-width:2.5px,color:#2ea043
linkStyle 3 stroke:#e0493f,stroke-width:2.5px,color:#e0493f
linkStyle 5 stroke:#e0493f,stroke-width:2.5px,color:#e0493f
Que decida la puerta, no el agente
Saca la decisión de «hecho» de las manos del agente y ponla en una puerta de verificación que no controla: la suite de tests, el verificador de tipos, la corrida de extremo a extremo. «Hecho» significa que la puerta está en verde, punto. Para un bucle autónomo, añade una promesa de finalización: una afirmación concreta que el bucle solo puede emitir cuando es inequívocamente cierta, junto a un tope estricto de iteraciones para que un bucle atascado pare en vez de cantar una falsa victoria para escapar.
«Todas las funciones pasan» es algo que el bucle solo puede decir cuando cada ítem comprobado está de verdad en verde, nunca para salir del bucle.
Cómo lo impone Agentum
Agentum nunca acepta la palabra del agente para la finalización. AGENTS.md le dice al agente que se detenga y espere cuando crea terminada la función; entonces el motor corre verify.sh (exit 0 = verde, distinto de cero = rojo). Una puerta roja bloquea el avance y reinyecta al agente la salida fallida (la cola de last_error), reintentando hasta pasar o llegar a max_retries, momento en que la corrida se detiene en blocked en vez de fingir éxito. Para trabajo de más riesgo, hitl_at_qa pausa en awaiting_confirm esperando un OK humano antes de done. El modelo nunca llega a declararlo terminado.
Puntos clave
- Los modelos están entrenados para sonar terminados, lo que hace del falso «hecho» lo normal.
- Decide la finalización con una puerta externa que el agente no controla.
- Usa una promesa de finalización más un tope de iteraciones para mantener honestos los bucles autónomos.
- Agentum sale del bucle solo con una puerta en verde, nunca por la palabra del agente.
Ejercicios
- Encuentra un falso done. Recuerda una vez que un agente dijo done sin estarlo. ¿Qué afirmación sin comprobar se coló?
- Añade una puerta. Escribe un comando cuyo código de salida lo habría atrapado.