多個 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
兩個機制的用途不同:
- subagent 適合「做一件具體探索」(比如 review 一個 PR)。
- teammate 適合「持續承擔一個角色」(比如長期的 reviewer,每當有新 commit 就被叫醒)。
信箱是一個 JSONL 檔案
團隊成員之間怎麼通信?s09 用的是最土的機制:append-only JSONL 檔案。
.team/ config.json # 團隊花名冊 inbox/ alice.jsonl # 給 alice 的信都 append 到這裡 bob.jsonl lead.jsonl
send 就是 open("alice.jsonl", "a").write(msg);read 就是讀完整個檔案、parse JSONL、然後 truncate 清空(drain 語義)。
為什麼用檔案,不用記憶體佇列?檔案天然持久。agent 重啟、行程崩潰、甚至機器重啟——郵件都還在。加上它可讀可 grep,除錯體驗非常好。
看一條訊息從 lead 到 alice 的完整流程
下面 widget 讓你給 alice 發一條訊息,看每一步磁碟上發生了什麼。
5 種訊息類型
s09 定義了 5 種訊息類型(VALID_MSG_TYPES),但只實作了前兩個,後三個在 s10 協議課才補上:
message— 普通文字訊息。broadcast— 發給除自己外所有 teammate。shutdown_request/shutdown_response— 請求/回應優雅關機(s10)。plan_approval_response— 計畫審批(s10)。
為什麼宣告了但不實作?因為 s09 想把「協議擴充」做成開放式——訊息類型是枚舉,新加一個只需要在字典裡加一條、在 _exec 路由裡處理。