yoi/docs/report/test-validity-20260612/tui.md

132 lines
7.5 KiB
Markdown

# テスト妥当性レビュー: 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 を確認するために使用した。