Changes the v3 blob-store format for new plane files to split payload data from liveness tracking, so reusing an existing row no longer rewrites its payload record when only the reference epoch changes. Existing layout-1 files keep their schema and remain readable and writable without conversion; only newly created v3 plane files use the new rowid layout tag 2.
Payload and digest columns are immutable in both layouts; touches update only the liveness row.
Adds v3_format_report for read-only validation of v3 files without creating a store, acquiring locks, or changing the schema.
Reuse touches in the new layout reserve a fixed 64 KiB instead of scaling with payload length.
Adds a storage-only performance gate (which now creates its scratch directory) comparing rowid-layout lookups against the shared-record layout; captured baselines show a ~40x median speedup on multi-MiB payloads.
Canonicalizes the v3 statement-tracer filter path so stores opened through a symlinked directory are still traced; opens never migrate either layout.
Confidence Score: 5/5
The PR appears safe to merge; no new blocking issues were found.
Summary
The PR separates payload bytes from liveness rows in new v3 stores while keeping layout-1 files readable and writable.
New v3 blob stores keep payloads separate from liveness.
Callers can get a read-only report of a v3 store's format.
The storage gate compares both v3 layouts with a pinned lookup workload.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[Open plane file] --> B{Layout tag}
B -->|1| C[Payload and liveness share a row]
B -->|2| D[Payload and liveness use separate rows]
C --> E[Touch updates the payload row]
D --> F[Touch updates only the liveness row]