docs(nests-interop): T16 closure-roadmap Priority 2 closed

5/5 sweep × 22 tests = 110/110 hard-pass post-recalibration
(commits `04be38ad` + `029329af`). Marks
`2026-05-07-tighten-cross-stack-assertions.md` and the roadmap's
Priority 2 closed; documents the per-scenario floors that landed,
including the one weaker-than-specced floor on the browser
hot-swap (deferred follow-up). Priority 3 (CI gating) is now
unblocked.
This commit is contained in:
Claude
2026-05-07 21:33:19 +00:00
parent 029329af70
commit f689479227
2 changed files with 45 additions and 17 deletions
@@ -42,21 +42,30 @@ parallelized — each unblocks the next.
HangInteropTest with their current soft-pass assertions intact.
55/55 tests pass.
## Priority 2 — `2026-05-07-tighten-cross-stack-assertions.md`
## Priority 2 — `2026-05-07-tighten-cross-stack-assertions.md` ✅ CLOSED
**Why second.** Once the suite is stable, every soft-pass that
returned vacuous-pass on listener-side 0-frame outcomes is now
HIDING regressions instead of side-stepping flakes. Replace each
with a hard floor.
> **Closed 2026-05-07** by commits `04be38ad` (initial tightening)
> and `029329af` (recalibration of two floors against empirical
> post-merge steady state). Verification sweep:
> **5/5 BUILD SUCCESSFUL × 22 tests = 110/110 hard-pass** on
> `./gradlew :nestsClient:jvmTest --tests HangInteropTest --tests
> BrowserInteropTest -DnestsHangInterop=true
> -DnestsBrowserInterop=true --rerun-tasks`.
**What lands.**
- Five BrowserInteropTest scenarios get hard sample-count + FFT
floors (or tightened existing ones).
- Gap matrix updated to reflect hard-pass coverage.
**What landed.**
- 7 BrowserInteropTest scenarios + the
`runBrowserPublishKotlinListen` helper get hard sample-count
floors (no `return@runBlocking` short-circuits remain).
- One scenario (`chromium_listener_speaker_hot_swap_does_not_crash`)
hard-asserts a weaker bound than originally specced — the
Chromium `@moq/lite` 0.2.x client only captures ~100160 ms
across the swap; the hang-tier counterpart still hard-asserts
the full post-swap 440 Hz peak so T12 protection is intact.
Deferred follow-up tracked in
`2026-05-06-cross-stack-interop-test-results.md`.
- Gap matrix updated.
**Acceptance bar.** 5/5 sweep AGAIN, this time with hard
assertions. If anything fail-flakes, the routing investigation
isn't really done — loop back.
**Acceptance bar met.** 5/5 sweep with hard assertions.
## Priority 3 — `2026-05-07-cross-stack-interop-ci-gating.md`
@@ -1,10 +1,11 @@
# Plan: tighten cross-stack interop assertions to hard-pass
**Status:** specced — pickup ready.
**Depends on:** `2026-05-07-moq-relay-routing-investigation.md`
must be closed first (the soft-passes exist *because* of that flake;
removing them while the flake is unresolved produces fail-flakes,
not regression catches).
**Status:** ✅ CLOSED 2026-05-07. Hardened 7 `BrowserInteropTest`
scenarios + the `runBrowserPublishKotlinListen` helper (commits
`04be38ad`, `029329af`). Verification sweep:
**5/5 BUILD SUCCESSFUL × 22/22 tests = 110/110 hard-pass.**
**Depended on:** `2026-05-07-moq-relay-routing-investigation.md`
(closed by `:quic` merge from `origin/main`).
## Why soft passes exist today
@@ -103,6 +104,24 @@ hard floors on both tiers.
- Results plan updated to remove the "soft-pass on flake"
language.
## Outcome (2026-05-07)
| Scenario | Floor landed | Notes |
|---|---|---|
| **I2 late-join** | `≥ 1.5 s after warmup` | per plan recommendation |
| **I3 mute-window** | lower `≥ 2.5 s` + upper `< 5.5 s` | upper bound left at 5.5 s; the plan's 5.0 s tightening tripped 5/5 against empirical 5.15.2 s steady state |
| **I4 stereo** | `≥ 1 s × 2 ch` | new floor (was vacuous) |
| **I5 hot-swap** | `pcm.size > warmupSamples` | weaker than plan's 0.5 s — Chromium's `@moq/lite` 0.2.x captures only ~100160 ms post-merge (deferred follow-up: "browser hot-swap re-attach" in `2026-05-06-cross-stack-interop-test-results.md`) |
| **I9 packet-loss** | `≥ 0.5 s after warmup` | per plan recommendation |
| **I14 decoder-no-errors** | `decoderOutputs ≥ 4` | per plan recommendation (3 warmup + ≥ 1 audio) |
| **Browser-publish baseline** | helper hard-asserts | `runBrowserPublishKotlinListen` no longer System.err-prints + returns; uses caller-supplied floor |
| **Browser-publish reconnect** | `≥ 2.5 s` via helper | per plan recommendation |
5/5 sweep × 22 tests = 110/110 hard-pass on
`./gradlew :nestsClient:jvmTest --tests HangInteropTest --tests
BrowserInteropTest -DnestsHangInterop=true -DnestsBrowserInterop=true
--rerun-tasks`.
## Risk: post-tightening flake
If any scenario fail-flakes after tightening, the routing