release-flake-investigation: the fired lock-row trigger investigated and resolved — harness-model, fixed test-side
Instrumentation first: the tee-before-filter capture procedure of record (demonstrated to preserve failing messages, immediately vindicating itself — two natural repros captured verbatim), then the arithmetic read against lock.rs/resolution.rs (delay-only argument confirmed for the lapse legs, corrected for the contention leg: second-precision now_unix stamps let a ttl=1 holder's exclusion window collapse below a second), the conditions matrix (48+ rounds: threads, concurrency with the SQLite column, cold/warm, CPU-load stress), mechanism probes (1.2 s delay fails deterministically on the exact assert; 200 ms lapses 2/10, frac-dependent), and the natural repro (2/30 loaded solo runs, exact message at properties.rs:563). Disposition: reproduced, root cause harness-model — the engine acted per ADR-008 §7 throughout; the pre-fix row's contention leg asserted a live-TTL state across an unbounded wall-clock gap. Trivially test-side, so the fix landed in-session under the AC's exception: lock_ttl_expiry_and_reacquisition is now two-legged (300 s exclusion leg released; the 1 s lapse leg's post-sleep asserts stay delay-only-safe); every pinned semantic survives. Verified: 30/30 loaded runs of the fixed row green under the exact repro condition; sqlite + mem columns green; workspace gates green (build, live-pg workspace tests, clippy -D warnings, fmt); taskgraph validate green. Watch ledger: the lock row's flag retires; the trim row stays watch-flagged (no repro, 10 focused + 7 loaded rounds); a new single occurrence of row_stream_ordering_equivalence under synthetic load (message captured — the row's drain window raced the pg bridge's incomplete channel fill) is watch-flagged for review-wave-8's flake outcome; no ride-along fix (instrumentation-first discipline). Tasks: release-flake-investigation -> completed with Notes + Summary; review-wave-5 ledger dated update.
This commit is contained in:
1 parent
c3a0c54df0
commit
0344d101d1
3 files changed
+238
-20
No files matched your search
@@ -532,9 +532,21 @@ pub async fn duration_refusal_on_non_positive_ttl(factory: &dyn StoreFactory) {
|
|||||||
/// acquire succeeds; the original holder's post-expiry `renew` is
|
/// acquire succeeds; the original holder's post-expiry `renew` is
|
||||||
/// refused (`false` — the deadline-lapse refusal of the handle's
|
/// refused (`false` — the deadline-lapse refusal of the handle's
|
||||||
/// uniform predicate shape); and the second owner's `release` frees
|
/// uniform predicate shape); and the second owner's `release` frees
|
||||||
/// the name for a third acquirer. Short-TTL (1 s) stamps with the
|
/// the name for a third acquirer.
|
||||||
/// tolerance-sleep posture (state outcomes asserted, never durations;
|
///
|
||||||
/// sequential single-store drive).
|
/// Two-leg shape, each leg owning the posture its assertions can
|
||||||
|
/// bear. The **exclusion leg** holds a long TTL (300 s — a span the
|
||||||
|
/// row's own duration cannot cross): exclusion-while-held is a
|
||||||
|
/// *live-TTL* state, and a short-TTL holder would hand that assertion
|
||||||
|
/// a wall-clock-collapsible window — second-precision engine clocks
|
||||||
|
/// stamp a 1 s expiry that lapses after as little as `1 - frac` of a
|
||||||
|
/// second, so any scheduling/server stall between the two acquisitions
|
||||||
|
/// (>~1 s suffices) spuriously fails the exclusion assert itself (the
|
||||||
|
/// 2026-10-11 flake investigation's natural repro: two of thirty
|
||||||
|
/// loaded solo runs failed exactly so, probe-confirmed on the leg). The **lapse leg** carries the Short-TTL (1 s) stamp with the
|
||||||
|
/// tolerance-sleep posture: its assertions are *post-sleep states* a
|
||||||
|
/// slow clock can only delay, never un-lapse (state outcomes
|
||||||
|
/// asserted, never durations; sequential single-store drive).
|
||||||
///
|
///
|
||||||
/// Cross-reference: the duration-guard legs (`ttl <= 0` rejecting on
|
/// Cross-reference: the duration-guard legs (`ttl <= 0` rejecting on
|
||||||
/// `try_lock`/`renew`) pin in `duration_refusal_on_non_positive_ttl`
|
/// `try_lock`/`renew`) pin in `duration_refusal_on_non_positive_ttl`
|
||||||
@@ -551,8 +563,11 @@ pub async fn duration_refusal_on_non_positive_ttl(factory: &dyn StoreFactory) {
|
|||||||
pub async fn lock_ttl_expiry_and_reacquisition(factory: &dyn StoreFactory) {
|
pub async fn lock_ttl_expiry_and_reacquisition(factory: &dyn StoreFactory) {
|
||||||
let store = factory.open().await.expect("factory opens a store");
|
let store = factory.open().await.expect("factory opens a store");
|
||||||
|
|
||||||
|
// The exclusion leg — long-TTL holder deliberately (see the row
|
||||||
|
// doc's two-leg posture): the held-lock exclusion assert must not
|
||||||
|
// race the holder's own expiry.
|
||||||
let holder = store
|
let holder = store
|
||||||
.try_lock("lapse", "a", 1)
|
.try_lock("lapse", "a", 300)
|
||||||
.await
|
.await
|
||||||
.expect("try_lock on a free name must not error")
|
.expect("try_lock on a free name must not error")
|
||||||
.expect("the first acquire holds the free name");
|
.expect("the first acquire holds the free name");
|
||||||
@@ -564,11 +579,24 @@ pub async fn lock_ttl_expiry_and_reacquisition(factory: &dyn StoreFactory) {
|
|||||||
contender.is_none(),
|
contender.is_none(),
|
||||||
"a held lock excludes a second acquirer"
|
"a held lock excludes a second acquirer"
|
||||||
);
|
);
|
||||||
|
assert!(
|
||||||
|
holder
|
||||||
|
.release()
|
||||||
|
.await
|
||||||
|
.expect("the exclusion leg's holder release errs only on storage failure"),
|
||||||
|
"the exclusion leg's holder releases its own row"
|
||||||
|
);
|
||||||
|
|
||||||
// TTL expiry (a 1 s stamp; the sleep is bounded well past the
|
// The lapse leg — a fresh short-TTL holder: TTL expiry (a 1 s
|
||||||
// second-precision stamp's resolution): exclusion lapses silently
|
// stamp; the sleep is bounded well past the second-precision
|
||||||
// — the second owner's acquire is a clean Ok(Some) with no error
|
// stamp's resolution) lapses exclusion silently — the second
|
||||||
// preceding it and no revocation event to observe.
|
// owner's acquire is a clean Ok(Some) with no error preceding it
|
||||||
|
// and no revocation event to observe.
|
||||||
|
let lapsing_holder = store
|
||||||
|
.try_lock("lapse", "a", 1)
|
||||||
|
.await
|
||||||
|
.expect("try_lock on the freed name must not error")
|
||||||
|
.expect("the lapse leg's acquire holds the freed name");
|
||||||
past_stamp_sleep(2_500).await;
|
past_stamp_sleep(2_500).await;
|
||||||
let second = store
|
let second = store
|
||||||
.try_lock("lapse", "b", 300)
|
.try_lock("lapse", "b", 300)
|
||||||
@@ -577,7 +605,7 @@ pub async fn lock_ttl_expiry_and_reacquisition(factory: &dyn StoreFactory) {
|
|||||||
.expect("after TTL expiry exclusion has silently lapsed: a second owner acquires");
|
.expect("after TTL expiry exclusion has silently lapsed: a second owner acquires");
|
||||||
|
|
||||||
assert!(
|
assert!(
|
||||||
!holder
|
!lapsing_holder
|
||||||
.renew(300)
|
.renew(300)
|
||||||
.await
|
.await
|
||||||
.expect("renew errs only on storage failure, never on lapse"),
|
.expect("renew errs only on storage failure, never on lapse"),
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: release-flake-investigation
|
id: release-flake-investigation
|
||||||
name: Flake investigation — the pg lock-row trigger fired (dedicated session)
|
name: Flake investigation — the pg lock-row trigger fired (dedicated session)
|
||||||
status: pending
|
status: completed
|
||||||
depends_on: []
|
depends_on: []
|
||||||
scope: moderate
|
scope: moderate
|
||||||
risk: medium
|
risk: medium
|
||||||
@@ -57,19 +57,21 @@ Requires the harness Postgres server (the POC container posture —
|
|||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
- [ ] The output-capture blind spot fixed (a failing run's assertion
|
- [x] The output-capture blind spot fixed (a failing run's assertion
|
||||||
message is preserved by the recorded procedure)
|
message is preserved by the recorded procedure)
|
||||||
- [ ] The conditions matrix actually run (counts + configurations
|
- [x] The conditions matrix actually run (counts + configurations
|
||||||
recorded in Notes)
|
recorded in Notes)
|
||||||
- [ ] The row's sleep/tolerance arithmetic read against the pg lock
|
- [x] The row's sleep/tolerance arithmetic read against the pg lock
|
||||||
expiry implementation; the delay-only argument confirmed or
|
expiry implementation; the delay-only argument confirmed or
|
||||||
corrected
|
corrected
|
||||||
- [ ] Disposition recorded: reproduced (→ root cause + follow-up task
|
- [x] Disposition recorded: reproduced (→ root cause + follow-up task
|
||||||
created) or not-reproduced (→ bounded-investigation record +
|
created) or not-reproduced (→ bounded-investigation record +
|
||||||
watch posture updated)
|
watch posture updated) — **reproduced, root cause harness-model;
|
||||||
- [ ] If the trim row reproduces: it joins the investigation and its
|
trivially test-side, fixed in-session per the AC's exception**
|
||||||
outcome is recorded too
|
- [x] If the trim row reproduces: it joins the investigation and its
|
||||||
- [ ] Workspace gates green at session end (any fix is a follow-up
|
outcome is recorded too — did **not** reproduce (10 focused +
|
||||||
|
7 loaded full-suite rounds green); stays watch-flagged (n/a)
|
||||||
|
- [x] Workspace gates green at session end (any fix is a follow-up
|
||||||
task, not a ride-along — unless the root cause is trivially
|
task, not a ride-along — unless the root cause is trivially
|
||||||
test-side, in which case fix + full gates + Notes)
|
test-side, in which case fix + full gates + Notes)
|
||||||
|
|
||||||
@@ -84,8 +86,169 @@ Requires the harness Postgres server (the POC container posture —
|
|||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
> To be filled by implementation agent
|
> Investigation of record (2026-10-11). Every result below was run
|
||||||
|
> this session; raw logs under `/tmp/opencode/flake-inv/` (session
|
||||||
|
> scratch, not committed — the counts and shapes are recorded here).
|
||||||
|
|
||||||
|
**1. Output capture — the blind spot fixed and demonstrated.** The
|
||||||
|
procedure of record for every pg-column investigation run:
|
||||||
|
|
||||||
|
```
|
||||||
|
ALKSTORE_PG_HOST=localhost ALKSTORE_PG_PORT=15432 \
|
||||||
|
ALKSTORE_PG_USER=postgres ALKSTORE_PG_PASSWORD=poc ALKSTORE_PG_DB=blobs \
|
||||||
|
cargo test -p alkstore-postgres --test contract_suite [filter] -- \
|
||||||
|
--nocapture 2>&1 | tee <log>
|
||||||
|
```
|
||||||
|
|
||||||
|
Tee to a file **before** any filter (`grep`-only pipelines were how
|
||||||
|
the first and second occurrences — and this session initially re-lost
|
||||||
|
a failing run's identity — lost the messages). Verified by run: a
|
||||||
|
temporary deliberately-failing probe test executed through the
|
||||||
|
procedure preserved its full assertion message and backtrace in the
|
||||||
|
tee'd log (probe file removed after); the same procedure captured both
|
||||||
|
natural reproductions below verbatim. Corollary recorded for the skip
|
||||||
|
posture: `harness_ready()`'s skip prints "1 passed … 0.00s" — a
|
||||||
|
result-line scan alone cannot distinguish a skipped row from a
|
||||||
|
passing one; check the runtime or run with `--nocapture` and grep for
|
||||||
|
the skip marker.
|
||||||
|
|
||||||
|
**2. The arithmetic, read against the implementation.** `now_unix()`
|
||||||
|
is second-precision (`as_secs`,
|
||||||
|
`alkstore-postgres/src/resolution.rs:24-29`). A holder acquiring with
|
||||||
|
`ttl = 1` at wall instant `W0` stamps `expires_at = floor(W0) + 1`;
|
||||||
|
the acquire's expiry predicate is `expires_at <= now` with
|
||||||
|
second-precision reads (`alkstore-postgres/src/lock.rs::lock_acquire`:
|
||||||
|
opportunistic expired-row DELETE → PK-guarded ON CONFLICT DO NOTHING
|
||||||
|
INSERT → owner read-back). lapses when the contender's read reaches
|
||||||
|
`floor(W0) + 1` — i.e. after only `1 − frac(engine-now)` seconds,
|
||||||
|
arbitrarily close to zero (and the engine's clock read rides *before*
|
||||||
|
the acquire's round trips, so the effective headroom is shorter than
|
||||||
|
the post-read arithmetic implies). The ledger's delay-only argument:
|
||||||
|
|
||||||
|
- **Confirmed for the row's post-sleep lapse assertions** — slower
|
||||||
|
clocks only make expiry more certain, and once the second owner's
|
||||||
|
row is in place, owner-scoped `renew` (UPDATE … WHERE name AND
|
||||||
|
owner) and owner-scoped `release` cannot resurrect the original
|
||||||
|
holder's row; the `lock_acquire` read-back cannot grant two owners
|
||||||
|
(the PK guard). Never un-lapsed by lateness.
|
||||||
|
- **Corrected/extended in two places.** (a) It covers only the
|
||||||
|
post-sleep legs: the row's *contention* leg
|
||||||
|
(`contender.is_none()`, `properties.rs:563` in the pre-fix row)
|
||||||
|
asserts a **live-TTL state** — the one place the row asserts "not
|
||||||
|
yet lapsed", and under second-precision stamps the `ttl = 1`
|
||||||
|
holder's guaranteed exclusion window can be under a second. Any
|
||||||
|
scheduling/server stall (≳ ~1 s) between the holder's and the
|
||||||
|
contender's `try_lock` calls lapses the holder with the engine
|
||||||
|
acting fully per contract. (b) Strictly, a *backwards* clock step
|
||||||
|
(NTP slew) could also un-lapse the post-sleep asserts — not covered
|
||||||
|
by "slow clock" framing; rare in the container posture; recorded,
|
||||||
|
no action.
|
||||||
|
|
||||||
|
**3. Conditions matrix (pre-fix row).** All against the harness
|
||||||
|
container (`pglo-poc`, :15432), workspace clean:
|
||||||
|
|
||||||
|
| ID | Condition | Runs | Result |
|
||||||
|
|---|---|---|---|
|
||||||
|
| A1 | solo row, warm, `--test-threads=1` | 20 | all green (4.1–4.8 s) |
|
||||||
|
| A2 | solo row, warm, `--test-threads=6` | 10 | all green |
|
||||||
|
| B1 | full pg suite, `--test-threads=1` | 2 | green (99.8 / 100.0 s) |
|
||||||
|
| B2 | full pg suite, default (8) | 2 | green (21.1 / 21.3 s) |
|
||||||
|
| C | full pg suite concurrent with full SQLite column | 2 | green (pg 21.0 / 21.7; sq 13.3 / 16.3) |
|
||||||
|
| D | cold server (docker restart + readiness-wait before first run) | 3 × solo + 1 × full | green (full: 20.8 s). An earlier trio of "runs" were skips (0.00 s) caught by §1's corollary |
|
||||||
|
| E | trim row focused, `--test-threads=6` | 10 | all green — the trim row did **not** reproduce |
|
||||||
|
| F | full pg suite under 8 CPU burners (`sha256sum /dev/zero` ×8) | 6 | **F1 FAILED 24/1** — failing row's identity lost (this session's own grep-before-tee; from F2 on every run teed first); F2–F5 green; **F6 FAILED `row_stream_ordering_equivalence`** (see §6) |
|
||||||
|
|
||||||
|
**4. Mechanism probes (temporary test target, removed after
|
||||||
|
recording).** A probe mirrored the row's body with a `tokio::time::sleep`
|
||||||
|
interposed between the holder's and contender's `try_lock` calls:
|
||||||
|
|
||||||
|
- **1.2 s delay → deterministic failure** on the exact leg, exact
|
||||||
|
message: panic "a held lock excludes a second acquirer" at the
|
||||||
|
contention assert; probe log prints the arithmetic (holder stamp
|
||||||
|
`floor(1791680021)+1`, contender read `floor(1791680022)` →
|
||||||
|
`expires_at <= now` true → granted to the contender).
|
||||||
|
- **200 ms delay, 10 iterations → 2/10 lapsed** (frac-dependent —
|
||||||
|
the lapse lands whenever the holder's engine-now read sits late in
|
||||||
|
its second), confirming the boundary sits at ~`1 − frac` seconds,
|
||||||
|
far inside ordinary scheduling jitter.
|
||||||
|
|
||||||
|
**5. Natural repro captured.** Solo pre-fix row, 30 consecutive runs
|
||||||
|
under the §F burners, full output tee'd: **2/30 FAILED** at
|
||||||
|
`properties.rs:563` with the exact message "a held lock excludes a
|
||||||
|
second acquirer" (runs 17 and 23). Message capture procedure held.
|
||||||
|
Combined with §3's probes: mechanism demonstrated, boundary mapped,
|
||||||
|
and the failure occurs under ordinary CPU starvation with no other
|
||||||
|
pathology.
|
||||||
|
|
||||||
|
**6. Disposition: reproduced → root cause harness-model (test-side),
|
||||||
|
fixed in-session under the AC's trivially-test-side exception.** The
|
||||||
|
engine's behavior conforms to ADR-008 §7 at every step — exclusion
|
||||||
|
*bounded by TTL*, silent lapse, no revocation event; the row wrote
|
||||||
|
`ttl = 1` into a hold it then asserted across an unbounded wall-clock
|
||||||
|
gap. This is the review-002 precedent's inverse: the "flake" was not
|
||||||
|
the engine, it was the row's contention leg. Fix landed in
|
||||||
|
`alkstore-contract-suite/src/properties.rs::lock_ttl_expiry_and_reacquisition`:
|
||||||
|
a two-leg shape — the **exclusion leg** holds a long TTL (300 s, a
|
||||||
|
span the row's own duration cannot cross — wall-clock independent)
|
||||||
|
and releases it; the **lapse leg** keeps the 1 s stamp and the
|
||||||
|
tolerance-sleep posture (its asserts are post-sleep states the fix
|
||||||
|
preserves as delay-only-safe). Every pinned semantic survives
|
||||||
|
(exclusion-while-held, silent lapse, re-acquisition, post-expiry
|
||||||
|
renew `false`, second's release, third-owner freedom); the row doc
|
||||||
|
records the two-leg posture and why. No follow-up task created (no
|
||||||
|
engine change; the row change is the fix).
|
||||||
|
|
||||||
|
**7. Fix verification.** 30/30 loaded solo runs of the fixed row
|
||||||
|
green under the exact repro condition (§F burners); 3× focused green
|
||||||
|
on SQLite (2.7–2.8 s) and 3× on mem (2.5 s) columns; full workspace
|
||||||
|
gates green — `cargo build`; `cargo test` live for the pg column (127
|
||||||
|
lib + 25 suite + 9 schema vs the harness) with sqlite 193 + 25, mem
|
||||||
|
102, core 25, suite harness 3+1 all green; `cargo clippy --all-targets
|
||||||
|
-- -D warnings`; `cargo fmt --check`.
|
||||||
|
|
||||||
|
**8. Watch posture after this session.** The lock row's watch flag
|
||||||
|
**retires** (root-caused, test-side fixed, repro condition survives
|
||||||
|
the fix on both sides of it: 30/30 loaded green). The trim row stays
|
||||||
|
**watch-flagged** — 10 focused + every loaded full-suite round green
|
||||||
|
this session, no repro. **New ledger observation**: one
|
||||||
|
`row_stream_ordering_equivalence` failure under 8-burner load (§F6,
|
||||||
|
message captured): `left: [1]` vs `right: [1, 2, 3, 4, 5, 6]` at
|
||||||
|
`properties.rs:3052` — the row's drain window (`recv()` once, then
|
||||||
|
`try_recv()` until `None`) raced the pg bridge's not-yet-complete
|
||||||
|
fill (`run_subscribe_loop` sends the attach-drain pages into the
|
||||||
|
bounded mpsc sequentially; a descheduled bridge task between sends
|
||||||
|
leaves the consumer's `try_recv` pump momentarily exhausted). No
|
||||||
|
ordering violation, no delivery failure — a scheduling lottery in the
|
||||||
|
same class as the lock row's contention leg, in a row whose
|
||||||
|
compare-vectors are state-derivable (all six publishes fully stored
|
||||||
|
pre-attach). Single occurrence under synthetic load beyond any
|
||||||
|
dev/gate condition; recorded in the ledger
|
||||||
|
(`tasks/review-wave-5.md` §Notes 6, dated 2026-10-11) and carried to
|
||||||
|
the `review-wave-8` gate's flake outcome. No ride-along fix —
|
||||||
|
instrumentation first remains the discipline.
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
> To be filled on completion
|
> Filled by the implementation agent (2026-10-11):
|
||||||
|
|
||||||
|
The fired trigger was investigated per the ledger's prescription:
|
||||||
|
instrumentation first (tee-before-filter procedure of record,
|
||||||
|
demonstrated to preserve failing messages — and immediately vindicated
|
||||||
|
by two natural reproductions), the arithmetic read against
|
||||||
|
`lock.rs`/`resolution.rs` (delay-only argument confirmed for the
|
||||||
|
lapse legs, corrected for the contention leg), the conditions matrix
|
||||||
|
run (48+ rounds across thread counts, concurrency, cold/warm, and
|
||||||
|
under CPU load), mechanism probes with a mirroring test target, and
|
||||||
|
the disposition call: **reproduced — root cause is the row's own
|
||||||
|
shape (harness-model, not the engine)**: second-precision stamps let
|
||||||
|
a `ttl = 1` holder's exclusion window collapse below a second, so the
|
||||||
|
contention assert races the holder's own expiry under ordinary
|
||||||
|
scheduling stalls. Fixed in-session under the AC's trivially-test-side
|
||||||
|
exception (two-leg row: long-TTL exclusion leg + short-TTL lapse
|
||||||
|
leg); 30/30 loaded verification runs green under the exact repro
|
||||||
|
condition; all three suite columns green; workspace gates green
|
||||||
|
(build/test live-pg/clippy/fmt). The trim row did not reproduce and
|
||||||
|
stays watch-flagged; a new single-occurrence observation
|
||||||
|
(`row_stream_ordering_equivalence` under synthetic load, message
|
||||||
|
captured) is recorded in the ledger and rides the `review-wave-8`
|
||||||
|
gate's flake outcome.
|
||||||
@@ -235,6 +235,33 @@ carriage (the release-readiness watch — wave 8 since the fuzzing
|
|||||||
wave's renumber) before any postulate-and-fix. Recorded here for the ledger's
|
wave's renumber) before any postulate-and-fix. Recorded here for the ledger's
|
||||||
honesty; not blocking the fire-wake task.
|
honesty; not blocking the fire-wake task.
|
||||||
|
|
||||||
|
*Ledger update (2026-10-11, from the `release-flake-investigation`
|
||||||
|
session):* the lock row's trigger has been **investigated and
|
||||||
|
resolved** — `tasks/release-flake-investigation.md` carries the full
|
||||||
|
record (the capture procedure of record, the conditions matrix, the
|
||||||
|
read-back of the delay-only argument, the mechanism probes, the
|
||||||
|
natural repro). The disposition: **harness-model, not the engine** —
|
||||||
|
the pre-fix row's contention leg asserted a live-TTL state over a
|
||||||
|
`ttl = 1` hold whose guaranteed window second-precision stamps
|
||||||
|
(`now_unix`, `as_secs`) collapse below one second, so any ≳1 s
|
||||||
|
scheduling stall between the holder's and the contender's
|
||||||
|
acquisitions lapses the holder with the engine acting entirely per
|
||||||
|
ADR-008 §7. Natural repro captured (2/30 loaded solo runs, the exact
|
||||||
|
message at the exact assert site); fixed test-side that session (the
|
||||||
|
row's two-leg shape: long-TTL exclusion leg, short-TTL lapse leg);
|
||||||
|
30/30 loaded verification runs green under the exact repro condition.
|
||||||
|
The lock row's watch flag **retires**. Two observations carry to the
|
||||||
|
`review-wave-8` gate's flake outcome: the trim row stays
|
||||||
|
watch-flagged (no repro in 10 focused + 7 loaded full-suite rounds
|
||||||
|
this session), and a **new** single occurrence of
|
||||||
|
`row_stream_ordering_equivalence` under 8-CPU-burner load is
|
||||||
|
watch-flagged (message captured: `left: [1]` vs the six stored
|
||||||
|
offsets at the attach-drain compare, `properties.rs:3052` — the row's
|
||||||
|
recv-once-then-try_recv drain window raced the pg bridge's
|
||||||
|
not-yet-complete channel fill; no ordering violation, no delivery
|
||||||
|
failure — scheduling-lottery class, same as the lock row's contention
|
||||||
|
leg); no ride-along fix (instrumentation-first discipline).
|
||||||
|
|
||||||
**7. Findings.** No code, suite-row, or stamp defects requiring change
|
**7. Findings.** No code, suite-row, or stamp defects requiring change
|
||||||
were found at gate time; all changes this gate made are doc-side
|
were found at gate time; all changes this gate made are doc-side
|
||||||
(engine specs `draft` → `stable` with dated gate annotations;
|
(engine specs `draft` → `stable` with dated gate annotations;
|
||||||
|
|||||||
Reference in new issue
Block a user