Lesson 09 · 協調

複数の agent がファイルメールボックスで通信する

subagent から teammate へ:使い捨て→持続、匿名→名前あり、通信なし→ファイルメールボックス。

⏱ 約 12 分 · 📝 3 つのインタラクティブ要素 · 🧑‍💻 出典 shareAI-lab · s09_agent_teams.py

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 ルーターで処理するだけだ。

Interactive

Widget 1 · Mail Flow · lead から alice へのメッセージの流れ

Send を押し、ファイルシステムの各ステップを追跡しよう:lead.send → alice.jsonl に append → alice が次のターンで inbox を読む → truncate。

Interactive

Widget 2 · Team Config · 誰がオンラインで状態は何か

.team/config.json はチームの花名簿だ。いくつかの操作(spawn / message / shutdown)を実行し、設定がどう変わるかを確認しよう。

操作
.team/config.json

        
Interactive

Widget 3 · Subagent vs Teammate · どちらを使うか決める

6つのタスクシナリオで、subagent(spawn-then-die)か teammate(spawn-then-live)かを選ぼう。そのタスクが「一度きり」かどうかを考えてほしい。

正解 0 / 6