compaction: buffer of 180,904 reduces 200k window ceiling to just 15k tokens
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 85/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- typescript
- Domain
- cli
Research direction
Read packages/core/src/session/compaction.ts and the calculateCeiling function. Understand how buffer is subtracted from the window input limit. Implement a clamp so buffer cannot reduce the ceiling below a sane floor (e.g. RESERVE_SHARE), or update docs. Done means a large buffer no longer collapses the trigger threshold to ~15k tokens.
Written by the indexing model from the issue text.
Description
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.
- Dominant language
- TypeScript
- Stars
- 221k
- Forks
- 29.6k
- Avg merge
- 4h 35m
- Merged PRs (30d)
- 521
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from anomalyco/opencode
-
triaging
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
anomalyco/opencode#58821 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
anomalyco/opencode#58725 · 1 comment ·
Maintainers usually reply within 1 day
-
Snapshot capture failure (EPERM spawning git) fails the whole step despite the best-effort contractPossibly taken @Dopetaiga claimed this 1 day ago. Openreproduced
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
anomalyco/opencode#58685 · 2 comments ·
Maintainers usually reply within 1 day
-
tui: PHP code blocks without `<?php` are not syntax highlightedPossibly taken @SwastikTripathi claimed this 1 day ago. Openreproduced
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
anomalyco/opencode#58664 · 2 comments ·
Maintainers usually reply within 1 day
-
patch: moving an executable script removes its executable bitPossibly taken @chenyb999-zhcn claimed this 1 day ago. Openreproduced
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
anomalyco/opencode#58651 · 2 comments ·
Maintainers usually reply within 1 day
All issues in anomalyco/opencode
Similar issues
-
bug require-triage
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
expressjs/expressjs.com#2549 · 1 reaction ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
umami-software/umami#4686 · 1 comment ·
Maintainers usually reply within 2 days
-
[Bug]: Device screenshot fails with 500 on iPhone Duo (Xcode 27.2): serve-sim calls simctl without --displayPossibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
pingdotgg/t3code#24900 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
inu-appcenter/UNIDorm-web#411 ·
Maintainers usually reply within 1 day
-
🐛 bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 2 days