# TUI: Pod を明示的に終了させる操作 ## 背景 現状、TUI から Pod を終了させる手段は Ctrl-C / プロセス終了に頼っている。これだと: - 実行中のターンが中断された状態で終わり、session-store の永続化が中途半端になる可能性 - 複数 Pod を並列で扱えるようになったとき(`tickets/tui-pod-spawn-ui.md`)、「今表示している Pod だけを畳む」操作と「TUI 全体を終わる」操作を区別する必要がある - ユーザーが「Pod の作業を完了としてクローズする」という意図を表現できない TUI から明示的に Pod の shutdown を指示できる操作を追加する。 ## 要件 ### 操作 - TUI 内のキーバインドで Pod の終了を開始できる。 - 破壊的な副作用(セッションは残るが実行中ターンは落ちる)を避けるため、**実行中のターンがあれば確認を挟む**。 - 確認なしで終了する強制モードを用意するかは設計時に判断。 ### Pod 側の shutdown 手順 - 実行中のターンがあれば、既存のキャンセル機構(`WorkerError::Cancelled`)で中断する。 - キャンセル完了を待ってから session-store にフラッシュし、Pod 状態を `Stopped` 相当に遷移させる。 - 中断時点までの turn は整合を保って永続化される(途中の partial turn は巻き戻される)。 ### TUI 側の挙動 - shutdown 完了後、TUI はその Pod の表示を閉じる。 - 他に Pod が無ければ TUI 自体も正常終了する(並列管理が無い現状ではこちらの挙動で良い)。 - shutdown 中は進行状況が画面上で分かる(「shutting down...」等の表示)。 ## 設計で決めること - **キーバインド**: `q` / `Ctrl-D` / `:quit` のどれを当てるか、強制モードのキーを別立てにするか - **実行中ターンがあるときの確認 UI**: モーダル / フッター問い合わせ / キー再押下 - **Pod 層 API**: 既存の cancel + persist を組合せた shutdown メソッドを Pod に生やすか、Controller 側で段取るか ## 完了条件 - TUI からキー操作で Pod を shutdown できる。 - 実行中のターンがあった場合は確認を経由し、キャンセル → 永続化 → 画面クローズの順で進む。 - shutdown 後に `test_pod.local.toml` の session を再開すると、中断されたターンの副作用が残っていない整合状態で開ける。 ## 範囲外 - 複数 Pod 並列管理下での「この Pod だけ閉じる」と「全部閉じる」の使い分け。並列管理自体が無いため、本チケットでは単一 Pod 前提とする。仕様は `tickets/tui-pod-spawn-ui.md` で改めて整理する。 - Pod の一時停止(resume 可能な pause)。本チケットは完全な shutdown のみ扱う。