Repository navigation
fix: m0 interop audit - #6255
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…scriber Draft-14 predates WebTransport subprotocols, so a peer that accepts moq-00 picks draft-14 over a newer draft both support. Offer moql instead and negotiate in SETUP, as js/net does. Draft-14 and draft-15 cannot ask for the empty namespace, so the CLI subscriber discovered nothing from moxygen. Scope it to the consumed broadcasts, as the HLS and RTC exports scope theirs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
draft-ietf-webtrans-http3 §4.4 resets and stops a closed session's streams with WT_SESSION_GONE, which surfaced as an invalid RESET_STREAM. Report the session's close reason instead, and log unknown capsules at DEBUG. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each Writer primitive issued its own stream write, so an IETF control message went out as a type, a u16 length, and a body. Message.write now buffers the type and the encoded message and writes them once, as Rust does, and Message.encode (both IETF and lite) writes its size and body in one write too. A message that fails to encode still leaves nothing on the stream, and two writers can no longer interleave inside a message. Writer.collect replaces the scratch Writers that ietf/message.ts, lite/message.ts, ietf/object.ts, and lite/subscriber.ts each built. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first error-looking line was often teardown noise after the timeout. Lead with the stage (connected, SUBSCRIBE sent, SUBSCRIBE_OK, headless groups) and keep the first error, minus capsule teardown, as the detail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cloudflare's draft-16 relays require a provisioned token in the URL path and close anything else with "scope resolution failed", so these cells could never pass. The registry lists every other public relay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A browser has no raw QUIC, and the WebTransport CONNECT carries the URL's scheme, so moq-relay refused moqt:// (draft-18 §3.1.3 says to swap in https). This also covers a GOAWAY redirect to a moqt:// URI. A failed race now names each transport's error instead of Promise.any's empty message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Quest outcome (m0 interop audit): every red cell on the relays page and in the runner's 2026-10-22 nightly that has a moq.dev side has been classified. Fixes for our side are in this PR. Upstream bugs are filed or already tracked. What is down or unsupported is recorded in The PR stays a draft until the maintainer settles the four open decisions in the description. The two that matter most:
(Written by Claude Opus 5.5) |
Drop the public `Versions::web_protocols()`: the two WebTransport clients map `moq-00` to `moql` themselves, so moq-net's API is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 20 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 891582a011
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The Rust CLI logs SUBSCRIBE_OK only at DEBUG, so at INFO a Rust cell that sent SUBSCRIBE and timed out was reported as accepted. Say the OK was not logged unless a positive marker appears. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 17d3414d1a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A WT_SESSION_GONE reset can beat the CloseWebTransportSession capsule. Reporting it as `Closed(0, "")` claimed a clean close and hid the real code; `WebTransportError::SessionGone` says only that the session is gone, and the recorded reason replaces it once known. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: deccd90855
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
moq-lite clients already ask only for watched prefixes (#6165), and moq-mux Source watches the sibling broadcasts a catalog references, so the subtree scope only lost those siblings. The moxygen draft-14 cell stays red until IETF lazy discovery asks for watched prefixes too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The PUBLISH and SUBSCRIBE_TRACKS control writes that main added to js/net's IETF publisher go through Message.write, so they too go out in one write. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It owns the moxygen draft-14 CLI cell now that the CLI does no subscriber scoping of its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review (Written by Claude Opus 5.5) |
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
recv.rs's map_error is now a free function shared with poll_lease, so the WT_SESSION_GONE mapping moves into it and covers leased reads too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review (Written by Claude Opus 5.5) |
|
Codex Review: Didn't find any major issues. Can't wait for the next one! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
The union renewal flake was the publisher writing REQUEST_OK's type and body in two writes: the shared write budget can yield to the host after any write, and under load the subscriber's FIN landed in that gap, so the publisher FINed after a bare type and the subscriber closed the session as malformed. #6255 already made every JS message one write; this pins that with a test that yields after every write, and closes the rest: - JS: the IETF subscriber no longer sends an update of defaults when its last subscriber leaves (the logged priority=255 was that), matching lite and Rust, and an update that fails to encode ends the track loudly instead of being swallowed. - Rust: every IETF control message buffers its type with its body, all or nothing, via Writer::buffer_message / encode_message, so a failed encode or a cancelled write can no longer strand a bare type for the next write or a FIN to complete. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EeyiEy5FWz3z44DYZVo7vU
Runs the m0 interop audit over the relays page and the runner's 2026-10-22 nightly, fixes what was ours, reports what was theirs, and schedules the m1 run.
Fixes (one commit each)
moq-tokio,moq-wasm): stop offeringmoq-00as a WebTransport subprotocol. Draft-14 predates WT subprotocols, and moxygen picked it over draft-16. Draft-14 now ridesmoqland negotiates in SETUP, as js/net already does. Each client maps the ALPN list itself, so moq-net's API is unchanged.moq-tokio): a stream reset or stopped with 0x170d7b68 now reads as the session's close reason, notinvalid RESET_STREAM. If it beats the close capsule, it reads asWebTransportError::SessionGonerather than a guessed clean close. Unknown capsules log at DEBUG.write.Message.writeandWriter.collectreplace four copies of the scratch-writer code.moqt://: amoqt://ormoql://URL, including a GOAWAY redirect, dials WebTransport athttps://(draft-18 §3.1.3). Before, the CONNECT carried:scheme: moqtand moq-relay dropped it. A failed race now names each transport's error instead ofPromise.any's empty message.failure_reason: leads with the last stage the subscriber reached (not connected, nothing subscribed, no SUBSCRIBE_OK, only headless groups, no objects), then the first error minus capsule teardown noise. The Rust CLI logs SUBSCRIBE_OK only at DEBUG, so a Rust cell says so instead of claiming an OK.Expected red
moqCLI) stays red until IETF lazy discovery lands, now promoted to m1 because it owns this cell. moq-net never asks draft-14/15 for the empty namespace, and moxygen announces nothing unasked. A CLI subtree scope fixed the cell but lost catalog-referenced siblings (Codex P1), so it was dropped: moq-dev/moq#6165 made moq-lite ask only for watched prefixes, and moq-muxSourcewatches the siblings, so lite needs no scope.Rechecked
rendezvous-timeout0x10 was already fixed on main in fix(net): answer IETF requests with draft policy #5616, waiting on release.Public API and wire impact
moq-tokioandmoq-wasm.moqlinstead ofmoq-00in WT-Available-Protocols. The server side is unchanged and still acceptsmoq-00from released clients.quic::web::WebTransportError::SessionGoneto a#[non_exhaustive]enum. Additive, so no MIGRATE entry.moqt:/moql:URLs now connect over WebTransport instead of failing. No exported symbols change.Upstream
The full classification, including what is unsupported, down, or not yet reported, is in the successor quest
quest/m1/audit-interop.md.Decisions (settled by the maintainer)
subtree(--broadcast)fixed moxygen draft-14 but lost catalog-referenced siblings, such as a transcode's.source (Codex).Versions::web_protocols()as public API.moq-tokioandmoq-wasmwith a string filter (chosen, implemented).Checks
just checkon485927d030(after merging main): the rs (including the moq-wasm wasm32 build and clippy), js, and quest steps pass. The flake step fails building the GitHub runner VM image (unshare: write failed /proc/self/uid_map), a sandbox limit of this machine unrelated to this diff.cargo test -p moq-tokio --lib web_protocolsandquic::webbun testfor js/net: the full suite (2637 tests) passes on485927d030, which also routes the PUBLISH and SUBSCRIBE_TRACKS writes main added throughMessage.writejust test interop --all: all 119 checks pass on485927d030(107 of 107 ondeccd90855; the count changed with the cases main added since), including every language against the Rust relay over WebTransport.test/smokejust checkpasses.deccd90855'smoq(before the CLI scope was dropped): run against moxygen, Cloudflare, imquic, MOQtail, aiomoqt, moqx, red5, and moqt-nr.Follow-ups
:schemewith 400 rather than dropping the stream (moq-tokioConnecting::accept).js-webpublisher cells after JavaScript FETCH lands.🤖 Generated with Claude Code
(Written by Claude Opus 5.5)