From 3f7de349c3140f1d97450bf0eb1e4b5dbf028387 Mon Sep 17 00:00:00 2001 From: Hare Date: Sat, 23 May 2026 09:14:37 +0900 Subject: [PATCH] chore: complete memory-extract-remove-input-cap ticket --- TODO.md | 1 - tickets/memory-extract-remove-input-cap.md | 74 ---------------------- 2 files changed, 75 deletions(-) delete mode 100644 tickets/memory-extract-remove-input-cap.md diff --git a/TODO.md b/TODO.md index 121a1aa0..596f87e1 100644 --- a/TODO.md +++ b/TODO.md @@ -21,7 +21,6 @@ - spawn 失敗時に Pod の stderr が TUI に表示されない → [tickets/tui-spawn-error-surface.md](tickets/tui-spawn-error-surface.md) - 巻き戻されたターンの入力テキストを編集領域に復元 → [tickets/tui-empty-turn-restore.md](tickets/tui-empty-turn-restore.md) - メモリ機構 - - Memory extract の input occupancy cap を撤廃 → [tickets/memory-extract-remove-input-cap.md](tickets/memory-extract-remove-input-cap.md) - extract / consolidation 監査ログ → [tickets/memory-audit-log.md](tickets/memory-audit-log.md) - セッション内 Task ツールの注意機構(無アクティビティで `` ナッジ) → [tickets/session-todo-reminder.md](tickets/session-todo-reminder.md) - ワークスペースのメモリーをLintするヘッドレスCLI diff --git a/tickets/memory-extract-remove-input-cap.md b/tickets/memory-extract-remove-input-cap.md deleted file mode 100644 index a1b4dd0f..00000000 --- a/tickets/memory-extract-remove-input-cap.md +++ /dev/null @@ -1,74 +0,0 @@ -# Memory extract: input occupancy cap を撤廃し backlog 消費を詰まらせない - -## 背景 - -実セッションで以下の notice が繰り返し出ている。 - -```text -[notice] pod: memory extract failed: Aborted: extract worker input occupancy exceeded 30000 tokens -``` - -既存の `memory-extract-occupancy-cap` 対応では、`extract_worker_max_input_tokens` の測定方法を累積 input token から現在 prompt occupancy に直した。しかし、実運用上の問題はまだ残っている。extract は前回 pointer 以降の未処理 history slice を処理して pointer を進める機構なのに、その未処理 slice を入力にした extract worker 自身が input occupancy cap で abort すると、pointer が進まず、次回は同じ slice にさらに新規履歴が足されてより大きくなる。 - -つまり deterministic な cap 超過が、backlog 解消ではなく backlog 固着を生む。 - -現行実装では `run_extract_once` が以下を丸ごと extract input にする。 - -```rust -items_to_extract = worker.history()[processed_history_len..current_history_len].to_vec() -``` - -その後 `MemoryExtractWorkerInterceptor` が extract worker の pre-request context を `llm_worker::token_counter::total_tokens` で測り、`extract_worker_max_input_tokens` を超えると `Cancel` する。 - -一方で `memory::extract::build_extract_input` は raw `ToolResult.content` ではなく `ToolResult.summary` だけを render するため、巨大 tool output 本文そのものを extract に渡しているわけではない。それでも未処理 range が長い、summary / user / assistant text / tool arguments が多い、または一度失敗して pointer が止まった場合には input が cap を超えうる。 - -## 判断 - -`extract_worker_max_input_tokens` は撤廃する。extract の主目的は未処理 session slice を消費して staging に活動ログを残すことであり、入力が大きいことを deterministic abort 条件にすると目的と衝突する。 - -暴走防止は既存の `extract_worker_max_turns` で扱う。model context limit による API failure は通常の worker failure として扱い、input occupancy cap によって事前に pointer を止める設計はやめる。 - -将来、model context error が実問題になる場合は、extract source range を token / rendered text budget で chunk 分割して順次消費する設計を別途入れる。その場合も「cap 超過で abort」ではなく「収まる chunk を選んで pointer を進める」方向にする。 - -## 要件 - -- Manifest から `memory.extract_worker_max_input_tokens` を撤廃する。 - - `MemoryConfig` / cascade / docs / defaults から削除する。 - - 後方互換 shim は入れない。旧 field を書いた manifest は unknown field として明示的にエラーになること。 -- `MemoryExtractWorkerInterceptor` を削除する。 - - extract worker への `UsageTracker` 配線も、input cap のためだけなら削除する。 - - `extract_worker_max_turns` は維持し、tool-loop 暴走防止として使う。 -- `run_extract_once` は、現行通り pointer 以降の未処理 range を extract worker に渡し、成功時に pointer を進める。 - - cap 超過による deterministic abort で pointer が止まり続ける経路をなくす。 - - LLM/API failure や tool failure の場合は従来通り pointer を進めない。 -- extract input が `ToolResult.content` ではなく `ToolResult.summary` のみを render する前提を test / comment で明確にする。 - - 大きな tool output 本文は extract input に入らないことを regression test にする。 -- notice / alert 文言から `extract worker input occupancy exceeded ... tokens` が発生しないようにする。 -- docs を更新する。 - - `docs/manifest.toml` - - `docs/plan/memory.md` - - 必要なら `crates/manifest/src/defaults.rs` / `crates/manifest/src/lib.rs` の doc comment - -## 完了条件 - -- `memory.extract_worker_max_input_tokens` が設定項目として存在しない。 -- 旧 `extract_worker_max_input_tokens` を manifest に書くと parse / validation error になる。 -- 未処理 range が大きい場合でも、extract worker が input occupancy cap で abort しない。 -- `ToolResult.content` に巨大文字列が入っていても、`build_extract_input` は summary のみを含める test がある。 -- `extract_worker_max_turns` による暴走防止は維持される。 -- `cargo fmt --check` -- `cargo check --workspace` -- `cargo test -p manifest -p memory -p pod` - -## 範囲外 - -- extract source range の chunk 分割実装。 -- oversized single item の truncation / skeleton 化。 -- consolidation worker の budget 設計変更。 -- memory audit log の実装。 -- extract / consolidation の採択ロジック変更。 - -## 関連 - -- `tickets/memory-audit-log.md` -- 過去対応: `memory-extract-occupancy-cap`(測定方法を累積から occupancy に直したもの。今回の対象は cap の存在自体)