compaction: buffer of 180,904 reduces 200k window ceiling to just 15k tokens
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 85/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- typescript
- 領域
- cli
調査の方向性
packages/core/src/session/compaction.ts と関数 calculateCeiling を読む。ウィンドウ入力制限から buffer がどのように減算されるか理解する。buffer が適切な下限(例: RESERVE_SHARE)を下回るように天井を減らせないようクランプを実装するか、ドキュメントを更新する。完了とは、大きな buffer がトリガー閾値を ~15k tokens に崩壊させなくなることを意味する。
索引モデルが issue の本文から書いたものです。
説明
Summary
Automatic context compression triggers far too early (after ~15k tokens) despite a 200k token context window, because the configured compaction.buffer is subtracted directly from the model's input limit, leaving only 195,904 − 180,904 = 15,000 tokens of headroom before compaction fires.
Environment
- opencode version: 2.1.3
- OS: Darwin 27.0.0 (darwin arm64)
- Terminal: Unavailable (terminal environment variables not set)
- Shell: /bin/zsh
- Install/channel: latest
- Active plugins: -opencode.browser, /Users/thtesche/.config/openchamber/run/instances/52345/agent-tool/openchamber-agent-tool, @openchamber/opencode-claude@^1
- Active model:
strata/qwen3.8-flash-next-q2_0(context: 200,000 / input: 195,904 / output: 4,096) - User config:
compaction: { auto: true, buffer: 180904 }
Reproduction
- Set
compaction.bufferto a large value close to the model's input limit (e.g.180904of195904). - Start a session and exchange enough messages that the measured context passes ~15k tokens.
- Observe automatic compaction firing on nearly every turn, well before the 200k window is approached.
Expected Behavior
With a 200k context window and buffer unset, automatic compaction should not fire until roughly 85% of the window is used (~166k tokens). A large buffer should not collapse the ceiling to ~15k tokens.
Actual Behavior
The ceiling is calculated as window - buffer = 15,000 tokens, so due() returns true as soon as estimateContext(context) >= 15,000. Compaction fires after only a few exchanges, repeatedly rewriting history and discarding prompt-cache benefits.
Root Cause
calculateCeiling in packages/core/src/session/compaction.ts (introduced 2026-10-23 in commit 33726e8, PR #58313):
const calculateCeiling = (limit, buffer) => {
const window = limit.input || limit.context // 195,904
if (buffer !== undefined && buffer < window) // 180,904 < 195,904 → true
return window - buffer // 195,904 − 180,904 = 15,000
return window - Math.max(Math.floor(window * RESERVE_SHARE), RESERVE_MIN)
}
When buffer is set but still smaller than window, it is subtracted in full. The fallback to RESERVE_SHARE (15%) only applies when buffer >= window or buffer is unset.
The same day's commit added a guard ("ignore a compaction buffer that leaves the model no room"), but it only ignores buffers >= window. A buffer of 180,904 against an input limit of 195,904 still passes the buffer < window check, so the 15k ceiling stands.
Additional Context
- Evidence from
opencode.db: two local sessions exist, both measured well under the current 15k ceiling; the active strata/qwen3.8 session showsinput 707 / output 8847 / reasoning 3165 / cache read 245141 / cache write 127909— cache-heavy, soestimateContextclimbs quickly. - The
eventtable inopencode.dbis empty; compaction events are not persisted there, so the DB alone cannot confirm trigger counts. The code path is sufficient evidence. - This is not issue #50474 (auto-compaction loop on provider-reported overflow). This is a config/ceiling interaction: a user-set buffer collapses the trigger threshold.
- Suggested fix: validate
compaction.bufferso it cannot reduce the ceiling below a sane floor (e.g.RESERVE_SHAREof the window), or document thatbuffervalues close toinputwill cause near-immediate compaction.
- 主要言語
- TypeScript
- スター
- 221k
- フォーク
- 29.6k
- 平均マージ
- 4時間 35分
- マージ済み PR(30日)
- 521
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
anomalyco/opencode のほかの issue
-
triaging
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
anomalyco/opencode#58821 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
anomalyco/opencode#58725 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Snapshot capture failure (EPERM spawning git) fails the whole step despite the best-effort contract対応中かも @Dopetaiga が 1 日前に担当しました。 オープンreproduced
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
anomalyco/opencode#58685 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
tui: PHP code blocks without `<?php` are not syntax highlighted対応中かも @SwastikTripathi が 2 日前に担当しました。 オープンreproduced
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
anomalyco/opencode#58664 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
patch: moving an executable script removes its executable bit対応中かも @chenyb999-zhcn が 1 日前に担当しました。 オープンreproduced
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
anomalyco/opencode#58651 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
anomalyco/opencode の issue をすべて見る
似ている issue
-
Native Web
難易度 1/5 1時間未満 初心者へのやさしさ 80/100
digitalfabrik/integreat-app#4517 ·
メンテナーはふだん 2 日以内に返信
-
TLS guide repeats certs/ in the certificate directory対応中かも @maheshrijal が今日担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
prometheus/docs#3156 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 83/100
medusajs/dtc-starter#90 ·
メンテナーはふだん 1 日以内に返信
-
usability
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
inmanta/web-console#7632 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
zaidmukaddam/scira#261 ·