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 durable delete window (single-node), beside the inline form:
- sweep_window branches on the delete window's host — the kv-engine
enum (KvEngine::Sqlite -> durable; KvEngine::Mem -> inline body,
extracted verbatim so the wave-2 mem/local suites stay green
unchanged)
- the durable form, per sweep under the lease and after the shared
protect consult: window_take(now) executes the overdue set with
execution-time re-arbitration through the same arbitrated_delete
path (consult_protect = false — the sweep's protect consult covers
its execution phase; vanished candidates settle into the cancelled
count), then marks unchanged, then stages the candidate-dead set at
visible_after = mark_end + window (the constructor-tunable delay;
ZERO = execute-on-next-sweep)
- report counts exact relative to the schedule (staged-this-sweep vs
executed-this-sweep); aborts execute nothing, stage nothing, delete
nothing
- unit tests: two-sweep exact-count shapes at delay 0, future-delay
staging with idempotent re-stage, the race across the delay (put
during the window survives; the unpinned twin deletes), the
vanished-candidate form, and the three abort shapes on sqlite
Verification: cargo test (default 69 lib tests), --all-features (124),
--no-default-features --features mem (101), clippy -D warnings
(default and --all-features), cargo fmt --check — all 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