The cutover: new tail segments write format v2 (per-record [type, version, cipherFlag, keyId] envelope; noun/verb after-images carry dense ints MINTED AT APPEND from the id mapper — a rebuilt mapper reproduces assignments exactly; log.genesis opens every new log with the id-space width + a minted brain id; sync() seals to the header-declared sector boundary with reader-invisible pad frames). Existing v1 segments are never rewritten — per-segment decoder dispatch reads both formats and v2 facts map to the exact CommitFact shape all consumers already read. Cutover on a live v1 log: an empty v1 tail re-heads in place; a non-empty one is sealed by rotation, byte-identical. Records reserve the encryption fields (cipherFlag 0 / keyId nil are the only legal values; anything else refuses typed naming the needed newer reader) — crypto-ready with no future bump on the compat surface. Empty-records facts are legal (an all-deduped batch is a real generation — v1 semantics preserved; the refusal there tore a column-store flush mid-commit in the full suite, the consistency guard caught it loudly, and the root is fixed). Golden byte vectors pinned for the second (native) reader implementation. Pins: cutover 5/5 · codec 54 · kill-matrix stays 11/11. |
||
|---|---|---|
| .. | ||
| bounded-chains.test.ts | ||
| db-portable-graph.test.ts | ||
| fact-log-group-sync.test.ts | ||
| fact-log.test.ts | ||
| factLogFormat.test.ts | ||
| fault-injection-shim.test.ts | ||
| fieldAddressing.test.ts | ||
| generation-chain.test.ts | ||
| generation-segments.test.ts | ||
| generationStore.test.ts | ||
| pending-flush-durability.test.ts | ||
| stableEqual.test.ts | ||
| whereMatcher.test.ts | ||