docs: RELEASES.md entry for 8.2.2 (transaction timeout rollback)

This commit is contained in:
David Snelling 2026-07-11 13:44:15 -07:00
parent 508a8e363e
commit ed97006eb9

View file

@ -10,6 +10,32 @@ Full auto-generated changelog: `CHANGELOG.md` · Releases: https://github.com/so
--- ---
## v8.2.2 — 2026-07-11 (P0: a timed-out transaction now rolls back — no torn state)
Data-integrity fix. A transaction that exceeded its time budget **mid-flight** (e.g. a bulk
`transact()` on slower hardware crossing the 30s ceiling) threw a timeout error WITHOUT rolling
back the operations it had already applied. The budget check sat outside the per-operation
rollback path, so only per-operation *failures* rolled back — a timeout stranded the partial
writes in canonical storage while the generation was never stamped, leaving torn, generation-less
state. This was caught by a downstream migration that crossed the ceiling on a large batch.
`Transaction.execute()` now has a **single rollback point**: any error that escapes the operation
loop — an operation failure OR a mid-flight timeout — rolls back every applied operation in
reverse order, then surfaces the original error (a rollback failure supersedes it, loudly, as
before). This restores the invariant the generation-store commit path already depended on: a throw
from execute means the applied operations were undone byte-identically, and the aborted
transaction leaves `generation()` unchanged and storage byte-identical to its pre-transaction
state.
No API change. Regression pins the reported requirement — after a mid-flight timeout,
storage is byte-identical and the transaction ends in the `rolled_back` terminal state
(`tests/unit/transaction/timeout-rollback.test.ts`), plus the operation-failure and
rollback-failure paths through the same single rollback point.
**Note on the 30s ceiling itself** (configurable/scaled timeout, batched embedding precompute,
timeout telemetry) — that ergonomics work is tracked separately; this release fixes only the
correctness bug (a timeout must never leave partial state), independent of where the ceiling sits.
## v8.2.1 — 2026-07-11 (transact forward references work on the native accelerator) ## v8.2.1 — 2026-07-11 (transact forward references work on the native accelerator)
Parity fix. `transact()` has always promised atomic forward references — `add` an entity and Parity fix. `transact()` has always promised atomic forward references — `add` an entity and