From 5e91285f9f5aa8f076b25374f29c3417411e37c9 Mon Sep 17 00:00:00 2001 From: Luke Curley <432854+kixelated@users.noreply.github.com> Date: Fri, 16 Oct 2026 10:30:12 -0700 Subject: [PATCH 1/3] chore: claim WebTransport refusal verification quest From 0558ddf4d0cb45854d23df2a094ad4bb37fd11cd Mon Sep 17 00:00:00 2001 From: Luke Curley <432854+kixelated@users.noreply.github.com> Date: Fri, 16 Oct 2026 10:52:22 -0700 Subject: [PATCH 2/3] docs(quest): finish WebTransport refusal delivery verification Co-Authored-By: GPT-6 --- quest/m1/test-flakes-2/README.md | 1 - quest/m1/test-flakes-2/interop-close-code.md | 43 -------------------- 2 files changed, 44 deletions(-) delete mode 100644 quest/m1/test-flakes-2/interop-close-code.md diff --git a/quest/m1/test-flakes-2/README.md b/quest/m1/test-flakes-2/README.md index 0376b8fa00..787eb7c0bd 100644 --- a/quest/m1/test-flakes-2/README.md +++ b/quest/m1/test-flakes-2/README.md @@ -36,7 +36,6 @@ Public API: none. Wire: none. ## Required - [TS decoded content](/quest/m1/test-flakes-2/ts-video-content.md) - CI's TS compliance decoded-content checks fail only on real loss, and the exporter names every frame it drops -- [Interop close code](/quest/m1/test-flakes-2/interop-close-code.md) - the browser reliably sees `unauthorized` for a refused session - [Auth refresh mocks time](/quest/m1/test-flakes-2/auth-refresh-mock-time.md) - moq-relay's auth refresh and fixed-lease tests measure a grant's life on one mocked clock - [uring teardown close](/quest/m1/test-flakes-2/uring-teardown-close.md) - moq-uring's published-close teardown test holds under load, fixed at its cause - [js -> go rewind](/quest/m1/test-flakes-2/js-go-rewind.md) - the `js -> go` interop cell never reads a frame below the previous group's start, fixed on the side that produced it diff --git a/quest/m1/test-flakes-2/interop-close-code.md b/quest/m1/test-flakes-2/interop-close-code.md deleted file mode 100644 index 0a383d8687..0000000000 --- a/quest/m1/test-flakes-2/interop-close-code.md +++ /dev/null @@ -1,43 +0,0 @@ -# [S] Adopt reliable WebTransport refusal delivery - -## Goal - -MoQ carries the acknowledged close fix, and the Interop browser close-code -test reliably reports a refused session as `unauthorized`, never as -"Connection lost". - -## Plan - -The cause is established in [moq-dev/noq#40](https://github.com/moq-dev/noq/pull/40): -the adapter started its 100 ms force-close grace before the reliable CLOSE -capsule was acknowledged. An auth-response barrier and UDP fault gate paired -Chromium netlog with relay logs: refusal packets were still dropped when the -server sent APPLICATION CONNECTION_CLOSE, and raw `WebTransport.closed` -rejected without a local JavaScript close. The earlier HTTP/3 stream-lifetime -and client `sessionCause` fixes were already present. - -The source fix waits for reliable capsule delivery before the existing -teardown grace and cancels when the connection ends. Its delivery regression -fails without the fix; its cancellation regression bounds the close task's -lifetime. Source formatting, Clippy, docs, 535 tests, and publish dry-run -passed. Full `just test interop --all` passed with an adapter-only temporary -patch, including Chromium's exact code 2 and `unauthorized`. That patch was -removed; no unpublished dependency belongs in this adoption. - -- `main` already carries the fix: #5664 copied `web-transport-moq` from - moq-dev/noq#40's merge commit into moq-tokio's `quic::web`, with its regressions - (`close_waits_for_capsule_ack`, `close_ack_wait_ends_with_connection`). -- Run strict `just check` and `just test interop --all` on `main`, - preserving the exact refusal assertion and the source regression. Do not - retry for green, increase the grace, or accept alternate errors. -- Recommend a `release` backport after main lands. That branch pins the - 1.3.5 adapter, so verify its exposure and use a compatible 1.3.x source - backport/release if needed; never move the published line to 2.x as a fix. - Split any required source-release condition before starting its pin PR. - -Public API: none expected. Wire: existing CLOSE capsule framing and codes -are unchanged; refusal delivery is corrected. - -## Related - -- [Source fix](https://github.com/moq-dev/noq/pull/40) - deterministic delivery and cancellation regressions, plus the paired browser/relay evidence From ad116e4977a7e5f0f0e546929d8aea4342ecfe8f Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 16 Oct 2026 16:29:14 -0700 Subject: [PATCH 3/3] docs(quest): track the release backport of the acknowledged-close fix Co-Authored-By: Claude Opus 5.5 --- quest/m0/README.md | 4 ++++ quest/m0/refusal-close-backport-upstream.md | 22 +++++++++++++++++++++ quest/m0/refusal-close-backport.md | 21 ++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 quest/m0/refusal-close-backport-upstream.md create mode 100644 quest/m0/refusal-close-backport.md diff --git a/quest/m0/README.md b/quest/m0/README.md index cd2eefceab..c5d9d56797 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -83,6 +83,10 @@ have fixes on `main`: macOS tests (#5335), drill-sensitivity (#5338), loom - [qmux release backport](/quest/m0/qmux-credit-backport.md) - adopt the 0.5 fix independently of the next breaking cut +- [noq 1.3.x close fix](/quest/m0/refusal-close-backport-upstream.md) - a published 1.3.x `web-transport-moq` acknowledges the CLOSE capsule before teardown + +- [Refusal close backport](/quest/m0/refusal-close-backport.md) - `release` reports a refused browser session as `unauthorized`, never "Connection lost" + - [Lite SETUP backport](/quest/m0/lite-setup-backport.md) - `release` closes a moq-lite session on a repeated SETUP parameter or a second Setup Stream, in a later 0.14.x patch (#5521) - [Kotlin wrapper POM release](/quest/m0/kt-ffi-pom.md) - `dev.moq:moq` 0.5.2 ships from `release`, its POMs naming moq-ffi at `[0.4.3,0.5)` diff --git a/quest/m0/refusal-close-backport-upstream.md b/quest/m0/refusal-close-backport-upstream.md new file mode 100644 index 0000000000..aa14e462c0 --- /dev/null +++ b/quest/m0/refusal-close-backport-upstream.md @@ -0,0 +1,22 @@ +# [S] noq releases the acknowledged-close fix on 1.3.x + +## Goal + +A `web-transport-moq` 1.3.x after 1.3.5 is on crates.io with the +acknowledged-close fix from [moq-dev/noq#40](https://github.com/moq-dev/noq/pull/40), +so a refused WebTransport session delivers its CLOSE capsule before teardown. +Check crates.io for a 1.3.x newer than 1.3.5. Delete this condition once it +ships. + +## Plan + +Backport noq#40's merge commit (e27c0ce) to noq's `release/1.3`, following +its existing `-1.3` fix branches, with both regressions: +`close_waits_for_capsule_ack` and `close_ack_wait_ends_with_connection`. +Never move the published line to 2.x as the fix. + +Public API: none. Wire: none; the CLOSE capsule is delivered, not changed. + +## Related + +- [Release pin](/quest/m0/refusal-close-backport.md) - adopts the published fix diff --git a/quest/m0/refusal-close-backport.md b/quest/m0/refusal-close-backport.md new file mode 100644 index 0000000000..3f6f919861 --- /dev/null +++ b/quest/m0/refusal-close-backport.md @@ -0,0 +1,21 @@ +# [XS] Backport the acknowledged-close pin to release + +## Goal + +On `release`, a browser refused by the relay reliably sees `unauthorized` +(close code 2), never "Connection lost", because the release line pins a +`web-transport-moq` 1.3.x with the acknowledged-close fix. + +## Plan + +`release` pins `web-transport-moq` 1.3.5, which starts the 100 ms teardown +grace before the CLOSE capsule is acknowledged. `main` already carries the fix +in moq-tokio's `quic::web` (#5664). Once the 1.3.x fix ships, bump the +release-line pin and run `just test interop --all`, keeping the exact browser +refusal assertion. Follow the backport workflow. + +Public API: none. Wire: none. + +## Required + +- [noq 1.3.x publication](/quest/m0/refusal-close-backport-upstream.md) - the release-line fix is available