yoi/tickets/protocol-tool-result-shape.md

47 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# protocol: ToolResult に summary を分離する
## 背景
`protocol::Event::ToolResult` は現状 `{ id, output: String, is_error: bool }` で、ツール実装側の `llm_worker::tool::ToolOutput` が持っている **`summary: String`** を flatten して捨てている。
各 builtin tool は既に意味のある summary を返している:
- Write (`crates/tools/src/write.rs`): `Created /path (N bytes)` / `Overwrote /path (N bytes)`
- Read / Edit / Glob / Grep も同様に構造化された要約を返している
TUI 側で「俯瞰ビュー」の 1 行サマリや status line の短縮表示に使いたいが、protocol に summary が無いため直接は取れない。`output` の先頭行を切るようなヒューリスティックは脆く、各ツールが意図した要約と一致しない。
本チケットは protocol 層の小さな拡張に閉じる。TUI 側での利用は後続のオーバーホールチケットで行う。
## 要件
- `Event::ToolResult``summary: String` を追加する
- `output``is_error` は残す(用途が異なる: summary は 1 行、output は詳細本文)
- ツール実装から流れてくる `ToolOutput.summary` がそのまま protocol に乗るように worker / pod 層を通す
- `Event::History` の replay 経路でも summary が欠落しないこと(セッション再接続時に TUI が過去の ToolResult 表示を組み直せるため)
## 完了条件
- `Event::ToolResult``summary: String` が存在し、worker 側から流れてくる
- 各 builtin tool (Read / Write / Edit / Glob / Grep) の `ToolOutput.summary` が TUI まで届く
- `Event::History` replay でも summary が取得できる
- 既存 TUI は summary を無視するだけで従前通り動くUI 側での利用は別チケット)
## 範囲外
- `ToolOutput.content` の protocol 化。現時点では不要。必要になったら別チケット
- summary 文言の規格化や整形。各ツール側の責務
- TUI の summary 利用 (`tickets/tui-fullscreen-overhaul.md` で扱う)
## Review
- 状態: Request changes
- レビュー詳細: [./protocol-tool-result-shape.review.md](./protocol-tool-result-shape.review.md)
- 日付: 2026-04-21
### 指摘反映 (2026-04-21)
- **Blocking**: `Event::ToolResult` の詳細本文フィールドをチケット本文どおり `output` 名で保持する形に修正。Option 化だけは残し `output: Option<String>` に落ち着けた(空文字列を wire に乗せない / worker の `ToolOutput { summary, content }` と意味論的に整合)。`content` という名前および意味(`ToolOutput.content` の protocol 化)は取り込まない、という範囲外条項は遵守している。
- **Non-blocking**: `on_tool_result` の error-path カバレッジを `callback_test.rs::test_callback_tool_result_error_path` として追加。`ToolResult::error` 経由で `summary=エラーメッセージ / content=None / is_error=true` が emit されることを確認。
- 再レビュー可。