Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

compaction: buffer of 180,904 reduces 200k window ceiling to just 15k tokens

オープン 初心者向け
#58,774 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 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

  1. Set compaction.buffer to a large value close to the model's input limit (e.g. 180904 of 195904).
  2. Start a session and exchange enough messages that the measured context passes ~15k tokens.
  3. 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 shows input 707 / output 8847 / reasoning 3165 / cache read 245141 / cache write 127909 — cache-heavy, so estimateContext climbs quickly.
  • The event table in opencode.db is 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.buffer so it cannot reduce the ceiling below a sane floor (e.g. RESERVE_SHARE of the window), or document that buffer values close to input will cause near-immediate compaction.
主要言語
TypeScript
スター
221k
フォーク
29.6k
平均マージ
4時間 35分
マージ済み PR(30日)
521

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

anomalyco/opencode のほかの issue

anomalyco/opencode の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。