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 Hard floors landed in
`2026-05-07-tighten-cross-stack-assertions.md` after the merge: `2026-05-07-tighten-cross-stack-assertions.md` after the merge:
late-join (`≥ 1.5 s after warmup`), mute-window (`≥ 2.5 s` late-join (`≥ 1.5 s after warmup`), mute-window (`≥ 2.5 s`
lower + tightened `< 5.0 s` upper), I14 (`decoderOutputs ≥ 4`), lower + `< 5.5 s` upper kept), I14 (`decoderOutputs ≥ 4`),
stereo / hot-swap / packet-loss (`≥ 0.51 s`), and the stereo (`≥ 1 s × 2 ch`), packet-loss (`≥ 0.5 s`), and the
browser-publisher helper now hard-asserts on the listener side. browser-publisher helper now hard-asserts on the listener side.
- Suite-mode runs are stable post-merge (5/5 sweeps green on Hot-swap kept a (now-documented) soft-pass on the browser
`HangInteropTest` × hardened `BrowserInteropTest`). CI gating tier — Chromium's `@moq/lite` 0.2.x re-attach across
follow-up: `2026-05-07-cross-stack-interop-ci-gating.md`. `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 ## Files referenced
@@ -440,22 +440,25 @@ relay-side timing under load.
## CI integration ## CI integration
**Not wired.** Intentionally kept out of `.github/workflows/build.yml` **Wired** as of 2026-05-07 (commit `21947bc5`). Both
for now — the full suite shows ~33% flake on `hang-interop` and `browser-interop` jobs in
`late_join_listener_still_decodes_tail` (catalog cancelled, race `.github/workflows/build.yml`, gated on `lint`, `ubuntu-latest`,
between speaker's `setOnNewSubscriber` hook and the listener's 30 min timeout each, with cached cargo + bun + Playwright Chromium.
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.
The suite runs locally via `-DnestsHangInterop=true` and is Stability bar that unblocked CI: **10/10 BUILD SUCCESSFUL × 22
documented as the regression bar for any future MoQ wire-format tests = 220/220 pass** on the merged branch (~5m 28s per sweep,
or moq-lite session-cycle changes. Re-evaluate CI gating after the steady state). The earlier `late_join_listener_still_decodes_tail`
late-join flake's root cause lands. 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 The 2-week post-merge CI green-rate watch is on the maintainer
"locally only via `-DnestsBrowserInterop=true`" rule pending its own who lands this: ≥ 95 % required per the plan's stability gate;
flake assessment. otherwise pull both jobs and reopen the routing investigation.
## Pending follow-ups ## Pending follow-ups
@@ -1,10 +1,15 @@
# Plan: wire CI gating for the cross-stack interop suite # Plan: wire CI gating for the cross-stack interop suite
**Status:** specced — pickup ready. **Status:** ✅ CLOSED 2026-05-07. Both jobs wired in commit
**Depends on:** `21947bc5` (path-tweaked from the original removed shape per
- `2026-05-07-moq-relay-routing-investigation.md` closed the `nestsClient/tests/browser-interop/` move). Stability-bar
- `2026-05-07-tighten-cross-stack-assertions.md` closed sweep: **10/10 BUILD SUCCESSFUL × 22 tests = 220/220 pass.**
- 5/5 sweep stability verified 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 This is the FINAL step of the T16 closure. With stable hard-pass
suites, CI gating becomes safe and meaningful. 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)`) different ports (NativeMoqRelayHarness reserves `ServerSocket(0)`)
so they're independent at the network level. so they're independent at the network level.
## Stability bar ## Stability bar — verified ✅
Before flipping the CI switch, run:
``` ```
for i in 1 2 3 4 5 6 7 8 9 10; do for i in 1..10; do
echo "=== run $i ==="
./gradlew :nestsClient:jvmTest \ ./gradlew :nestsClient:jvmTest \
--tests HangInteropTest \ --tests HangInteropTest --tests BrowserInteropTest \
--tests BrowserInteropTest \ -DnestsHangInterop=true -DnestsBrowserInterop=true --rerun-tasks
-DnestsHangInterop=true \
-DnestsBrowserInterop=true \
--rerun-tasks 2>&1 | grep -E "FAILED]|BUILD"
done done
``` ```
10/10 BUILD SUCCESSFUL. If even one fails, do NOT wire CI; loop Result: **10/10 BUILD SUCCESSFUL × 22 tests = 220/220 pass.**
back to the routing investigation. ~5m 28s steady state per sweep on the agent rig.
## CI runtime budget ## CI runtime budget
@@ -67,23 +67,22 @@ HangInteropTest with their current soft-pass assertions intact.
**Acceptance bar met.** 5/5 sweep with hard assertions. **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 > **Closed 2026-05-07** by commit `21947bc5`. Both
net positive (catches regressions, doesn't burn maintainer time > `hang-interop` and `browser-interop` jobs landed in
on false reds). > `.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.** **Acceptance bar met.** 10/10 sweep BUILD SUCCESSFUL × 22 tests
- Re-add `hang-interop` job (was at commit `6829ab727`'s parent; = **220/220 pass** (~5m 28s steady state per sweep on the agent
`git show 6829ab727 -- .github/workflows/build.yml` reverse rig). The first 2 weeks of post-merge CI runs still need a
gives the exact diff). maintainer to monitor flake rate (per the plan's "≥ 95% green
- Re-add `browser-interop` job (same pattern, plus bun + rate" gate); pull the jobs again if it falls below.
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.
## Independent track — `2026-05-07-framespergroup-production-rerun.md` ## Independent track — `2026-05-07-framespergroup-production-rerun.md`