Repository navigation
perf: manager_list の受信箱の内訳を、同じ会話の2回目から前回と同じなら1行に畳む - #5471
Merged
Merged
Conversation
q で1件だけ引く manager_list でも、2回目以降に毎回全文で出ていた「受信箱の未処理の合図」の内訳(種類・送信元・同一本文・器の入れ替え回数・齢)を、 同じ内訳なら件数と全文の在りかを示す1行にする。固定の言い回し(注意書き)は既に #5390 などで畳まれており、残っていたのは値の側だった。 畳みは DigestSessionDelta.fixedInTurn(ToolContext.foldFixed)に乗せる。鍵に観測時刻を除いた内訳の指紋を入れ、古い版は supersedes で捨てるので、 内訳が変われば全文、A→B→A と変わっても2回前の A を「同じ」と言わない。compaction・新会話・usage 不明・失敗ターン・20ターン保険・再起動は同じ口で全文へ戻る。 読めない受信箱の行が在る回・サブエージェントの呼びは畳まない。refetch: true で全文を出し直せる。見出し(件数・最も古い時刻)は毎回出す。
takecchi
marked this pull request as draft
October 28, 2026 22:23
Owner
Author
|
レビューで NG。読めない行が在る回と、受信箱が空の回に、内訳の控えを捨てない。そのため A→B(読めない行あり)→A や A→空→A で、直前に見せたものと違うのに「前回と同じ」と畳む。直したら ready に戻す。 |
レビュー指摘2点。 - 読めない行が在る回は `&&` で fold が呼ばれず控えが古いまま残り、A → B(読めない行あり)→ A の3回目が「前回と同じ」と畳まれた。 読めない行の回も全文の指紋で fold を呼んで控えを最新にし、出力は常に全文にする。 - 受信箱が空(読めない行だけの回を含む)の回に控えを捨てていなかったので、A → 空 → A の3回目が畳まれた。空の回で控えを捨てる。 どちらも、直す前の版で落ちる試験を足した。inbox-backlog.ts の注記と既存の試験名も新しい挙動に合わせた。
takecchi
marked this pull request as ready for review
October 28, 2026 23:52
takecchi
marked this pull request as draft
October 29, 2026 00:14
Owner
Author
|
再レビュー NG(head c942d41)。前回の3点はコード上は直っていて、#5479 の系統2のスイッチでも止まります。残りは試験です。
|
clone-manager-list-query-fold.test.ts の createClone に TOKEN_SAVING_ENABLED_ENV を渡し、 畳みが切り(env が空)のときは同じ内訳で2回呼んでも2回とも全文で 「内訳(計 N 件)は前回と同じ」が出ない試験を足す。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
何を直したか
manager_listを q で1件だけ引く呼びでも、同じ会話の2回目以降に、末尾の「受信箱の未処理の合図」の内訳(種類・送信元・同一本文・器の入れ替え回数・齢)が毎回全文で出ていた。これを、同じ内訳なら件数と全文の在りかを示す1行に畳む。DigestSessionDelta.fixedInTurn(ToolContext.foldFixed)に乗せた。行の「前回と同じ」(perf: manager_list は前回と変わらない行を「前回と同じ」の1行に畳む #5438)と同じ流儀で、鍵に内訳の指紋を入れ、古い版はsupersedesで捨てる。⚠ クローンの受信箱に未処理の合図が N 件ある(最も古いものは…))は畳まず毎回出す。人間起点の滞留の行は、畳む回も件数と「まだ片付いていない分」の件数を残す。refetch: trueは内訳も全文で出し直す(説明文も更新)。NO_FIXED_FOLD)。行の ⚠ / lost / failed / quota-stopped / runner-vanished は既存のmanagerRowAlwaysFullのまま触っていない。foldFixedの口が持つ既存の仕組みのまま。原因(なぜ q で引くときに畳まれていなかったか)
q 付きだと畳みを飛ばす条件は無かった。別経路でも、鍵が違うのでもない。q の有無にかかわらず
manager_listは同じfoldを通る(tools.tsのmanager_listハンドラ冒頭でcontext.foldFixedを取り、件数行・絞り込みの注記・印の意味・行・受信箱の固定の言い回しに渡している)。実測(下)では、変更前(origin/main)でも冒頭の注意書き(
COUNTS_RUNNING_FULL等)は2回目に参照へ畳まれていた。畳まれていなかったのは受信箱の内訳の「値」の側だった。#5390 以降の畳みは「固定の言い回し」だけをfoldに包み、数・時刻・種類の内訳は「毎回の値」として畳まない設計(inbox-backlog.tsのInboxBacklogFoldの注記)で、内訳の行は人間起点の行も含め、同じ中身でも毎回全文で出ていた。q で1件だけ引くと本体の行が短くなるので、この残りが応答の大半を占めて目立つ。したがって「約2,000字」のうち、冒頭の注意書きは(この実測の範囲では)2回目以降すでに畳まれている。この PR で畳むのは、残っていた受信箱の内訳。冒頭の注意書きの側で、依頼文のとおり毎回全文になる経路があれば、それはこの実測では再現していない(下の「測っていないこと」)。
測ったこと
本番と同じ経路で測った:
createClone(fake SDK。getContextUsageを持つ fake、mcpServerFactoryでToolContextを捕まえ、createCloneToolsのmanager_listハンドラを呼ぶ。ターンは1回回して会話を成立させてある)。同じセッションでmanager_list {q: "mgr-target"}を2回呼び、応答の文字数を比べた。台帳は3本(q に当たるのは running の1本)、受信箱の滞留は12件(人間起点6件を含む)。2回目は 368 字(約33%)減。1回目は変わらない(全文が会話に載る回)。測定は
packages/core/src/clone-manager-list-query-fold.test.tsの最初の試験に一時的にconsole.log(first.length, second.length)を足して、変更前はtools.tsを origin/main に戻して実行した(測定用の出力はコミットしていない)。測っていないこと
tool_use_id(_meta)の経路。試験では_metaを渡さない呼び(本体扱いで畳む)と、PreToolUse hook で印を立てたサブエージェントの呼びを別々に確かめた。落とした判断材料が無い理由
refetch: trueでいつでも出し直せる。試験
clone-manager-list-query-fold.test.ts(10本、本番と同じ createClone 経路)。追加した試験ごとに、修正を一時的に戻して落ちることを確認した:supersedesを外したfoldFixedの外(モジュールの Set)に置いたfoldFixedを渡した既存の試験を1本反転した(3点セット)
tools-manager-list-fold.test.tsの「受信箱の滞留」は「数・時刻・内訳は毎回出る」を期待していた。触っていない領域
claude-provider.tsの窓(#5467)、ALT-DEV-Y の A1/A3(記憶索引・manager_send・approvals_listの固定文・固定文ラベル・memory-update diff)。docs/とAGENTS.mdは変更していない。検証: build・typecheck・lint・format:check・
pnpm testを通した。