# テスト妥当性レビュー: tui

- 評価: 混在

## 確認範囲

- 対象 crate: `crates/tui`
- 確認した主な範囲:
  - `crates/tui/Cargo.toml`
  - `crates/tui/README.md`
  - `crates/tui/src/lib.rs`
  - 既存 unit tests を持つ主要 module:
    - `app.rs`
    - `input.rs`
    - `multi_pod.rs`
    - `single_pod.rs`
    - `workspace_panel.rs`
    - `pod_list.rs`
    - `task.rs`
    - `command.rs`
    - `markdown.rs`
    - `ui.rs`
    - `spawn.rs`
    - `setup_model.rs`
    - `composer_history.rs`
    - `composer_keys.rs`
    - `role_session_registry.rs`
    - `picker.rs`
    - `keys.rs`
- crate の責務として確認した内容:
  - `ratatui` / `crossterm` ベースの TUI 表示・入力処理
  - single-pod chat UI、multi-pod / workspace panel、pod picker、spawn/setup/key management UI
  - composer/input model、Markdown/tool/task/system event rendering
  - Pod list / Ticket panel / local role-session claim などの表示用 view model glue

## 現在のテストがよくカバーしていること

- Unit test の量は多く、`cargo test -p tui` 実行時に 299 tests が列挙される。TUI crate としては model-level の回帰テストがかなり厚い。
- `app.rs` / `input.rs` は重要な composer invariants をよく押さえている。
  - running 中の submit queueing
  - rollback 時の入力復元
  - input history persistence
  - file / knowledge completion
  - typed `Segment` の保持
  - context usage 表示
  - live system item / task snapshot の反映
- `multi_pod.rs` / `workspace_panel.rs` は dogfooding 上重要な panel semantics を広く検証している。
  - Ticket row ordering / state display
  - ready ticket queue action
  - done ticket close action
  - Review action が黙って approve しないこと
  - Companion / Orchestrator lifecycle decision
  - composer が selected pod ではなく workspace companion に向くこと
  - local role-session claim の扱い
- `pod_list.rs` は live/stored pod の分類・sort・socket reachability・corrupt metadata diagnostic を押さえており、TUI が誤って restore/send 可能扱いしないための invariant として有用。
- `task.rs` には `snapshot_format_contract` があり、Pod 側 snapshot 形式と TUI 側 deserialization の境界を守るテストとして妥当。
- `command.rs` / `single_pod.rs` は `:compact` / `:rewind` / `:peer` などの command が通常 user message として送られないこと、local diagnostic になることを確認していて良い。
- `markdown.rs` は Markdown renderer の基本構文、list、code block、table を文字列化して確認しており、LLM 出力表示の最低限の regressions には効く。
- `composer_history.rs` / `role_session_registry.rs` は workspace-scoped path、duplicate suppression、claim conflict など、永続化先を誤らないための安全側テストがある。

## 不足 / 疑問のあるテスト

- 現在の test suite は red。`cargo test -p tui` は 296 passed / 3 failed。
  - `multi_pod::tests::orchestrator_launch_context_uses_orchestration_root_for_runtime_workspace`
    - 失敗内容: expected `"/repo/yoi/.worktree/orchestration/yoi-orchestrator"` but actual `"/repo/yoi"`
    - 現在の設計では dedicated Orchestrator が process cwd と runtime workspace を分ける可能性があり、この test 名・期待値は仕様の変化に追随していない疑いが強い。
  - `spawn::tests::profile_choices_use_project_registry_default`
  - `spawn::tests::profile_choices_include_builtin_and_project_default_marker`
    - 失敗内容: selected index expected `1`, actual `6`
    - builtin profiles の数・順序に依存した brittle な assertion になっている。profile selector / default marker / selected profile identity を見るべきで、index 固定は妥当性が低い。
- UI renderer の実画面に対する coverage は限定的。
  - `ui.rs`, `multi_pod.rs`, `tool.rs` には多数の render helper があるが、terminal buffer snapshot 的な検証は少ない。
  - 文字列 helper の unit test はある一方、layout collapse、small terminal width/height、wide Unicode、style priority、scroll offset と描画結果の統合的な確認は薄い。
- `tool.rs` の test が見当たらないのは大きな穴。
  - Read/Write/Edit/Search/Bash などの tool call rendering は日常的に目に入る UI であり、diff wrapping、capped output、error suffix、aggregate Read rendering などの regression が入りやすい。
- 実 terminal / event loop / crossterm raw mode まわりはほぼ unit-test 対象外。
  - project instruction 上 E2E は未設計なのでやむを得ないが、`run_loop`, polling, resize, alternate screen cleanup, Ctrl-C/quit guard の実端末統合は unit tests だけでは保証できない。
- async / process interaction は一部 mock・TempDir・git repo でよく検証されているが、実 Pod process / socket / session log replay との E2E はない。
  - 特に Panel から child Pod launch、attach、completion notification、reload の end-to-end 整合は crate 単体の test だけでは判断できない。
- 一部の panel/render tests は text alignment や label の exact string に寄っており、仕様化された文言なら有用だが、見た目調整で壊れやすい。重要 invariant と cosmetic expectation を分けると保守性が上がる。

## 追加を提案するテスト

- まず red tests を仕様に合わせて直す。
  - Orchestrator launch context は `workspace_root`, `role_workspace_root`, `original_workspace_root`, `implementation_worktree_root`, `merge_target_workspace_root`, process cwd のどれを守る test なのかを明確にして、名前と assertion を更新する。
  - Profile choice tests は index ではなく、selected choice の `selector` / `source` / `is_default` 相当の意味で assert する。
- `tool.rs` に focused unit tests を追加する。
  - Edit diff の old/new wrapping
  - multiline result の cap
  - failed tool call の error line
  - Bash output truncation metadata
  - Read aggregate rendering
  - narrow width と wide Unicode
- `ratatui::backend::TestBackend` を使った small snapshot tests を少数追加する。
  - single-pod main screen の最小 smoke
  - multi-pod panel の ticket row + companion composer
  - task side pane / mini view
  - very small terminal size で panic しないこと
- scroll / viewport invariant の test を増やす。
  - history scroll と rewind picker scroll が干渉しないことは既にあるが、tool blocks、Markdown long output、task pane open/close、terminal resize 時の offset clamp も対象にする。
- 実 Pod process まで含む E2E が未設計なら、まずは crate 境界で replay-based tests を足すと効果が高い。
  - saved JSONL fragments / protocol events を `App` に流して expected blocks/actionbar/task state を確認する。
  - 実 socket は使わず、TUI state transition の regression を固定する。

## 実行したコマンド

```text
cargo test -p tui
```

結果:

```text
running 299 tests
test result: FAILED. 296 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.21s
```

失敗:

```text
multi_pod::tests::orchestrator_launch_context_uses_orchestration_root_for_runtime_workspace
spawn::tests::profile_choices_include_builtin_and_project_default_marker
spawn::tests::profile_choices_use_project_registry_default
```

```text
cargo test -p tui -- --list
```

crate の unit test inventory を確認するために使用した。

