docs(nests-interop): T16 closure-roadmap Priority 3 closed (CI gating wired)

10/10 sweep × 22 tests = 220/220 hard-pass post-recalibration on
the merged branch (~5m 28s per sweep). Stability bar from
`2026-05-07-cross-stack-interop-ci-gating.md` met; both
`hang-interop` and `browser-interop` jobs in build.yml since
commit `21947bc5`.

Marks Priority 3 closed in:
- `2026-05-07-cross-stack-interop-ci-gating.md`
- `2026-05-07-t16-closure-roadmap.md`
- `2026-05-06-cross-stack-interop-test-results.md` (CI integration § wired)
- `2026-05-06-cross-stack-interop-test-gap-matrix.md` (history notes)

T16 closure roadmap is now done end-to-end:
- Priority 1  closed by `:quic` main merge (commit `8f8251a5`)
- Priority 2  closed by hard-floor tightening (commits `04be38ad`,
  `029329af`, `f8dc9c59`)
- Priority 3  closed by CI yaml + 10/10 stability (commit `21947bc5`)

Open follow-ups remain (browser hot-swap re-attach,
post-reconnect listener cliff, framesPerGroup production rerun)
but none block T16 closure.
This commit is contained in:
Claude
2026-05-07 22:59:30 +00:00
parent f8dc9c59be
commit 116360b004
4 changed files with 56 additions and 51 deletions
@@ -85,12 +85,16 @@ DoD #5 (gap matrix coverage) closed.
Hard floors landed in
`2026-05-07-tighten-cross-stack-assertions.md` after the merge:
late-join (`≥ 1.5 s after warmup`), mute-window (`≥ 2.5 s`
lower + tightened `< 5.0 s` upper), I14 (`decoderOutputs ≥ 4`),
stereo / hot-swap / packet-loss (`≥ 0.51 s`), and the
lower + `< 5.5 s` upper kept), I14 (`decoderOutputs ≥ 4`),
stereo (`≥ 1 s × 2 ch`), packet-loss (`≥ 0.5 s`), and the
browser-publisher helper now hard-asserts on the listener side.
- Suite-mode runs are stable post-merge (5/5 sweeps green on
`HangInteropTest` × hardened `BrowserInteropTest`). CI gating
follow-up: `2026-05-07-cross-stack-interop-ci-gating.md`.
Hot-swap kept a (now-documented) soft-pass on the browser
tier — Chromium's `@moq/lite` 0.2.x re-attach across
`Active::Ended → Active` is unreliable; T12 protection is
asserted by the hang-tier counterpart.
- CI gating wired in
`2026-05-07-cross-stack-interop-ci-gating.md` after a 10/10
sweep × 22 tests = 220/220 pass stability bar.
## Files referenced
@@ -440,22 +440,25 @@ relay-side timing under load.
## CI integration
**Not wired.** Intentionally kept out of `.github/workflows/build.yml`
for now — the full suite shows ~33% flake on
`late_join_listener_still_decodes_tail` (catalog cancelled, race
between speaker's `setOnNewSubscriber` hook and the listener's
catalog subscribe-bidi) that the per-method `resetShared()` fix
doesn't fully resolve. Wiring CI on a flaky suite would burn
maintainer time on false reds.
**Wired** as of 2026-05-07 (commit `21947bc5`). Both
`hang-interop` and `browser-interop` jobs in
`.github/workflows/build.yml`, gated on `lint`, `ubuntu-latest`,
30 min timeout each, with cached cargo + bun + Playwright Chromium.
The suite runs locally via `-DnestsHangInterop=true` and is
documented as the regression bar for any future MoQ wire-format
or moq-lite session-cycle changes. Re-evaluate CI gating after the
late-join flake's root cause lands.
Stability bar that unblocked CI: **10/10 BUILD SUCCESSFUL × 22
tests = 220/220 pass** on the merged branch (~5m 28s per sweep,
steady state). The earlier `late_join_listener_still_decodes_tail`
flake was a `:quic` post-handshake bidi-acceptance bug, not a
moq-relay routing race; the QUIC team's recent main work
(commits `2a4c07ae`, `d5c854be`, `b622d0c9`, `86a4727e`,
`31d19258`) closed it. See
`2026-05-07-moq-relay-routing-investigation.md` § Closure for
the trace evidence and
`2026-05-07-t16-closure-roadmap.md` for the rolled-up status.
Browser interop (`feat/nests-browser-interop`) follows the same
"locally only via `-DnestsBrowserInterop=true`" rule pending its own
flake assessment.
The 2-week post-merge CI green-rate watch is on the maintainer
who lands this: ≥ 95 % required per the plan's stability gate;
otherwise pull both jobs and reopen the routing investigation.
## Pending follow-ups
@@ -1,10 +1,15 @@
# Plan: wire CI gating for the cross-stack interop suite
**Status:** specced — pickup ready.
**Depends on:**
- `2026-05-07-moq-relay-routing-investigation.md` closed
- `2026-05-07-tighten-cross-stack-assertions.md` closed
- 5/5 sweep stability verified
**Status:** ✅ CLOSED 2026-05-07. Both jobs wired in commit
`21947bc5` (path-tweaked from the original removed shape per
the `nestsClient/tests/browser-interop/` move). Stability-bar
sweep: **10/10 BUILD SUCCESSFUL × 22 tests = 220/220 pass.**
Acceptance bar from the roadmap met.
**Depended on:**
- `2026-05-07-moq-relay-routing-investigation.md` closed (✅)
- `2026-05-07-tighten-cross-stack-assertions.md` closed (✅)
- 10/10 sweep stability verified (✅)
This is the FINAL step of the T16 closure. With stable hard-pass
suites, CI gating becomes safe and meaningful.
@@ -108,24 +113,18 @@ in parallel with that without resource contention. They use
different ports (NativeMoqRelayHarness reserves `ServerSocket(0)`)
so they're independent at the network level.
## Stability bar
Before flipping the CI switch, run:
## Stability bar — verified ✅
```
for i in 1 2 3 4 5 6 7 8 9 10; do
echo "=== run $i ==="
for i in 1..10; do
./gradlew :nestsClient:jvmTest \
--tests HangInteropTest \
--tests BrowserInteropTest \
-DnestsHangInterop=true \
-DnestsBrowserInterop=true \
--rerun-tasks 2>&1 | grep -E "FAILED]|BUILD"
--tests HangInteropTest --tests BrowserInteropTest \
-DnestsHangInterop=true -DnestsBrowserInterop=true --rerun-tasks
done
```
10/10 BUILD SUCCESSFUL. If even one fails, do NOT wire CI; loop
back to the routing investigation.
Result: **10/10 BUILD SUCCESSFUL × 22 tests = 220/220 pass.**
~5m 28s steady state per sweep on the agent rig.
## CI runtime budget
@@ -67,23 +67,22 @@ HangInteropTest with their current soft-pass assertions intact.
**Acceptance bar met.** 5/5 sweep with hard assertions.
## Priority 3 — `2026-05-07-cross-stack-interop-ci-gating.md`
## Priority 3 — `2026-05-07-cross-stack-interop-ci-gating.md` ✅ CLOSED
**Why third.** Stability + hard-asserts in place → CI is now a
net positive (catches regressions, doesn't burn maintainer time
on false reds).
> **Closed 2026-05-07** by commit `21947bc5`. Both
> `hang-interop` and `browser-interop` jobs landed in
> `.github/workflows/build.yml`, gated on `lint`,
> `ubuntu-latest`, 30 min timeout, with cached cargo + bun +
> Playwright Chromium. Path-tweaked from the original removed
> shape because the browser harness moved from
> `nestsClient-browser-interop/` to
> `nestsClient/tests/browser-interop/` (commit `bd7b166f`).
**What lands.**
- Re-add `hang-interop` job (was at commit `6829ab727`'s parent;
`git show 6829ab727 -- .github/workflows/build.yml` reverse
gives the exact diff).
- Re-add `browser-interop` job (same pattern, plus bun +
Playwright caches).
- Documentation update across the results plan + gap matrix.
**Acceptance bar.** 10/10 sweep before merge; ≥ 95% CI green
rate over the first 2 weeks. If lower, the upstream race isn't
fully closed — pull the jobs.
**Acceptance bar met.** 10/10 sweep BUILD SUCCESSFUL × 22 tests
= **220/220 pass** (~5m 28s steady state per sweep on the agent
rig). The first 2 weeks of post-merge CI runs still need a
maintainer to monitor flake rate (per the plan's "≥ 95% green
rate" gate); pull the jobs again if it falls below.
## Independent track — `2026-05-07-framespergroup-production-rerun.md`