複数の agent がファイルメールボックスで通信する
subagent から teammate へ:使い捨て→持続、匿名→名前あり、通信なし→ファイルメールボックス。
Subagent と Teammate の違い
S04 の subagent はシンプルだ:spawn → 実行 → summary を返す → 終了。使い捨て、名前なし、親子間に双方向通信なし。
s09 の teammate は名前があり・繰り返し呼び起こせる・メッセージを送受信できる独立した agent だ:
subagent (s04): spawn -> execute -> return -> destroyed
teammate (s09): spawn -> work -> idle -> work -> ... -> shutdown
2つの仕組みの用途は異なる:
- subagent は「具体的な探索を一件こなす」(例:PR を一つ review する)のに向く。
- teammate は「一つの役割を継続して担う」(例:長期的な reviewer として、新しいコミットのたびに呼び起こされる)のに向く。
メールボックスは JSONL ファイル
チームメンバー間の通信方法は?s09 が使う最もシンプルな仕組み:append-only の JSONL ファイルだ。
.team/ config.json # チームの花名簿 inbox/ alice.jsonl # alice 宛のメッセージはここに append bob.jsonl lead.jsonl
送信は open("alice.jsonl", "a").write(msg)、受信はファイル全体を読んで JSONL をパースし、truncate でクリアする(drain セマンティクス)。
なぜメモリキューではなくファイルを使うのか?ファイルは本質的に永続だ。agent が再起動しても・プロセスがクラッシュしても・マシンが再起動しても——メールは残っている。さらに読めて grep できるので、デバッグ体験が非常によい。
lead から alice へのメッセージの完全な流れ
以下の widget で alice にメッセージを送り、各ステップでディスクに何が起きるかを追跡しよう。
5種類のメッセージタイプ
s09 は5種類のメッセージタイプを定義している(VALID_MSG_TYPES)が、実装しているのは最初の2つで、残り3つは s10 プロトコルレッスンで追加される:
message— 通常のテキストメッセージ。broadcast— 自分以外の全 teammate に送信。shutdown_request/shutdown_response— グレースフルシャットダウンのリクエスト/レスポンス(s10)。plan_approval_response— 計画の承認(s10)。
なぜ宣言したが実装しないのか?s09 は「プロトコル拡張」をオープンエンドにしたい——メッセージタイプは enum であり、新しいものを追加するにはディクショナリに一行追加して _exec ルーターで処理するだけだ。