diff --git a/RELEASES.md b/RELEASES.md index 9368a864..5f957292 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -10,6 +10,39 @@ Full auto-generated changelog: `CHANGELOG.md` · Releases: https://github.com/so --- +## v8.2.0 — 2026-07-10 (temporal VFS — file content joins the immutability model) + +Time travel now covers Virtual Filesystem **content**. Previously the temporal model had a hole +exactly where files were concerned: every entity write was an immutable generation, but the +content *bytes* lived under an eager reference-count GC — deleting a file could physically destroy +bytes that in-window history still referenced, while overwriting never released the old content at +all (an unbounded silent leak that only *accidentally* preserved history). A production consumer's +recovery from a bad deploy succeeded only because a stale field happened to hold the good value — +luck, not a guarantee. Both directions are now fixed by making blob reclamation a **history** +decision instead of a **liveness** decision: + +- **Content blobs are retention-protected.** Each blob tracks live references AND history + references (one per persisted generation record that carries its hash). Deleting/overwriting a + file drops only the live reference; bytes are physically reclaimed in exactly one place — + history compaction — once no live reference and no retained generation references the hash. + Pinned views are exempt automatically (compaction already respects pins). Crash ordering is + over-count-only (never under-count), so a crash can leak until the built-in scrub recounts, but + can never reclaim bytes history still needs. Existing stores get a one-time, marker-gated + backfill on open; cross-file content dedup is handled exactly. +- **`vfs.readFile(path, { asOf })`** — the file's exact bytes as of a generation or `Date`, + guaranteed present within the retention window. +- **`vfs.history(path)`** — the file's versions (`{ generation, timestamp, hash, size, + mimeType? }`, ascending). Restore = read the old bytes `asOf` and write them back (a new write; + history is never rewritten). +- **Overwrites now refresh the file entity's `data`/embedding text** — previously semantic search + and the `data` field served the FIRST version's text forever. + +Lifecycle note: deleting a file no longer frees its bytes immediately — old content lives until +compaction reclaims its generations, under the same `retention` budget as all Model-B history +(`retention: 'all'` keeps every version forever). Guide: the new "Time travel for files" section in +`docs/guides/snapshots-and-time-travel.md`. Native accelerator: unaffected (canonical write path +only) — no version pairing required. + ## v8.1.0 — 2026-07-10 (`brain.onChange` — the in-process change feed) New public API: subscribe to every committed mutation with