|
| 1 | +# v0.31.4 |
| 2 | + |
| 3 | +Maintenance release: 14 fix batches from two internal audit waves plus one user-reported bug. |
| 4 | + |
| 5 | +## Fixed |
| 6 | + |
| 7 | +### Compaction not triggering after threshold (#218) |
| 8 | +A session whose previous turn ended with an interrupted or partially-aborted tool call could get stuck: every subsequent pass was classified as mid-turn, so the compaction threshold never fired and queued context reductions never applied. A newer real user message now ends the stale turn on both OpenCode and Pi. Additionally, `doctor --issue` reports no longer redact plain numeric settings like `execute_threshold_tokens` (redaction now applies only to string values under secret-like keys). |
| 9 | + |
| 10 | +### Workspace memory sharing |
| 11 | +Two security fixes: malformed workspace `share_categories` now fails closed to sharing nothing (instead of sharing everything), and primary agents can no longer update, archive, or merge another project's memories through shared categories — shared visibility is read-only; mutations require ownership. |
| 12 | + |
| 13 | +### Project config trust boundaries |
| 14 | +Project-level (`.cortexkit/magic-context.jsonc`) configs can no longer override `historian.model` / `historian.fallback_models` (a cloned repository could otherwise route background LLM work to a repo-chosen model on your credentials), and project-level execute thresholds now only apply when they delay compaction relative to your user config, never advance it. Dreamer task tuning and `memory.enabled` remain project-configurable. |
| 15 | + |
| 16 | +### Dreamer reliability |
| 17 | +Dreamer task manifests (verify / map-memories / classify) are now fail-closed: a truncated or malformed model response is rejected and retried instead of partially applied. Lease-guarded writes use immediate transactions so concurrent OpenCode and Pi processes cannot double-commit. Retrospective scanning no longer permanently skips older sessions on large backlogs, and file-change verification catches same-second commits. |
| 18 | + |
| 19 | +### Historian and wrapup coordination |
| 20 | +`/ctx-recomp` can no longer race a live `/ctx-wrapup` into concurrent compartment mutation. The boundary staleness fingerprint now hashes content (same-length edits are detected). Wrapup correctly treats a final chunk followed only by filtered noise as final, and waits at most 10 minutes for a busy compartment lease instead of indefinitely. |
| 21 | + |
| 22 | +### Cache stability |
| 23 | +Two-pass tool reclaim and smart-drops now ride a hard m[0] fold on defer passes (previously spilled to a second cache bust). Image stripping replays its frozen set on every pass, including sessions that never had a compaction watermark. Channel-2 nudge delivery uses per-claim tokens so concurrent processes cannot double-deliver, and synthetic todo state never anchors to an errored/aborted assistant message (which some providers drop from the wire, orphaning the tool pair). |
| 24 | + |
| 25 | +### Storage integrity |
| 26 | +Memory embeddings are skipped when content changed while the embedding request was in flight (stale-vector guard). The message search index recovers failed incremental writes even after later successes advanced its watermark. Cross-process duplicate memory writes are now idempotent. |
| 27 | + |
| 28 | +### Other fixes |
| 29 | +- TUI/RPC: WebSocket re-hello no longer leaks notification sinks (lost TUI actions), reconnects detect a restarted server, upgrades require token auth before accepting the socket, and per-session cursors stop cross-session notification pruning. |
| 30 | +- Pi todowrite: foreign-extension tool outputs are validated fail-closed before capture; overlay output capped. |
| 31 | +- Smart notes: network check lifecycle hardened (tarpit responses can no longer hold the sandbox lock past budget; terminal rejections no longer retry). |
| 32 | +- CLI doctor: honors `PI_CODING_AGENT_DIR` everywhere, atomic JSONL migration writes, issue-report body-limit postcondition. |
| 33 | +- Pi E2E parity: 8 cache-invariant scenarios and a Pi-native subagent isolation test ported from the OpenCode suite. |
0 commit comments