Skip to content

v0.44.4

Latest

Choose a tag to compare

@github-actions github-actions released this 30 Sep 09:18
· 311 commits to master since this release

This patch release fixes a 0.44.2 regression that stopped existing project memories from loading in a git repository with no commits yet (#574). It also makes doctor merge-identities --apply work on Windows, including non-English Windows (#573), stops the cached history block from being rebuilt each time the model's measured context window changes (#572), and keeps the dreamer's work when a map-memories or verify run reaches its token budget.

Upgrading

  • No schema change. The database stays at v91, so hosts on 0.44.0 through 0.44.4 can share it and no coordinated restart is needed.
  • OpenCode 2 does not install plugin updates on its own. Open /plugins, select Magic Context and press ctrl+u, or run opencode plugin update.
  • Rust transform mode: the Sol calibration entries (#577) and the answer protection (#581) reach Rust-mode sessions with the next ck-mc update. Everything else here is in the npm package.

Git repositories with no commits (#574, @devsiac)

  • Existing project memories load again. 0.44.2 treated a git repository with no commits the same as a git failure, so the session got no project identity, its memories stopped loading, and the sidebar logged an error on every refresh. A repository with no commits is now its own case and keeps its dir: identity, as it did before 0.44.2, so memories stored under that identity load again.
  • Temporary git failures still pause memory safely. In a repository with commits, a git failure still reuses the identity recorded for that directory, or pauses memory features until git answers again, as 0.44.2 intended (#555). This keeps a git project from splitting into two identities.
  • The paused state is logged once. When memory features are paused for a directory, the log records it once per directory and reason, instead of the sidebar logging an error on every refresh. The sidebar and status views report the paused state quietly.
  • doctor reports memories left behind by a first commit. When a repository gets its first commit, its identity moves from dir: to git:, and memories, notes and dreamer data stay under the old dir: identity. doctor now lists that split and points to doctor merge-identities so you can review it and choose which identity to keep. Nothing is moved automatically.

doctor merge-identities on Windows (#573, @devsiac)

  • No more apparent hang on non-English Windows. Before applying a merge, the command checks which processes still use the database. The Windows check only understood English tasklist output, so on other languages every stale discovery record looked uncertain and was probed one process at a time. It now takes one process snapshot, whatever the system language, and checks every record against it.
  • Discovery records whose process is gone are removed. Records that still belong to a running process are kept.
  • Progress and a time limit. The check prints progress while it runs and gives up after 15 seconds with a message asking you to close OpenCode and Pi and retry, instead of running without output.
  • The merge is no longer always refused on Windows. The command called lsof, which Windows doesn't have, so the check could never pass. On Windows it now uses the same process and lock check as doctor --fix.

Cached history block (#572, @Sugaroverdose)

  • A growing context window no longer rebuilds m[0]. m[0], the cached history block, was rebuilt whenever the model's measured context window changed. That happened after a restart for a model outside OpenCode's catalog, when the window moved from the catalog value to the proven accepted input, and again each time the proven accepted input grew. Each rebuild cost a full prefill. m[0]'s identity now follows your Magic Context budget settings (history_budget_percentage and the execute threshold), so a change in the measured window alone no longer rebuilds it. A change to those settings still rebuilds it once.
  • A shrinking window rebuilds once. m[0] also records the budget it was built for. When the live budget drops below that by more than 64 tokens or 1%, whichever is larger, m[0] is rebuilt once so it fits the smaller window. Growth never triggers a rebuild.
  • The logged reason is specific. Instead of a plain render_config, the log shows render_config:budget(old→new) for a settings change, render_config:budget_shrink(old→new) for a smaller window, and render_config:mural(...) or render_config:memory_disabled for the other cases.
  • Upgrading doesn't rebuild m[0]. An m[0] built by an earlier version keeps being used and records the new identity at its next rebuild. This applies on OpenCode and Pi.

Reading long sessions (#576, @dhaern)

  • Session history is read in linear time. Magic Context read OpenCode's message history in pages that each skipped the rows before them with OFFSET, and SQLite evaluated the summary filter on every skipped row, so reading a whole session grew quadratically with its length. Each page now continues from the last row of the page before. On a 50,000-message synthetic session, a full read went from 2.5 s to 90 ms. These reads can run on an ordinary turn, during the historian trigger check, so long sessions spend less time before each request. OpenCode 2's message reader and Pi's primer reader had the same pattern and are fixed too.

gpt-6 Sol models (#577, @chrisolszewski)

  • Sol models are no longer sized as unknown. gpt-6-sol and gpt-6.1-sol had no tokenizer calibration entry, so Magic Context doubled its size estimate for them as it does for any unmeasured model, and refused historian prompts that fit. Both now have entries, copied from gpt-6-astra: Sol matched Astra and gpt-5.5 on the measured system and tools counts, and its prose ratio is not measured yet. A running session picks up the new values at its next cache rebuild, never mid-cache. In Rust transform mode the change arrives with the next ck-mc update.

A user's answer to a question is never dropped automatically (#581, @dhaern)

  • Answers stay in the prompt under pressure. When OpenCode's question tool (or Pi's and Oh My Pi's ask tools) returns your answer, that result is no longer removed by any automatic reclaim: emergency drops, age reclaim, supersession, duplicate removal or heuristic cleanup. Emergency drops could replace a just-given answer with a placeholder once it left the recent window, so the model lost the decision. The answer is recognised from the tool result itself (metadata.answers on OpenCode). It still leaves the prompt when the agent reduces it with ctx_reduce or the historian summarises it. Answers dropped before the upgrade stay dropped, so no cached prompt changes. In Rust transform mode, the protection needs the next ck-mc update.

Long search queries with an OpenAI-compatible embedder (#583, @dhaern)

  • Search queries fit the embedding model. The openai-compatible embedding provider sent search queries at full length. Auto-search embeds the user's prompt, so a long prompt went over the embedding model's own window, the request failed, and that turn lost the vector half of its search. Queries are now cut to max_input_tokens before sending, prefix included, keeping the start of the prompt. Document chunks, which are already sized to fit, go out unchanged.

Dreamer

  • Work done before the token budget runs out is kept. When a map-memories or verify run reaches its token budget, Magic Context asks the model to report only what it has already checked. That partial answer was then rejected because it covered fewer than half the batch, so the run's work was thrown away and the next run repeated the same batch. Now, after the budget ends a run, the valid part of the answer is saved and the memories it didn't reach go into the next run. A run that didn't hit the budget and still covers fewer than half the batch is rejected as before.

Other

  • Test, lint and end-to-end harness fixes.

Credits

Thanks to @devsiac (#573, #574), @Sugaroverdose (#572), @dhaern (#576, #581, #583) and @chrisolszewski (#577) for the reports.