3.5 KiB
SpawnPod: initial Run delivery confirmation
背景
SpawnPod は child Pod を起動し、初回 task を Method::Run として送る。しかし、実例として impl-llm-worker-stream-continuation を再作成した際、runtime registry / socket / process は生きている一方で、初回 task の session log が materialize されず、Pod は idle のままだった。
確認された状態:
/run/user/1000/insomnia/pods.jsonに live allocation がある/run/user/1000/insomnia/<pod>/status.jsonはstate: "idle"と runtimesegment_idを持つ/home/hare/.insomnia/sessions/pods/<pod>/metadata.jsonは pending segment のまま- 対応する session / segment
.jsonlが存在しない ReadPodOutputは no new assistant text
SpawnPod の送信側は send_run で Method::Run を write してすぐ切断し、TurnStart 等の ack を待っていない。一方 server 側は接続直後に Snapshot を書いてから method を読むため、client がすぐ close すると server が snapshot write で失敗し、method を読む前に connection handler が終了する race があり得る。
この場合 SpawnPod は成功を返すが、child Pod は初回 task を実行していない。
同種の問題は child Pod の通知経路でも既に踏んでおり、送信側が write 後にすぐ切断せず、receiver 側の acknowledgement / observable event を待つ形にして解消している。SpawnPod の初回 task delivery も同じ性質の race と見なす。
方針
SpawnPod は child process / socket の起動だけでなく、初回 task が controller に受理され、少なくとも UserMessage または TurnStart が観測できるまで確認してから成功を返す。
既存の SendToPod が使う send_run_and_confirm と同等の acknowledgement を SpawnPod の初回 task 送信にも適用する。
要件
SpawnPodの初回 task 送信は fire-and-forget にしない。Method::Run送信後、UserMessage/TurnStart/InvokeStartなど、run が受理されたことを示す event を待つ。- timeout 時は
SpawnPodを失敗扱いにする。
- 初回 task delivery に失敗した場合、process / registry / delegated scope の扱いを明確にする。
- cleanup するか、attach 可能な idle Pod として残すかを実装で決める。
- 少なくとも成功扱いで返さない。
- Server が connection 開始時に
Snapshotを書く設計と競合しない。- client 側が snapshot/event を読みながら
Method::Runack を待つ形にする。
- client 側が snapshot/event を読みながら
SpawnPod成功後は、child Pod の metadata が pending でも、初回 run が開始済みであることを確認できる。- session log materialization のタイミングそのものは別設計でもよい。
SendToPodとSpawnPodの run delivery confirmation ロジックを可能な範囲で共通化する。
完了条件
SpawnPodが初回 task の受理確認を待つ。- 初回 task が実行されない race を再現する test または regression test がある。
SpawnPodが success を返した後、child Pod が idle pending のまま task 未実行になる状態が起きない。- delivery timeout / failure 時の error message が人間に分かる。
cargo fmt --checkと関連 crate の test が通る。
範囲外
tui -rpicker に live pending Pod を表示する修正。- session log の SegmentStart materialization 方針変更。
- spawned child Pod panel UI。