Skip to content

feat(core): トークン節約を系統別の環境変数で入り切りできるようにする - #5479

Merged
takecchi merged 5 commits into
mainfrom
feat/token-saving-switches
Oct 28, 2026
Merged

takecchi merged 5 commits into
mainfrom
feat/token-saving-switches

Conversation

@takecchi

@takecchi takecchi commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

概要

トークン節約の改修が応答の質を下げていないかを切り分けるため、節約を系統別の環境変数で入り切りできるようにする(オーナーの依頼)。名前・既定・効く所は docs/architecture.md の「トークン節約の入り切り」に書いた。値は on / 1 / true(有効)、off / 0 / false(無効)。未設定・空は既定。読めない綴りは既定へ倒して stderr に1行残す(同じ名前・同じ値の痕跡は1プロセスで1回だけ。起動は落とさない)。Clone は構築時に env ?? process.env から1回だけ読む。

系統 変数 既定 無効のときの振る舞い
2 決まった文の折り畳み ALTEROID_TOKEN_SAVING_FOLD_FIXED_TEXT 無効 2回目以降も毎回、元の全文を出す(何も控えない)
4 compaction まわり ALTEROID_TOKEN_SAVING_COMPACTION 無効 自動要約の窓を設定しない(SDK の既定)。要約後は記憶を全文で載せ直す。要約直後の軽い全文もしない
3 可変内容の抜粋・予算 ALTEROID_TOKEN_SAVING_EXCERPT 有効(現状のまま) 報告は途中の発言を含む全文、本文は切らない、退避の一覧の予算は節約前の値、履歴の節は節約前の件数

既定が「無効」の2系統は、この PR をマージするとデーモンの挙動が変わる(畳み・compaction の節約が止まる)。切り分けのためにオーナーが既定を無効と指定した。節約を戻すには ALTEROID_TOKEN_SAVING_FOLD_FIXED_TEXT=on / ALTEROID_TOKEN_SAVING_COMPACTION=on。

CLAUDE_CODE_AUTO_COMPACT_WINDOW が空でなければ、compaction 系統が有効のときも従来どおりそちらが勝つ。

系統2と系統4は独立している。 要約直後の軽い再掲(isLean と renderDigest の lean の分岐)は系統4の変数だけで決まり、畳み(系統2)が無効でも COMPACTION=1 なら効く(畳みが無効の間は、省く節の参照だけが出て、前回との差分や参照は出ない)。

最小の切り口

切れないもの

環境変数の袋・compose

  • APP_ENV_VAR_DEFAULTS へ3つとも播種した(値はコードの既定と同じなので、行を置かなくても挙動は変わらない)。理由: /env-vars に見える、変更に再起動が要ることを画面が名乗る、コンテナの env が先に勝つ。alteroid credential set <名前> <値> で袋に置けば、起動時にデーモンの process.env へ写される(Clone はそこから1回読む)ので、変えたらデーモンの再起動が要る。マネージャー層の窓は runner 側の env を読む。
  • compose.yaml に3つを空の既定で通す(${NAME:-})。

PR の全表

基準は origin/main 98bb42c(#5466 まで)。PR 本文と変更ファイルを gh pr view で読んで分類した。

マージ済み

PR 題 系統 効く所
#5289 クローンのプロンプトの「# 道具」を索引へ縮める 1 prompt.ts、tools.ts
#5321 焼き込みの目次の省略の断り書きを短くする 1 memory.ts
#5326 焼き込みの目次の行を短くする 1 memory.ts
#5342 要約の先頭の件数14行を1行に畳む 1(固定の再構成) digest.ts
#5351 manager_list の行ごとの固定文を末尾に1回だけ 1 tools.ts
#5355 manager_send の delivered の固定注記を1文に 1 tools.ts
#5356 作成と更新が同じ値なら時刻を1つに 1 tools.ts、excerpt.ts
#5361 memory_write / memory_append の応答の重複を削る 1 memory.ts、tools.ts
#5367 記憶の再注入の見込みの予測文を短く 1 memory.ts
#5377 manager_send の説明文から重複する段落を外す 1 tools.ts
#5413 situation の「変化あり」ブロックの固定語句を短く 1 situation.ts
#5433 クローンの固定文の純粋な繰り返しを削る 1 prompt.ts、tools.ts
#5455 journal_read の一覧で会話 id を凡例1回+札にする 1 tools.ts
#5462 一覧の抜粋の注記を短く 1 excerpt.ts、tools.ts(turn_usage の機能追加を含む)
#5270 manager_send の返り値と報告の包みの固定文 2 DigestSessionDelta(報告の包み・起点の会話の説明)
#5296 「いまの全体」を材料が前回と同じなら1行に 2 situation の explained
#5298 台帳の2行を2回目から参照に 2 fixed('commitment-notice-*')
#5300 質問・許可確認の応じ方の骨組みを参照に 2 foldParagraphs / fixed
#5302 human_answer の末尾の基準を短い形に 2 fixed
#5303 外部イベントの2行の指示を短い形に 2 fixed
#5304 記憶更新の頭を短い形に 2 fixed
#5357 発言に全文が載った報告の manager_report 引き直しを注記だけに 2 reportShown / reportShownAt
#5373 蒸留の指示の固定の本体を参照に 2 fixed
#5390 受信箱の束の見出しの固定の注意文を参照に 2 fixed
#5391 人間操作の節の末尾段落を畳み、台帳の2参照を1行に 2 fixed('human-action-guidance')
#5394 定期 tick の件数の形の固定説明を参照に 2 fixed
#5395 要約で2節以上が前回と同じなら節ごとの参照を1行に 2 renderDigest
#5398 manager_list の固定の説明を2回目から短い参照に 2 foldFixed(fixedInTurn)
#5401 混合の束で、起点が同じ2件目以降の固定の枠を畳む 2 Clone の束の中の畳み(別の門)
#5408 自発 tick の件数の行の項目名を2回目から参照に 2 fixed('digest:counts-line-labels')
#5410 台帳の2ターン目以降の参照行を短く 2 参照行(畳みの出口)
#5411 確認の2回目以降の参照で同じ宛先を2回書かない 2 参照行(畳みの出口)
#5419 再起動後の最初のターンで畳みの控えを読み戻す 2 控えの永続化(無効なら控えが空で何も起きない)
#5423 manager_list と runner_list の固定文を2回目から札に 2 foldFixed
#5430 manager_list の行の中の固定の一文を、2行目から札に 2 foldFixed
#5438 manager_list は前回と変わらない行を「前回と同じ」の1行に 2 fixedInTurn(supersedes)
#5445 self_status・progress_read など5道具の固定文を札に 2 foldFixed
#5447 manager_send・approvals_list・memory_append の固定文を札に、要約後の削除名を切らない 2(前半のみ) foldFixed。後半は切らない
#5448 定期 tick の継続中の依頼の行を前回から変わらなければ畳む 2 foldStandingRows
#5458 schedule_list で見せた kind は畳みの控えを残す 2 keepStandingRowIfSame(#5448 の補強)
#5269 報告はクローンへ最後の発言だけを配る 3 reportDeliveryTextOf / reportFullTextOf(マネージャー側の配信の選択だけ切る)
#5330 要約から定型の decision を外す(routine 印) 3(切れない) 永続スキーマに入っている
#5331 窓より前に終端した failed の担当を1行に畳む 3 buildActivityDigest の trimHistory
#5332 要約の履歴系の節の上限を下げる 3 buildActivityDigest の trimHistory
#5414 畳んだ報告の末尾注記の抜粋を新しい側の2本までに 3 退避の一覧の予算(ManagerPoolOptions.tokenSavingExcerpt)
#5466 クローンへ出す報告の本文を 8,000 字で切る 3 MANAGER_REPORT_BODY_LIMIT(#reportBodyLimit())
#5268 クローンとマネージャーの自動の要約の窓を既定 300K に 4 autoCompactWindowSettings
#5310 要約後の記憶の索引は、焼いた時点から変わっていなければ全文を載せ直さない 4 recordBakedMemory
#5446 要約後の記憶の載せ直しを、変わった文書だけにする 4 recordBakedMemory
#5349 要約の直後の全文を判断の節だけの軽い全文にする 4 reset('compaction') / isLean(畳みとは独立)
#5282 #5365 起点の違う合図・同じ担当の報告を1ターンにまとめて読む 5 ターン数削減(対象外)
#5369 #5381 #5404 束ね待ち 5 既存の ALTEROID_INBOX_SETTLE_MS / ALTEROID_REPORT_SETTLE_MS(対象外)
#5378 #5382 #5383 戻っている担当の知らせはクローンを起こさず畳む 5 起こさない判断(対象外)
#5308 #5325 #5366 #5372 #5376 プロンプトの規則の追加 5 prompt.ts / tools.ts(対象外)
#5324 #5328 gh run watch の出力縮小 5 Bash 出力(対象外)
#5309 蒸留に渡す会話ログの末尾を整形テキストに 5 蒸留の入力(対象外)
#5294 #5311 #5362 #5399 #5424 観測のみ 5 挙動は変わらない

未マージ(この PR では扱わない)

PR 題 系統 備考
#5467 マネージャー層の自動の要約の窓を 300K から 200K 4 claude-provider.ts の窓の部分と衝突しうるので、触ったのは autoCompactWindowSettings の門の1行だけ
#5468 manager_report の退避 ref を種類ごとの本数と代表の1本に畳む 3 マージ後に EXCERPT の門を足す余地
#5471 manager_list の受信箱の内訳を2回目から前回と同じなら1行に 2 foldFixed を通るなら自動で切れる
#5473 クローンの1ターンに載る文脈の量を種類別に測る道具 5(測定) 対象外

実測(代表1ケース: situation の1ターン目→2ターン目)

createClone と偽の SDK で、同じ場面の入力の全文の字数を測った(clone-situation-notice.test.ts)。

1ターン目 2ターン目
畳み無効(既定) 1586 字 1586 字
畳み有効 1586 字 247 字

他の出口の有効時の実測は、定期 tick の入力 9803→792 字、確認の入力 2448→789 字、台帳の2行 217→90 字。無効のときはどれも同じ長さのまま。

テスト

  • 無効のとき全文が出ることを、畳みの全出口で検証した: manager_list の固定段落と変わらない行・行の印・受信箱の滞留・絞り込みの注記・runner_list、situation、tick の件数の行と継続中の依頼、確認の応じ方の参照、台帳の通知、報告の包み、報告の引き直し、束の中の畳み。各テストは、有効にすると畳まれる場面で書き、無効にだけ全文になることを見る(空振りにしない)。
  • compaction: 窓を載せない、CLAUDE_CODE_AUTO_COMPACT_WINDOW が勝つ、要約後に記憶の索引を全文で載せ直す、軽い全文にしない。畳み無効(未設定・0・off)かつ COMPACTION=1 で軽い全文になる、COMPACTION=0 なら畳みの入り切りによらず出ない(Clone 単位と DigestSessionDelta 単体)。
  • 抜粋: 報告の全文配信、本文を切らない、退避の予算 1,500、履歴の節の件数。
  • 既存の畳みのテストは、共有ハーネス(clone-test-harness.ts の TOKEN_SAVING_ENABLED_ENV)か明示の env で畳みを有効にして、アサートは弱めていない。
  • 変異検査: 修正を Edit で戻して新規テストが落ちることを確認し、復元した(10 点)。DigestSessionDelta の disabled を無視させると 37 件、situation の門で 4 件、perf: 混合の束で、起点が同じ2件目以降の固定の枠を畳む #5401 の門で 3 件、compaction の3点で 9 件、抜粋の3点で 6 件、lean を disabled に縛り直すと 4 件(畳み無効+COMPACTION=1 の Clone 3 件と単体 1 件)が落ちる。
  • 壁時計の待ちは使っていない。
  • ローカルで build / typecheck / lint / format:check / pnpm test(1802 ファイル 25955 テスト通過、3 ファイル 11 テストは skip)を通した。

応答の質の劣化が節約によるものか切り分けるため、節約を系統ごとに環境変数で入り切りできるようにする。

- ALTEROID_TOKEN_SAVING_FOLD_FIXED_TEXT(既定 切り): 固定文の畳み。DigestSessionDelta の disabled と、束の中の畳み、状況の説明の畳みを止める
- ALTEROID_TOKEN_SAVING_COMPACTION(既定 切り): 自動の要約の窓、要約後の記憶の差分再表示、要約後の軽い再表示
- ALTEROID_TOKEN_SAVING_EXCERPT(既定 入り): 報告本文の 8,000 字の切り、配送の抜粋、止めた報告の一覧の枠、ダイジェストの件数の絞り

既存の畳みの試験は harness 経由で明示的に有効にして、アサーションは弱めない。
- 畳み(FOLD_FIXED_TEXT)を切ったとき、全ての畳みの出口(manager_list・situation・tick・確認の参照・台帳・報告の封筒・inbox 滞留・束の中の畳み)が全文になることを検証する
- compaction を切ったとき、窓の設定・記憶の全文の載せ直しが節約の前の形になることを検証する
- 抜粋を切ったとき、報告本文の上限・報告の全文配信・退避の一覧の予算・履歴の節の件数が節約の前の形になることを検証する
- スイッチの綴りの解決、DigestSessionDelta の disabled の単体テスト
- 既定値を APP_ENV_VAR_DEFAULTS と compose.yaml へ載せる
- 束の中の畳み(#5401)の別の門、compose の通し、切れないもの(#5330・#5447 後半・系統5)を書く
- compaction の窓のテストの題を系統名に合わせる
@takecchi
takecchi marked this pull request as draft October 28, 2026 23:25
@takecchi

Copy link
Copy Markdown
Owner Author

レビュー NG(head 097643e)。

  • FOLD_FIXED_TEXT=0(既定)で COMPACTION=1 にすると、系統4の「要約直後の軽い再掲」(isLean と renderDigest の lean の分岐)が効かない。DigestSessionDelta の disabled(系統2のスイッチ)に縛られているため。直し方は (a) lean を disabled から外し、COMPACTION だけで入り切りする(推奨)か、(b) この依存を docs/architecture.md の表に明記する。どちらの場合も、この組み合わせを固定する試験を足す。
  • 軽微・任意: 不正な値の痕跡が、セッションを組むたびに autoCompactWindowSettings から繰り返し出ないようにする。

@takecchi
takecchi marked this pull request as ready for review October 28, 2026 23:26
- FOLD_FIXED_TEXT が無効(既定)でも、COMPACTION=1 なら要約直後の軽い全文(isLean と renderDigest の lean の分岐)が効く。畳みが無効の間は、軽い全文の省略だけを掛け、前回との差分や参照は出さない
- 読めない値の痕跡は、同じ名前・同じ値なら1プロセスで1回だけ残す(セッションを組むたびに autoCompactWindowSettings から繰り返し出ない)
- 試験: FOLD=0 かつ COMPACTION=1 で軽い全文になる、COMPACTION=0 なら出ない、DigestSessionDelta 単体、痕跡が1回だけ
- docs/architecture.md の表を合わせる
@takecchi
takecchi merged commit 89f1137 into main Oct 28, 2026
7 checks passed
@takecchi
takecchi deleted the feat/token-saving-switches branch October 28, 2026 23:58
takecchi added a commit that referenced this pull request Oct 29, 2026
#5479 の続き。トークン節約の折り畳みが無効の間は、「前回と同じ」の判定に使う節の控えを記録しない。古くなった説明文を直す。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant