BlogAgentes de IA

Un cartel por agente

Cuatro fallas del interruptor compartido terminaron en permisos temporales por agente

Nicolás Biondi

Puerta en penumbra con un colgante en blanco en la manija y tres duplicados luminosos que se desvanecen al lado.

Diez mensajes de WhatsApp salieron al grupo interno en dos minutos, todos avisando de reparaciones entregadas hacía semanas. El sistema no olvida nada, y elige el peor momento para acordarse. Era la cuarta vez.

No había un bug nuevo: la regla de siempre, "apaga las notificaciones antes de probar y déjalas en normal cuando termines", se rompe sola en cuanto hay dos agentes trabajando a la vez.

Las pruebas corren contra órdenes de clientes reales

El módulo post-venta de LENZ Service corre contra la base de producción, con órdenes de clientes reales, sin copia de juguete. Cuando un agente de IA entra al navegador a verificar un cambio de estado, el sistema hace lo de siempre y dispara el WhatsApp, el correo y el push al celular del cliente. Para eso existía el interruptor de silencio: sin él, una prueba descuidada termina en una llamada incómoda al día siguiente.

Con un solo agente el interruptor funciona, y yo casi nunca trabajo con un solo agente.

El cartel que cualquiera descuelga

El modo de notificaciones era un campo con dos valores: normal o apagado. El agente A lo apaga y arranca sus pruebas. El agente B, en otra rama, lo apaga también, termina quince minutos antes y lo devuelve a normal, tal como pide la instrucción. A sigue corriendo y el sistema no tiene cómo saberlo.

Culpé primero a los agentes, seguro de que alguno había ignorado la regla. La seguían al pie de la letra, los cuatro. El campo no guardaba quién pidió el silencio ni hasta cuándo, así que "restaurar" significaba "apagar el silencio de todos", incluido el de quien seguía adentro. Era el cartel de "no molestar" de una sala de reuniones: había uno solo, y el último que salía lo descolgaba aunque quedara gente trabajando adentro.

Meme Batman Slapping Robin: Los agentes ignoraron la instrucción / La seguían al pie de la letra Los agentes ignoraron la instrucción La seguían al pie de la letra

A apaga notificaciones

A corre pruebas

B apaga notificaciones

B termina y restaura

Modo normal, A sigue

Mensajes reales al grupo

El agente B restaura el valor compartido mientras A sigue probando

Cada agente cuelga su propio cartel

Cambiamos el valor único por una tabla de permisos temporales. Cada agente toma su fila con su nombre, el motivo y una hora de vencimiento: 180 minutos por defecto, techo duro de 12 horas. Libera solo la suya y no puede tocar la de otro.

Una sola función responde cuál es el modo actual, y la usan los tres canales. Si hay al menos un permiso vigente, devuelve apagado; si no queda ninguno, lee la configuración del equipo. Durante las pruebas ya no tocamos esa configuración, así que desapareció el paso de restaurar, que era justo el que fallaba.

El vencimiento cubre al agente que se cuelga a mitad de camino: un permiso huérfano sin caducidad silenciaría a clientes reales para siempre. La lectura también falla cerrada, y si la consulta a la tabla da error la función devuelve apagado. Prefiero que un cliente espere su aviso de "equipo listo" antes que otra tanda de avisos de prueba salga al grupo, o peor, a un cliente.

La base de pruebas que no montamos

Podíamos armar un turno, una cola o un párrafo más severo en la política del repo, pero con instrucciones ya habíamos perdido cuatro veces.

Tampoco levantamos una base de pruebas aparte, que es la solución de manual. Duplicar producción con sus nueve servicios, cada uno con su propia base de datos y sus cron jobs (tareas que corren solas a una hora fija), es un proyecto de semanas. El riesgo que teníamos encima se arreglaba con una tabla.

El header de admin dice quién puso el cartel

Desde el cambio no volvió a salir un mensaje de prueba al grupo interno. El header de administración muestra en vivo quién tiene un permiso y por qué, así que cuando una notificación no llega miro esa pantalla en lugar de preguntar en el chat. La suite de pruebas toma su propio permiso al arrancar y lo libera al final, y la política del repo exige tomar uno antes de cualquier verificación en navegador que pueda escribir.

Queda abierto el techo de 12 horas, que es mucho silencio para un olvido, y nadie avisa todavía cuando un permiso está por vencer con pruebas corriendo. Lo dejamos así porque el caso malo pasó de silencio eterno a silencio de medio día, y medio día lo notamos.

El permiso lo toma cada agente para sí y nadie puede liberar el del otro. El silencio se levanta cuando cae el último cartel, y las reparaciones de hace semanas ya no tienen nada que anunciar.

postmortem notifications concurrency workflow