Skip to content

Commit 2395aa2

Browse files
Ufuk Altinokalfonso-magic-context
andcommitted
docs: rewrite v0.27.0 release notes + align announcement bullets
Cover the full release (135 commits since v0.26.0), not just Dreamer V2: Primers, self-checking smart notes, embedding coexistence, the CortexKit config move, workspaces selective sharing, and the hardening pass. Reframe smart notes around the real change (reusable deterministic check vs per-cycle LLM eval), call out the across-the-board dreamer token-efficiency win, and credit community contributors @kecsap (#92) and @tracycam (#143). Co-authored-by: Alfonso [Magic Context] <288211368+alfonso-magic-context@users.noreply.github.com>
1 parent 57d93eb commit 2395aa2

2 files changed

Lines changed: 64 additions & 20 deletions

File tree

.alfonso/release-notes/v0.27.0.md

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
# v0.27.0Dreamer V2
1+
# v0.27.0: Dreamer V2, Primers, and the CortexKit config move
22

3-
The background **dreamer** — the agent that maintains your project memory while you're away — gets a full overhaul. It's now a set of independently-scheduled tasks instead of one monolithic run, with two new capabilities.
3+
The biggest release since the V2 historian. The background **dreamer** is rebuilt into independently-scheduled tasks, two new memory capabilities ship (**Primers** and **friction-learning**), embedding storage stops throwing away your vectors on a config change, and configuration moves to a shared CortexKit location. Plus a deep correctness, security, and cross-harness hardening pass.
44

55
## Dreamer V2: per-task scheduling
66

7-
Each maintenance task runs on its **own cron schedule** with its **own model**. Configure them in the setup wizard, the dashboard, or `magic-context.jsonc`:
7+
The dreamer is no longer one monolithic nightly run. Each maintenance task has its **own cron schedule** and its **own model**, configurable in the setup wizard, the dashboard, or `magic-context.jsonc`:
88

99
```jsonc
1010
"dreamer": {
@@ -18,27 +18,70 @@ Each maintenance task runs on its **own cron schedule** with its **own model**.
1818
}
1919
```
2020

21-
A lightweight model handles the routine tasks; you can point a stronger one at just the task that needs it. Set a schedule to `""` to turn a task off. Every dreamer task is **cache-safe by design** it never busts your prompt cache, no matter when it runs.
21+
Point a lightweight model at the routine tasks and a stronger one at just the task that needs it. Set a schedule to `""` to turn a task off. Every dreamer task is **cache-safe by design**: it never busts your prompt cache, no matter when it runs.
2222

23-
## New: memory importance scoring (`classify`)
23+
Each task now also runs with a **dedicated prompt and a least-privilege toolset**, so a memory-classification pass can't read files and a docs pass can't touch memory.
2424

25-
The `classify` task scores each memory's **importance** by blending how durable the fact is with what your project is actively working on. When the injected memory block is over budget, the most relevant memories stay in context and the least relevant drop first (they remain fully searchable via `ctx_search`). Runs in the background, completely cache-neutral.
25+
## New: memory importance scoring (`classify-memories`)
26+
27+
Scores each memory's **importance** by blending how durable the fact is with what your project is actively working on, plus its scope and whether it is safe to share with teammates. When the injected memory block is over budget, the most relevant memories stay in context and the least relevant drop first (they remain fully searchable via `ctx_search`). Runs in the background, completely cache-neutral.
2628

2729
## New: learning from friction (`retrospective`)
2830

29-
The `retrospective` task learns from the moments you had to **correct or re-explain** something, and records the durable lesson as a project memory — so the same friction doesn't recur. It's cheap by default: it only does real work when it detects a genuine correction pattern, and it reads **only your own typed messages** (never tool output or other content), with the learning distilled to a third-person rule rather than your raw words. On by default; turn it off anytime.
31+
Learns from the moments you had to **correct or re-explain** something and records the durable lesson as a project memory, so the same friction does not recur. It is cheap by default: it only does real work when a cheap pass detects a genuine correction pattern, and it reads **only your own typed messages** (never tool output or other content), with the learning distilled into a third-person rule rather than your raw words. On by default; turn it off anytime.
32+
33+
## New: Primers
34+
35+
**Primers** are durable, standing answers to the questions that keep coming up about how your project works ("how does the transform pipeline stay cache-stable?", "where does session state live?"). The historian notices when the same question recurs across days and promotes it to a Primer; the dreamer then keeps the answer current by **investigating the actual code** (an open-book read of the relevant files), not by re-summarizing what is already in context. Stale Primers sink out of the render budget over time but stay in the database.
36+
37+
## Smart notes that check their own condition, cheaply
38+
39+
A smart note (`ctx_note` with a `surface_condition`) resurfaces when its condition becomes true. Until now the dreamer re-checked that condition by asking an LLM **every single time** it ran, all the way up until the condition was finally met. For something like "resurface when PR #42 is merged," that meant paying for a full model call on every check, possibly for days.
40+
41+
Now, for a deterministic condition like a GitHub PR being merged, a release tag being published, or a file appearing on disk, the dreamer writes a small **reusable check once** and then simply runs that script on each cycle. The repeated, open-ended LLM evaluation becomes a cheap, deterministic run that verifies the real-world signal (PR state, release tag, file contents) and surfaces the note at the right moment. The script runs in a locked-down WASM sandbox with a read-only, SSRF-guarded capability API, so a note's condition can safely reach out to check the world without ever touching anything it should not.
42+
43+
## Memory maintenance, split so neither task starves
44+
45+
The old combined memory task is now focused tasks:
46+
- **verify** checks memories against their backing files and fixes or removes stale ones, but only when those files actually changed (a one-time **map-memories** backfill records which files back which memory).
47+
- **verify-broad** periodically re-checks the whole pool to catch drift.
48+
- **curate** deduplicates, tightens, and prunes. Cross-category merges are now structurally rejected: a memory has exactly one category.
49+
50+
Beyond the split, every dreamer task was re-tooled to do more with less. Each task now gets a focused prompt and only the tools it needs, and the heaviest passes (classify, verify) were reworked to emit a single structured result instead of grinding through many small tool calls. The result is **noticeably fewer tokens per run for better, more consistent output**, which matters most if you point the dreamer at a paid model.
51+
52+
## Embedding storage no longer wipes your vectors on a config change
53+
54+
Previously, changing your embedding model or endpoint could trigger a full, destructive re-embed of every memory, commit, and history chunk. Now vectors for different models **coexist** in storage, keyed per model. Switching providers (or testing one) keeps your existing vectors intact; the old set is garbage-collected lazily and only once a trusted new config has registered. A degraded or mid-migration config never drives deletion. Also adds a guard that refuses vectors when an endpoint silently serves a **different** model than requested (wrong-dimension corruption), and supports asymmetric query/passage `input_type`.
55+
56+
## Configuration moves to a shared CortexKit location
57+
58+
Magic Context configuration now lives in one shared place per machine instead of per-harness:
59+
- User config: `~/.config/cortexkit/magic-context.jsonc`
60+
- Project config: `<project>/.cortexkit/magic-context.jsonc`
61+
62+
**This is automatic.** On first run after upgrading, your existing `magic-context.jsonc` (from the OpenCode or Pi location) is moved to the new path, and the old file is renamed to `*.MOVED_READPLEASE` with a short note inside so nothing is silently left behind. If the migrator finds two legacy files that disagree, it refuses to merge them and asks you to consolidate (it never clobbers your settings). Project-local runtime artifacts (historian error dumps) move under `<project>/.cortexkit/magic-context/`, and a scoped `.gitignore` keeps them out of your repo.
63+
64+
## Workspaces: selective memory sharing
65+
66+
Workspace members can now share memory **by category** rather than all-or-nothing. Toggle which of the five categories cross into sibling projects (defaults to sharing only `CONSTRAINTS`), so global truths travel while project-local controls stay private.
67+
68+
## Reliability and hardening
69+
70+
- **Plugin-load resilience.** The plugin entry is hardened against an OpenCode Desktop multi-instance boot-order issue that could leave the transform disabled and balloon a session's context. A failure registering hidden agents can no longer take down the whole plugin.
71+
- **`/ctx-*` commands no longer leak an error** into the TUI or log on OpenCode 1.17.x. The handled-command signal is now a clean 204 response.
72+
- **Resilient dreamer leases.** Transient database contention during a long task no longer aborts it as a permanent failure, and a genuine multi-minute stall is detected correctly instead of risking a split-brain run.
73+
- A multi-wave correctness and security review across storage permissions, config recovery, the embedding pipeline, the dashboard backend, SSRF guards, and migration safety. Storage directories are tightened to `0700`/`0600`.
74+
- `toast_duration_ms: 0` now disables Magic Context toasts entirely.
75+
76+
## Thanks to our contributors
3077

31-
## Memory maintenance split: `verify` + `curate`
78+
This release includes community contributions from:
3279

33-
The old combined memory task is now two focused tasks so neither starves the other:
34-
- **verify** checks memories against their backing files and fixes or removes stale ones (only when those files actually changed).
35-
- **curate** deduplicates, tightens, and prunes the whole pool. Cross-category merges are now structurally rejected — a memory has exactly one category.
80+
- **@kecsap**: a configurable toast duration, including `toast_duration_ms: 0` to turn Magic Context toasts off entirely (#92).
81+
- **@tracycam**: security hardening, including tighter storage-directory permissions, SQLite `ATTACH` path escaping, and project-config privilege fixes (#143).
3682

37-
## Also in this release
83+
Thanks also to everyone who filed detailed bug reports, and to Dependabot for the dependency bumps (#170, #171).
3884

39-
- Per-task model/fallback configuration across both OpenCode and Pi.
40-
- Setup wizard, dashboard config editor, and docs updated for the new task model.
41-
- Numerous correctness, security, and parity fixes from a multi-wave hardening pass (storage permissions, config recovery, dashboard backend, embedding model matching, compaction-marker boundaries).
42-
- Plugin-load resilience: the entry is hardened against an OpenCode Desktop multi-instance boot-order issue that could disable the transform.
85+
## Upgrading
4386

44-
Upgrading is automatic — your existing dreamer config is migrated to the new per-task schema in place.
87+
Upgrading is automatic. Your dreamer config is migrated to the new per-task schema in place, your configuration file is moved to the CortexKit location, and the database migrates to schema v49 on first load. No manual steps.

packages/plugin/src/shared/announcement.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ export const ANNOUNCEMENT_VERSION = "0.27.0";
3232
*/
3333
export const ANNOUNCEMENT_FEATURES: ReadonlyArray<string> = [
3434
"Dreamer V2: each maintenance task now runs on its own schedule (cron), with its own model. Configure them in setup, the dashboard, or magic-context.jsonc.",
35-
"New 'classify' task: scores each memory's importance so the most relevant ones stay in context as your work shifts — fully cache-safe, runs in the background.",
36-
"New 'retrospective' task: learns from the moments you had to correct or re-explain and records the durable lesson. Reads only your own typed messages; on by default, turn it off anytime.",
37-
"Memory hygiene split into 'verify' (checks memories against code) and 'curate' (deduplicates and prunes the pool) so neither starves the other.",
35+
"New 'classify' task scores each memory's importance so the most relevant stay in context as your work shifts; new 'retrospective' learns from moments you had to correct or re-explain. Both cache-safe, on by default, off anytime.",
36+
"New Primers: durable answers to the questions that keep coming up about your project, kept current by the dreamer investigating the actual code.",
37+
"Embedding storage no longer wipes your vectors when you change model or endpoint. Different models now coexist, so switching providers keeps your existing vectors.",
38+
"Config moved to a shared CortexKit location (~/.config/cortexkit/ and <project>/.cortexkit/). This happens automatically on first run; your old file is preserved.",
3839
];
3940

4041
/**

0 commit comments

Comments
 (0)