Contract-suite wake row (task suite-wake-rows): wake_receiver_shapes — the wake contract's pinnable core, tolerance-bounded to state outcomes (never delivery counts or latencies): a pre-attached listener receives a wake after a committed notify on its channel through all three recv forms (recv/try_recv/recv_timeout), every wake's channel field matching the listened channel (the one piece of semantic content a wake carries, ADR-008 §3); a three-notify burst floors at one wake — never an exact per-notify count (coalescing the documented engine asymmetry: SQLite's 1-slot feed vs pg per-notify, the row pins the floor not the shape); a listener attached after a commit never sees that commit's notify — recv_timeout idles a 400 ms absence window (a 300 ms pre-settle sleep closes SQLite's watcher baseline race: the last_version baseline is store-open-captured, so an unconsumed commit's version change would fire one late tick at the new subscriber indistinguishable from replay; pg's gap-commit no-replay hole and SQLite's burst coalescing both legal under the pin); and the channel-scoped leg — a foreign-channel notify never surfaces a wake naming it (SQLite's same-commit overtrigger may deliver but carries only the listened channel; the pg LISTEN fanout skips foreign channels; the reserved reconnect straggler tolerated), with a same-channel positive control proving the silence is scoping not a dead listener. The failure-surface close arms (SQLite watcher-death recv()->None, pg synthetic reconnect-wake) stay pinned engine-side and in receiver_close_and_save_arms's disposal leg — cross-referenced in the doc comment, not re-pinned. Stamped ADR-006 + ADR-008 §3. Wired into both engines' suite targets (SQLite tokio test, pg harness_row!), 24 rows per column up from 23. Dispositions in Notes: the backlog row stays in core-contract.md's inventory (flushes at review-wave-5's stable gate, like the other discharged rows), the absence windows are single recv_timeout calls (the documented Ok(None) idle arm as the bounded wait), and the scoping leg's observable is the channel field not absence (SQLite overtrigger makes an absence-only pin vacuous there). Verified: SQLite column green server-less, pg column green vs harness (postgres/poc@:15432), 3 solo re-runs of the row per engine (determinism), cargo test -p alkstore-sqlite -p alkstore-postgres green (SQLite 189+24, pg 121+24+9), workspace cargo test green (12 binaries), clippy -D warnings, fmt clean
This commit is contained in:
1 parent
98de4a49cd
commit
2a2ad7e11f
5 files changed
+302
-6
No files matched your search
@@ -172,7 +172,7 @@ mod rows {
|
||||
queue_depth_reclaim_and_dead_letter, receiver_close_and_save_arms,
|
||||
scheduler_boundary_fires, scheduler_bounded_catchup, scheduler_leadership_discipline,
|
||||
stream_ordering_equivalence, sweep_no_stranded_rows, trim_to_semantics,
|
||||
with_tx_panicking_closure_rolls_back,
|
||||
wake_receiver_shapes, with_tx_panicking_closure_rolls_back,
|
||||
};
|
||||
|
||||
use super::PgFactory;
|
||||
@@ -294,6 +294,11 @@ mod rows {
|
||||
"row-stream-ordering"
|
||||
);
|
||||
harness_row!(row_trim_to_semantics, trim_to_semantics, "row-trim-to");
|
||||
harness_row!(
|
||||
row_wake_receiver_shapes,
|
||||
wake_receiver_shapes,
|
||||
"row-wake-shapes"
|
||||
);
|
||||
harness_row!(
|
||||
row_with_tx_panicking_closure_rolls_back,
|
||||
with_tx_panicking_closure_rolls_back,
|
||||
|
||||
Reference in new issue
Block a user