2.2 KiB
2.2 KiB
prune-projection レビュー
要件の充足
チケットが定義した3つの設計方針は全て達成されている:
- 判定結果を index 集合として保持 —
prunable_indicesがそのまま該当 - PreLlmRequest hook でコンテキスト構築時に content を省く —
PruneHook::callでcontextに対してのみ書き換え - Worker の history を一切変更しない —
worker.rs:701のlet mut request_context = self.history.clone()により、hook に渡るのは clone。build_requestで使われた後に破棄され、self.historyには戻らない
アーキテクチャ
責務分離が綺麗に実装されている:
llm-worker::pruneには pure なprunable_indicesとPruneConfigのみ。 mutation 系 API (apply_prune,PruneResult) は完全に削除PruneHook内に content ドロップの inline ループ。意図的にインライン化されており、 「射影は呼び出し側の責任」という設計が形になっているPruneHookの doc comment でworker.rs:701への参照により 「なぜ mutate しても安全か」を明示
指摘と対処
1. clone 依存の脆さ(非ブロッカー、未対処)
現在の安全性は worker.rs:701 の clone に依存している。worker の実装変更で
clone が消えると設計が即座に壊れる。対策案:
- worker.rs の clone 箇所に「この clone は射影 hook に依存されている」旨の コメントを足す(軽い対処)
PreLlmRequesthook の型をRequestContextのような専用型にして 型レベルで分離(本格対処)
将来的な事故防止の観点で気になるが、チケット範疇の外。
2. PruneHook の射影ロジックに単体テストが無い(非ブロッカー、未対処)
llm-worker::prune の apply_prune テストを削除したのは正しいが、
PruneHook::call の射影ロジックには単体テストがない。
PruneHook::call を呼んで、context が変更され、かつ元 history が
変わらないことを検証する統合テストがあると安心。
判定
承認。