Múltiplos agents se comunicam por caixas de e-mail em arquivo
De subagent a teammate: descartável → persistente; anônimo → com nome; sem comunicação → caixas de e-mail em arquivo.
Qual a diferença entre subagent e teammate?
O subagent do S04 é simples e descartável: spawn → executa → retorna summary → morre. É temporário, sem nome, e não há comunicação bidirecional entre pai e filho.
O teammate do s09 é um agent independente com nome, que pode ser ativado repetidamente e trocar mensagens:
subagent (s04): spawn -> execute -> return -> destroyed
teammate (s09): spawn -> work -> idle -> work -> ... -> shutdown
Os dois mecanismos têm propósitos diferentes:
- subagent é para "fazer uma exploração específica" (por exemplo, revisar um PR).
- teammate é para "manter um papel de forma contínua" (por exemplo, um reviewer permanente, ativado a cada novo commit).
A caixa de entrada é um arquivo JSONL
Como os membros da equipe se comunicam? O s09 usa o mecanismo mais simples possível: arquivo JSONL append-only.
.team/ config.json # lista dos membros da equipe inbox/ alice.jsonl # toda mensagem para alice vai aqui com append bob.jsonl lead.jsonl
Enviar é open("alice.jsonl", "a").write(msg); ler é ler o arquivo inteiro, parsear JSONL e depois truncate para limpar (semântica de drain).
Por que arquivos, não fila em memória? Arquivos são naturalmente persistentes. Reiniciou o agent, o processo crashou, até a máquina reiniciou — as mensagens ainda estão lá. E são legíveis e pesquisáveis com grep, o que torna a depuração muito mais fácil.
Fluxo completo de uma mensagem do lead para alice
O widget abaixo deixa você enviar uma mensagem para alice e acompanhar cada passo no sistema de arquivos.
5 tipos de mensagem
O s09 define 5 tipos de mensagem (VALID_MSG_TYPES), mas implementa apenas os dois primeiros — os três restantes são concluídos na lição s10 sobre protocolos:
message— mensagem de texto simples.broadcast— envia para todos os teammates exceto o remetente.shutdown_request/shutdown_response— solicitar/responder um shutdown gracioso (s10).plan_approval_response— aprovação de plano (s10).
Por que declarar sem implementar? Porque o s09 quer deixar a "extensão de protocolo" aberta — o tipo de mensagem é um enum, e adicionar um novo tipo exige apenas inserir uma entrada no dicionário e tratar no roteamento do _exec.