4.0 KiB
4.0 KiB
Pod 間コールバック通知
背景
spawned Pod がイベント(ターン完了、エラー、終了、scope 又貸し)を発生させたとき、spawner に自動通知する仕組みが必要。Method::Notify(実装済み)が受け口となり、spawned Pod がそこにコールバックを送る。
依存
tickets/spawn-pod-tool.md: spawn 記録と callback address の受け渡しMethod::Notify: 実装済み。コールバック受信 → LLM への system message 注入
仕組み
callback address
spawn 時に spawner が自身の callback address を spawned Pod に渡す:
- ローカル: spawner の unix socket path
- リモート:
insomnia@host:pod-name形式(将来。docs/network-peering.md参照)
spawned Pod はこの address を保持し、イベント発生時に一発接続して通知を送り、即切断する(webhook モデル)。
通知の種類
| 通知 | タイミング | 含まれるデータ |
|---|---|---|
| ターン完了 | spawned Pod の1ターンが終了 | name |
| エラー | spawned Pod でエラー発生 | name, error_message |
| 終了 | spawned Pod が停止 | name(scope 返却のトリガー) |
| scope 又貸し | spawned Pod が自身の scope を別 Pod に委譲 | name, sub_name, sub_pod_socket, delegated_scope |
通知は「シグナル」のみ
通知にはイベント種類と最小限のメタデータだけを含める。応答テキスト全体は含まない。spawner が内容を知りたければ ReadPodOutput で取りに行く。
spawner 側の処理
- callback を受信
pod.push_notification(source, formatted_message)でバッファに追加PodInterceptor::pre_llm_requestが次の LLM リクエスト時に context に注入- IDLE なら
Method::Notifyの IDLE パスで自動ターン起動
scope 又貸し通知の特殊性
spawned Pod (B) が孫 Pod (D) に scope を又貸しした場合:
- B は spawner (A) に通知: 「
/src/coreを D に委譲した。D の socket は ...」 - A は D の存在と address をこの通知で知る(= 親からの紹介)
- A の spawn 記録に D が追加される
- B が死亡しても A は D を直接把握しており、scope lock file の stale 回収で
delegated_fromが A に付け替わる
コールバック送信の実装箇所
spawned Pod 側に callback 送信の仕組みが必要:
- ターン完了: Controller の
RunEndイベント発行時に callback を fire - エラー: Controller の
Errorイベント発行時に callback を fire - 終了: Controller の shutdown シーケンス内で callback を fire
- scope 又貸し:
SpawnPodツールの実行後に callback を fire
ポーリングでの代替
コールバックが失敗しても、spawner は ListPods のポーリングで状態を拾える。コールバックは最適化であり、唯一の手段ではない。
設計で決めること
- callback の message format: JSON? protocol crate の型を再利用? 独自の軽量フォーマット?
- callback 送信の非同期性: ターン完了時に callback 送信を await するか、fire-and-forget で spawn するか
- callback 失敗時のリトライ: リトライするか、ログだけ出して諦めるか
- callback address の更新: spawner が再起動して socket path が変わった場合の再登録手順
完了条件
- spawned Pod のターン完了・エラー・終了時に spawner の callback address に通知が送信される
- scope 又貸し時に spawner に通知が送信され、spawner が孫 Pod の存在を把握する
- callback 受信が
Method::Notifyパイプラインに乗り、spawner の LLM に system message として伝わる - callback 送信が失敗しても spawned Pod は続行する
- 単体テストで各通知種別の送受信が検証される
範囲外
- リモートの callback(SSH 越し)。ローカル unix socket のみ
- callback の配信保証(at-least-once / exactly-once)。fire-and-forget で十分