Múltiples agents comunicándose por buzones de archivo
De subagent a teammate: puntual → persistente; sin nombre → con nombre; sin comunicación → buzón de archivo.
¿En qué se diferencia un subagent de un teammate?
El subagent de s04 es directo y descartable: spawn → ejecuta → devuelve summary → muere. Es de un solo uso, sin nombre, sin comunicación bidireccional entre padre e hijo.
El teammate de s09 es un agent independiente con nombre, que puede activarse repetidamente y enviar y recibir mensajes:
subagent (s04): spawn -> execute -> return -> destroyed
teammate (s09): spawn -> work -> idle -> work -> ... -> shutdown
Los dos tienen usos diferentes:
- El subagent es ideal para «explorar algo concreto» (por ejemplo, hacer un review de un PR).
- El teammate es ideal para «desempeñar un rol de forma continuada» (por ejemplo, un reviewer permanente que se activa con cada nuevo commit).
El buzón es un archivo JSONL
¿Cómo se comunican los miembros del equipo? s09 usa el mecanismo más sencillo posible: archivos JSONL append-only.
.team/ config.json # lista de miembros del equipo inbox/ alice.jsonl # todos los mensajes para alice van aquí (append) bob.jsonl lead.jsonl
Enviar es un open("alice.jsonl", "a").write(msg); leer es leer el archivo completo, parsear el JSONL y luego truncate para vaciarlo (semántica de drain).
¿Por qué archivos y no una queue en memoria? Los archivos son persistentes por naturaleza. Reinicio del agent, caída del proceso, incluso reinicio de la máquina — los mensajes siguen ahí. Además son legibles con grep, lo que hace el debugging mucho más cómodo.
Traza completa de un mensaje de lead a alice
El siguiente widget te permite enviar un mensaje a alice y ver cada paso que ocurre en el sistema de archivos.
5 tipos de mensajes
s09 define 5 tipos de mensajes (VALID_MSG_TYPES), aunque solo implementa los dos primeros — los tres restantes se añaden en la lección de protocolos s10:
message— mensaje de texto normal.broadcast— envía a todos los teammates excepto al emisor.shutdown_request/shutdown_response— solicitud/respuesta de apagado elegante (s10).plan_approval_response— aprobación de plan (s10).
¿Por qué declarar tipos sin implementarlos? s09 quiere que el «protocolo» sea extensible — los tipos de mensaje son un enum, añadir uno nuevo solo requiere una entrada en el diccionario y un case en el router _exec.