Freezes the Wave A interfaces, frame format, durability ordering, and crash/fault fixtures per doc/phase1-storage-spine-scope.md section 5. Wave B may now start against these. D0 lands crates/levcs-store: the sealed public API, the file-ownership split, the single durability syscall funnel with its counters and fault hooks, the 17-entry failpoint registry in compiler-enforced correspondence with oracle::AppendFailpoint, and the journal-level drive seam. Wave A lands the frame codec and journal/segment lifecycle (A1), the recovery index and checkpoints (A2), and the durable-ingest benchmark and crash harness (A3). The adversarial review found five defects behind a green gate, three of them blockers, all closed here. Two were the same shape: drive::reopen_through_ recovery had reimplemented a simplified recovery and called none of recovery.rs -- so it adopted segment footer sequences without validating frame bytes, journal_id, or root_uuid, and it double-adopted interrupted seals. The seam between two packages was untested precisely because each package's own tests passed. reopen_through_recovery now delegates rather than decides, and DriveRecovery carries the recovery report verbatim so tests assert the disposition and not merely its effect: a double adoption and a correct replay produce the same adopted set, which is how the defect stayed invisible. Also closed: store-bench now schema-validates its own emitted artifact with a five-mutation negative control instead of matching JSON substrings; the ACK reconciler distinguishes duplicates and regressions from forward gaps; checkpoint writes and a journal truncation are routed through the durability funnel, whose guard now covers writes and truncations rather than only sync, rename, and unlink. bench/result-schema.json is amended (contract review 2026-07-24-B, second and third amendments): per-gate latency ceilings conditional on outcome so a failed run is representable, and the verification claims split per gate so a storage run cannot certify an object graph it never touches. Not-applicable claims are forbidden rather than falsified; applicable-but-not-performed report false. Every relaxation is re-pinned in the else branch and asserted member by member, after an edit in this series silently un-pinned all eleven validation flags and was caught only by revalidating against constructed bundles. Arming the fault registry now requires a FaultSerial token, so the invariant is a compile error rather than a comment. The file where this was diagnosed carried a header saying it was deliberately the only test in it, and a second test had been added under that comment anyway -- an 8-in-40 failure rate that read as flakiness. Evidence at this commit: check-phase1.sh GATE_EXIT=0 across all four feature configurations, 124 test binaries, zero failures; verify-store-recovery.sh --cycles 100 with recovery_failures=0, acknowledged_loss=0, torn_transactions=0, repeated_adoptions=0, bundle=schema-valid; recovery_eio 40/40 at four test threads; golden corpus byte-stable; fmt clean. Carry-forwards, explicitly not Wave A blockers and recorded in scope section 5: extend the crash matrix to generate sealed-frame corruption and cross-shard journal movement, since it structurally cannot express the class the first blocker belonged to; and wire GroupBuilder through B1's production path, since deliverable 4-A1.2 is presently asserted only over a type nothing calls. Charter item 9 -- ask every package what of its work is correct but uncalled -- is accepted for every subsequent wave. It, not the review, found the class. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QNy4Ve7mogg4X1ezJTnFxG |
||
|---|---|---|
| .. | ||
| group_model.rs | ||
| harness.rs | ||
| mod.rs | ||