Skip to content

v0.41.4

Choose a tag to compare

@github-actions github-actions released this 06 Sep 11:22
· 296 commits to master since this release

v0.41.4

Emergency reclaim liveness on Pi and OpenCode (#423)

A single-turn session with many large tool outputs could grow far past the context window while every reclaim path did nothing. Three causes, all fixed: an emergency evaluation that removed nothing armed the pressure-episode latch and blocked every later evaluation; the user's protected_tags window and the recency reserve still protected everything at 95% and above; and the historian's per-run head cap could land inside the first oversized tool exchange, so the compaction range collapsed to empty on every pass. At 95% and above, only open tool calls and the newest three ctx_reduce calls stay protected now, and completed arcs adjacent to signed reasoning keep a paired skeleton so provider merges stay valid. Thanks to aoguai for the detailed logs.

Config problems are loud (#421, #422)

An unparseable magic-context.jsonc (for example a stray character on line 1) is recovered where possible and reported on every surface — OpenCode banner, Pi notice, /ctx-status, dashboard, and doctor — instead of silently loading defaults. /ctx-status shows the cache TTL resolved from live config and model identity with its provenance, not the stored seed. doctor --report <path> reports on a config file without loading it. Thanks to G0-0000.

OMP harness detection on global installs (#425)

On bun install -g layouts and with ESM-only @oh-my-pi/pi-utils, 0.41.3's probe could not resolve the host package and every OMP session was filed as Pi (empty OMP dashboard view, historian.omp/dreamer.omp never applied, doctor reading the Pi log path). Detection now uses the host's own process identity first, then the host package name, then an ESM probe, then the launcher name, and logs which rung decided. Sessions already filed as Pi keep that label. Thanks to VibePDF for the precise diagnosis.

Dreamer failure detail

Failed dreamer runs now record why: provider_timeout, provider_error, empty_completion, no_models, child_aborted, parse_failed, or unknown, with the attempted model, the provider's first error line, the timeout in effect, and the child session ID. Shown in the dashboard, task banners, and /ctx-dream output.

Rust transform mode

  • A module process restart no longer costs each session two cache busts: the module retains its served fingerprint across the restart, the adapter freezes on a divergent defer response and replays the persisted last-known-good bytes until a priced pass, and priced captures reach durable storage before the response is served.
  • A frozen last-known-good replay that stops validating now releases and serves module output instead of falling through to a raw serve or a refusal; the freeze is bounded on defer-only sessions.
  • Two defer-pass busts after a model switch are gone: the adapter keeps the pristine module array as its delta basis (host marker insertion no longer discards a historical row), and a demoted signed assistant keeps its complete native part vector until the next priced pass.
  • A cold pass on a large session no longer hangs when the historian follow-up awaits completion under emergency pressure; the wait is bounded and health reports stuck instead of ok.

Effort changes without cache busts

Anthropic Fable 5.1 and OpenAI GPT-6 Astra keep the prompt cache when the reasoning effort changes mid-conversation. Magic Context no longer forces a flush on those flips on OpenCode, Pi, or the Rust module; pending work rides the next natural bust.

Historian stalls on large tool batches (#424)

Since 0.41.0 the historian could fire on every pass and compact nothing: when the first completed tool exchange after the last compartment was larger than the per-run cap, the boundary fence retracted to the compartment edge instead of admitting the exchange, so a session with one large tool batch at the head never advanced (historian no-op … eligibleEnd=6 <= offset=6), and /ctx-wrapup wrapped two messages per run. The head cap now admits that first exchange whole, the chunk reader and pre-flight no longer clip it before it reaches the historian, and the same rule applies in the Rust module. The no-op and wrapup lines now say which limit decided. Thanks to tenshiak.

Also

  • analyze-cache-busts.ts reports real request body bytes.
  • Dashboard 0.15.0 shipped separately with canonical turn detection, OMP config, profiles, and dreamer failure detail.