review-wave-6 — the wave-6 gate passes, engine-mem.md flipped to stable

The born-pinned gate audited the mem engine against the contract and
ADR-024: the conformance read clean in mechanism substance (queue
state machine, scheduler collapse, outbox, streams, locks, clock,
validation, tx overlay, wake substrate — incl. a full guard-order and
panic-hygiene audit); the suite's third column read row-by-row and
25/25 green under the per-test current-thread flavor (24 engine-shared
rows + mem's payload_too_large non-occurrence arm + the factory-shape
test); three-way arithmetic equivalence green on all columns; the
wasm32 acceptance items verified (compile-clean, tokio sync+time,
no blocking, flavor enforced); the rider's two arms verified (Finding
1 discharged; Findings 2-3 stay parked for wave 7); workspace gates,
taskgraph validate green.

Three edge-domain fixes landed inline: the stream cursor read's
i64::MAX overflow (Bound::Excluded), trim_to's i64::MAX horizon
endpoint (Bound::Included), and the scheduler register path now
rejecting a parseable interval whose first boundary overflows with
InvalidSpec — the one engine-vs-engine divergence the read found,
aligned into the class-1 window — plus a pinning test and scaffold-
residue doc/comment cleanups (clock allows, tx per-stream wake
comment, wakes/stream module docs). Recorded findings with
dispositions in the task's Notes for the wave-7 pre-release pass:
the multi-thread publish-to-wake ordering tolerance, the heartbeat/
save_offset/EventReceiver-try_recv ADR-023 §2 classification gaps,
and the mem arithmetic being a suite-pinned transplant.

Verified: cargo build; cargo test --workspace green (mem 101 lib +
25 suite, sqlite 191+25, pg 124+25+9 server-less, core 25, harness 3);
clippy --all-targets -D warnings clean; fmt clean; taskgraph validate
(61 tasks). Gate record: tasks/review-wave-6.md (Notes + Summary),
implementation.md wave-6 row + review-rounds entry.
This commit is contained in:
glm-5.3-flash committed 2026-10-10 13:17:18 +00:00
1 parent 76c06e42a9
commit 7e8bfde12d
8 files changed
+282 -37

No files matched your search

+11 -6
View File
@@ -3,9 +3,11 @@
//! FIFO by monotone offset; keyed publish rides the overlay).
//!
//! - Publishes append to the per-stream log under its section guard:
//! engine-assigned offsets (the engine-wide allocator — pg-bigserial
//! shaped, monotone, immutable, never renumbered; a fresh stream's
//! first event does not carry offset 1, the ADR-015 §4 note), keys
//! engine-assigned offsets (the engine-wide allocator — monotone,
//! immutable, never renumbered; the concrete numbering is engine-
//! internal and never compared cross-engine — ADR-015 §4: mem's
//! fresh-engine count starts at 1, the SQL engines' counters may
//! not), keys
//! are carried metadata (a present key must be non-empty —
//! `InvalidName`, ADR-015 §1), and the commit boundary fires one
//! wake per event on the stream's engine-internal wake channel.
@@ -30,6 +32,7 @@
//! (ADR-021 §5).
use std::collections::VecDeque;
use std::ops::Bound;
use std::sync::Arc;
use serde_json::Value;
@@ -72,7 +75,7 @@ pub(crate) fn read_events(s: &StreamState, stream: &str, from: i64, limit: i64)
s.logs
.get(stream)
.map(|log| {
log.range((from + 1)..)
log.range((Bound::Excluded(from), Bound::Unbounded))
.take(limit.max(0) as usize)
.map(|(_, row)| row.clone())
.collect()
@@ -107,8 +110,10 @@ pub(crate) fn trim_events(s: &mut StreamState, stream: &str, horizon: i64) -> i6
let Some(log) = s.logs.get_mut(stream) else {
return 0;
};
let horizon_next = horizon.saturating_add(1);
let removed: Vec<i64> = log.range(..horizon_next).map(|(k, _)| *k).collect();
let removed: Vec<i64> = log
.range((Bound::Unbounded, Bound::Included(horizon)))
.map(|(k, _)| *k)
.collect();
let count = removed.len();
for offset in removed {
log.remove(&offset);