Reviewed the wave-3 commits (engine-sqlite, engine-sqlite-window,
store-sqlite-construction, store-sweep-durable-window,
suite-column-sqlite) against the cited ADR/spec text line by line:
ADR-003/007/008 §2, ADR-010 §2, ADR-012 §1/§5/§6.7, store-api.md,
implementation.md §Review gates — the engine-vs-contract conformance
(suite column green server-less in the default build; the window
family contract-tested per its applicability row; virgin-store
semantics incl. the no-tables-yet form; the size metadata-only
discipline proven index-riding), the durability posture (WAL +
synchronous=NORMAL verified at open; the single-writer ceiling posture,
not hedge), the durable sweep form vs ADR-008 §2/ADR-012 §6.7 (stage at
mark_end + window; next-sweep execution with raced execution-time
re-arbitration; schedule-relative exact counts; aborts stage and
execute nothing), the seam reduction (gc_window only; no pin rows, no
sweep-lock body, no EngineFleetState), and the blocking discipline
(all rusqlite in spawn_blocking). Named design points audited as
resolved; family conventions clean; no wave-4 amendments arise.
Inline fixes (review-of-record):
- src/gc.rs: the seam's window_stage doc retired the wave-1
lazy-create hedge for the shipped constructor-at-open posture
(a tableless database surfaces the engine error on stage;
per-engine tolerances are each engine's recorded posture)
- tasks/engine-sqlite-window, store-sweep-durable-window,
suite-column-sqlite: stray placeholder lines above the filled
Notes/Summary removed (the wave-2 gate's same cleanup)
- tests/conformance/README.md: trailing newline added
Verification (all re-run green after the fixes):
- cargo test (default): 69 lib + 19 conformance + 3 git-interop
- cargo test --features mem / --all-features: 124 lib + 54
conformance + 4 git-interop each
- cargo clippy --all-targets -- -D warnings (default + all-features)
- cargo fmt --check
- cargo doc --no-deps at the pre-existing warning baseline (26)
Wave 4 (postgres) decomposition is unblocked.
- The first SQL-backed column: the default-build production shape
(kv = sqlite + large = local, feature sqlite default-on) runs the
form-independent reference rows verbatim (INV-1, INV-6, the
NoLivenessSources/ProtectFailed abort shapes, the kv-only rejection
row against kv-only(sqlite)) and grows the durable-schedule sweep
rows — exact counts asserted relative to the staged schedule
(ADR-012 §6.7): two-sweep counts over the full protection set, the
race across the window delay (a re-put landing during the window
survives the executing sweep), the holder-stages-only lease shape,
INV-5 through durable-schedule outcomes, and the schedule-relative
INV-2/INV-3 readings
- Dispatch rows mirror the local column's family with the placement
oracle adapted by medium: the sqlite file's pool/window rows vs the
root's committed files; virgin-store reads as no-ops on a fresh file
(the no-tables-yet tolerance engine-instrumented, this row its
facade form)
- Factories: dual-tier sqlite+local and kv-only(sqlite), instance-
tracked temp sites (fresh sqlite file + private root per open;
idempotent panicking-row-safe teardown), the column-tuned threshold
and the test window-delay tuning (Duration::ZERO — execute-on-next-
sweep); the module is cfg(feature = "sqlite"), default-on — the
column runs in every default cargo test, server-less, never skips
- Shared fixtures moved to rows.rs (committed_file_count,
staging_file_count, slice_digest, LatchProtect pub(crate)) so the
columns share them without the mem gate
- README: the schedule-relative reading for SQL-backed columns
recorded (citing ADR-012 §6.7), the sqlite rows table inventory,
Current state (three columns)
Verification: cargo test (default) green — 69 lib + 19 conformance +
3 git-interop; cargo test --features mem green (124 lib + 54
conformance); cargo check --all-features --tests green; cargo clippy
--all-targets -- -D warnings green; cargo fmt --check green.
Six tasks against the wave-2 contract surface as reviewed (no
amendments from the gate):
- engine-sqlite: the default kv engine — WAL + synchronous=NORMAL,
prepared statements, the indexed size column probe (B5's row shape),
has-as-EXISTS, virgin-store no-tables-yet tolerance, spawn_blocking
discipline
- engine-sqlite-window: the engine-state seam's window family only
(ADR-012 §5's reduction — gc_window, stage/take; no pin rows, no
sweep-lock body)
- store-sqlite-construction: KvEngine::Sqlite slots in, the
dual-tier/kv-only constructors with the constructor-tunable window
delay (default 5 min), ensure_gc_schema at construction, the
one-window-host posture
- store-sweep-durable-window: the sweep's SQL-backed form — overdue
rows execute with re-arbitration before/alongside marking, candidates
stage at mark_end + window, counts exact relative to the schedule
(ADR-012 §6.7); the inline form preserved verbatim
- suite-column-sqlite: the first SQL-backed column, server-less —
form-independent reference rows mirror directly; the sweep rows are
schedule-relative (the recorded INV-4/5 mirror amendment)
- review-wave-3: the engine-wave gate (engine-vs-contract conformance)
Verification: dependency graph validated (all ids resolve, no cycles,
topological order clean); docs-only change.
Refs: docs/plans/implementation.md §Wave 3