v0.37.0
·
1016 commits
to master
since this release
v0.37.0
Cache stability
- Fixed a per-turn cache bleed where an assistant message with leading whitespace before a thinking block lost its reasoning one pass after being newest, moving the cache divergence point forward every turn (~94k-220k tokens re-created per pass on affected sessions). Whitespace-only text blocks are now sentinel-invisible, and merged-reasoning strips freeze their applied set on cache-busting passes and replay it deterministically (both runtimes).
- Model variant spellings can no longer bust the cache: per-model config keys (
cache_ttl,prompt_surface.models, limit overrides) accept both the harness-native and canonical provider prefixes on OpenCode and Pi, and model-identity comparisons canonicalize both operands, so a spelling difference never registers as a model switch or triggers a spurious HARD fold (#319). - An absent compaction block in the resolved OpenCode config is treated as inconclusive instead of a conflict, so newer OpenCode hosts no longer silently disable the plugin on boot (#309).
- Rust-mode sessions with persisted compaction markers no longer misplace the summary ahead of m0: synthetic head detection is structural, identical across TypeScript and Rust transforms.
Rust transform parity
- Closed parity audit rounds 3 and 4 (39 findings): reasoning-strip and reduction edges, auto-search admission timing and controls, native threshold/config transport, emergency reclaim accounting, duplicate-tool selection, guidance override paths, B-arm frozen transitions, and Claude Code channel-2 delivery groundwork.
Context-window geometry
- Context limits now derive from a dual metric:
usable_soft(thresholding) andusable_hard(the real API wall per provider geometry), fed by FUSIFORM's full-catalog window overlay (125 providers, 5,680 models) with access-path-aware windows. First-pass scheduling resolves its denominator from geometry instead of a 200k constant. - Added an append-only overflow report ledger for provider context-overflow observations.
Performance
- Giant sessions (4,000+ messages) no longer pay full-wire serialization every pass: degraded cache snapshots keep the delta-serving core, and delta attachment keys on raw ingress rather than transformed output. Measured on a live 4,300-message session: 47 pages/23.9MB/20-90s per pass down to 1 page/169KB/~0.6s.
- Module memory accounting deep-charges retained structures; the process ceiling dropped from unbounded (observed 1.15GB) to designed bounds.
Migration hardening
doctor migrate-sessionrefuses to re-home a session while either project holds module authority or module-held session cache state, with the exact drain command named (previously it could strand module-owned state under the wrong project).- OC→Pi/OMP migration writes a phase-bearing recovery journal: an interrupted migration can no longer leave an orphan Pi session file, and recovery rolls forward or back deterministically by phase. Compartment ordinals are derived in the Pi runtime reader's basis instead of copied from the OpenCode basis (schema v78).
Fixes
- Windows (MSYS2/Cygwin): PID identity probes use tasklist instead of GNU ps flags, eliminating ~30 stderr lines per launch (#321).
- Tag-mint frontier cache is LRU-bounded; three Pi cache-parity drifts closed (#314, #315).
- OpenRouter embedding model canonicalization no longer refuses served models over routing-tag differences (#306).
- Dashboard coverage manifest classifies
models.window_overlay_path(#318, thanks @iceteaSA).