Files
alkblobs/tasks/review-wave-3.md
T
glm-5.3-flash 758ccfb359 docs(tasks): decompose wave 3 — the sqlite kv engine, the durable delete window, the first SQL-backed column
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
2026-10-11 23:48:23 +00:00

96 lines
4.1 KiB
Markdown

---
id: review-wave-3
name: Wave 3 review gate — the sqlite engine vs the contract
status: pending
depends_on: [suite-column-sqlite]
scope: narrow
risk: low
impact: phase
level: review
tags: [wave-3, review]
---
## Description
The wave-3 review gate — the engine-wave review shape
(docs/plans/implementation.md §Review gates: "engine-vs-contract
conformance"), before wave 4 decomposes. The gate reads the
implementation against the pinned ADR text line by line (the wave-1/2
gates' method).
Gate checks:
- **Engine-vs-contract conformance**: the suite column green
server-less; the engine-state window family contract-tested per its
applicability row (ADR-012 §5's table — window family yes, pin
clauses no, sweep-lock body no); virgin-store semantics including
the no-tables-yet form; the `size` metadata-only discipline (the
indexed column probe never loads the value blob).
- **The sqlite posture vs ADR-003/007**: WAL + `synchronous=NORMAL`
as the shipped durability tier; the single-writer ceiling documented
as posture, not hedged (REQ-1's economics); prepared-statement
discipline; `has` as an EXISTS probe; the B5 row shape (key/value/
size); bounded reads.
- **The durable-window sweep vs ADR-008 §2 / ADR-012 §5/§6.7**:
candidates staged at `visible_after = mark_end + window` (the
constructor-tunable delay, shipped default 5 min); the executor is
the next sweep; execution-time re-arbitration; report counts exact
relative to the schedule; the inline form preserved verbatim for
non-SQL engines; the single-node posture unchanged (pins/liveness/
arbitration lock in-process — only the window's persistence is
engine rows); the one-window-host posture recorded.
- **The seam reduction honored**: no pin rows, no sweep-lock body
anywhere in the sqlite engine (dead machinery per ADR-012 §5);
`ensure_gc_schema` creates `gc_window` only; the embedder's
liveness table never created by the engine.
- **Blocking discipline**: all rusqlite work off the async path
(`spawn_blocking`); no blocking I/O under internal locks; the
connection posture recorded.
- **Named design points audited as resolved** (each recorded in its
task's Notes): the connection posture; the timestamp encoding;
schema-creation timing vs the no-tables-yet tolerance; the kv cursor
dispatch shape over multiple kv engines; the protect-consult posture
on overdue execution; the delay-0 test tuning's legality.
- **Family conventions**: no comments in code (doc comments on public
API fine), thiserror, tokio-only async, no unwrap/expect outside
tests, naming, one-module-per-file re-export shape, the
`#![allow(dead_code)]` scope notes matching their remaining scope.
- **Gates green**: `cargo test` (default — the sqlite column runs
here), `cargo test --features mem`, `cargo test --all-features`,
`cargo clippy --all-targets -- -D warnings`,
`cargo clippy --all-features --all-targets -- -D warnings`,
`cargo fmt --check`.
Findings are fixed inline where cheap, or recorded as wave-4
amendments where they shape the next decomposition. The gate's
completion is what unblocks wave 4's decomposition.
## Acceptance Criteria
- [ ] Every gate check above read and verified against the cited ADR
text (not from memory of it)
- [ ] Named design points each decided, recorded, and consistent with
the specs
- [ ] Findings fixed inline or recorded as wave-4 amendments with
owners
- [ ] All gates re-run green after any fixes
- [ ] Wave 4 decomposition unblocked (recorded in this task's Summary)
## References
- docs/plans/implementation.md (§Wave 3, §Review gates — engine wave reviews)
- docs/architecture/decisions/003-backend-contract-and-dispatch.md
- docs/architecture/decisions/007-two-kv-engines-sqlite-and-postgres.md
- docs/architecture/decisions/008-trait-size-probe-fleet-gc-and-large-engines.md §2
- docs/architecture/decisions/010-backend-io-seams-and-fleet-state.md §2
- docs/architecture/decisions/012-pre-decomposition-consistency-rulings.md §1/§5/§6.7
- docs/architecture/store-api.md
- tasks/review-wave-2.md (the gate method)
## Notes
> To be filled by the review agent
## Summary
> To be filled on completion