Skip to content

feat(net)!: drop moq-transport drafts 14 through 17 - #6753

Merged
kixelated merged 52 commits into
mainfrom
quest/m1/ietf-drop/d14-17
Oct 27, 2026
Merged

kixelated merged 52 commits into
mainfrom
quest/m1/ietf-drop/d14-17

Conversation

@kixelated

@kixelated kixelated commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Claims and completes quest/m1/ietf-drop/d14-17.md, including the request-ID history decision moq-dev/moq#6707 added to it.

moq-net and @moq/net no longer speak moq-transport drafts 14 through 17. A peer offering only those versions, by ALPN or in the moql SETUP, fails the handshake. The legacy control-stream adapter (ietf/adapter.rs, js/net/src/ietf/adapter.ts), legacy SETUP negotiation, the request window and its limit, and the draft-17 varint family are gone.

Decisions

  • ✅ Request-ID reuse is no longer detected. The maintainer: "who cares about reuse". A peer's request IDs cost one counter: any ID below the highest it used is accepted, a wrong-parity ID still closes with INVALID_REQUEST_ID, and the 240,000-run history and its INTERNAL_ERROR refusal are gone. On draft 18 and later each request owns its stream, and the only state keyed by request ID is Publisher::joins, so a reused ID only confuses the reusing peer's own joining FETCHes. AUTH state is per stream, so a reuse cannot reach another grant. Our GOAWAY now names one past the highest peer ID as its cutoff, so a lower ID still in flight on a reordered stream is processed as promised (goaway_freezes_request_admission_at_current_progress expects 6 where it expected 2). @moq/net never sends GOAWAY, so it keeps only the parity check (checkPeerRequestId). The request-ids benchmarks in both languages measured the removed history, so they go.

Impact

  • Breaking, Rust (moq-net): ietf::Version::Draft14 through Draft17 are removed. Migrate by speaking draft 18 or later, or moq-lite. session::Limits::requests is removed; drop the field, stream credit bounds every request.
  • Breaking, JS (@moq/net): the "moq-transport-14" through "moq-transport-17" version names throw a TypeError. Migrate by naming draft 18 or later. The removed ietf/ codecs were not exported.
  • Breaking, relay config: [limits.client] and [limits.peer] requests is refused at startup; delete it.
  • Wire, request IDs: a reused peer request ID is accepted instead of closing with INVALID_REQUEST_ID, and a peer skipping many IDs no longer hits INTERNAL_ERROR. Our draft 18+ GOAWAY names one past the highest peer request ID rather than the lowest skipped one.
  • Wire: the moq-00, moqt-15, moqt-16, and moqt-17 ALPNs are no longer offered or accepted. The moql SETUP (no ALPN, or moql) negotiates only moq-lite, lite-01 through lite-07 since main's moq-dev/moq#6828, and keeps lite-01/02's draft-14 u16 size framing with QUIC varints whichever version it selects; both sides refuse an IETF version there. No published wire layout changes.
  • Bindings, CLI, and docs examples move to moq-transport-18; MIGRATE.md in both packages gains an entry.

Choices made

  • The moql SETUP keeps one lite-only codec with the u16 size framing and QUIC varints that lite-01/02 shipped with. Main's moq-dev/moq#6828 framed it as draft 14; with draft 14 gone, both sides frame it as lite-01 (Rust) or lite-02 (JS), the same bytes, so a lite-07 selection still sends no leading-ones varint before the hand-off. stalled_setup_reply_is_closed_at_the_deadline now offers only lite-02, since a newer lite version is answered during accept rather than in ok().
  • Reset codes decode the same on every version: shared codes map alike, and an unshared one maps to INTERNAL_ERROR.
  • The Cloudflare smoke lane follows cloudflare/moq-rs's draft-18-dev branch, since its default branch speaks only draft 16.
  • The interop control client keeps only its status mode; the credit mode tested the removed request window.
  • Draft-16's unregistered filter type test moves to draft 18, which the Moxygen smoke lane now pins.
  • dial_split_horizon's anonymous dial, where neither side declares a hop, moves from draft 16 to moq-lite-01, which carries no hop either; draft 18 keeps a named-hop case. A draft-18 peer declaring hop 0 is not reachable through our own origin, which refuses hop 0 locally. Making the dialer skip its per-dial hop fails the test.
  • Quests naming 14-17 are rewritten; the epic README keeps its rationale, and audit-interop lists 14-17-only peers as unsupported.
  • Main's SETUP tokens (moq-dev/moq#6177) ride only the uni SETUP, since the moql SETUP now negotiates lite alone, and the two-relay conformance cell from moq-dev/moq#6729 runs on draft 18 only.
  • Multi-group FETCH from moq-dev/moq#6724 now writes and reads no end-of-group or end-of-track status objects, since drafts 18 and 22 carry none. subscribe-ranges/ietf.md is gone, since main's moq-dev/moq#6815 finished it.
  • Main's IETF range updates (moq-dev/moq#6815) keep their update Request IDs, since a draft 22 fill stream names the update that asked for it; on draft 18 and later REQUEST_OK names none, so @moq/net's pause and resume path carries only that ID. Their range tests, the ietf_range_updates_interop lane, and the JS range-update test run on drafts 18 and 22.

Checks

  • Merged origin/main at b691105, 83d97be, 8862064, e76fc8c, bb8db18, 858a93a, 3c41865, 25cd95e, 5388028, c70f52d, 73f0082, 2adc1c0, 62d1907, 6d8f4f8, and c764ace (no rebase). Merge 1 had dropped the cooperative budget in main's skip_fetch_payload; 0d22fda restores it. Conflicts since the last review: moq-dev/moq#6815's range updates (resolved onto the 18+ code: no draft-14 Start Location, no draft-15/16 answer IDs, sends_timescale gone), moq-dev/moq#6899's announce slots and peer-violation closes (kept without the draft-14/15 duplicate refusal), moq-dev/moq#6904's element tests (main's), and moq-dev/moq#6834's per-connection tokens (its credential handle threads through the lite-only legacy paths; its draft-14 session test is dropped; binding docs say draft-18+), moq-dev/moq#6750's lifecycle rename (applied to the PR's draft-18 tests; its draft-14 status-object tests are dropped), and moq-dev/moq#6909's six lite fuzz roundtrips (kept at kinds 22-27; the lite SETUP pair this PR moved out of ietf_wire now sits at 28 and 29). moq-dev/moq#6751's renames are carried into this PR's code (stats::Message in the IETF control classifier and SETUP codecs, Session::allocator(), track::Consumer::info()), its edits to the deleted ietf/adapter.rs and adapter.ts are dropped, both MIGRATE entries are kept, and its binding docs say draft-18+. moq-dev/moq#6905's accept timeout and signal are kept, without the removed legacyPeerImplementation, and its malformed-SETUP test expects the moql SETUP's own type error. Comments still saying draft-17+ now say draft-18+. moq-dev/moq#6843's lifetime-free Path and Relative are carried into this PR's code (Path::from_static for literals, Path::new(..).unwrap() in tests, no PathOwned); its edits to the deleted ietf/adapter.rs, the draft 14-17 messages and tests, and the Hidden::beyond top-up rule this PR removed are dropped, and its new too-long-namespace publisher test expects REQUEST_ERROR on every remaining version. Both MIGRATE entries are kept. Main's new tests and docs naming drafts 14-17 now name 18 and 22; feat(auth)!: per-connection tokens with an answer, and a grant consumer #6834's auth_refuses_a_token_nothing_carries runs on moq-lite-06, the only binding-reachable session without AUTH.
  • Also dropped @moq/net integration cases labelled draft-17 that already ran draft 18, and auth.ts now says draft-18+.
  • On head ea45122 (after merging refactor(net)!: Path and Relative lose their lifetime #6843): just check ran every selected lane and passed, toml included (flake and swift skip locally as below); regenerated index.api.md and moq.dart match (the Dart generator's blank-line-only output is discarded, since the lints package does not resolve locally). cargo clippy -p moq-net --all-targets --all-features -- -D warnings, cargo test -p moq-net --all-features (fuzz seeds_reach_every_arm and regressions included), and just test interop --all pass.
  • On head c6268a7 (after merging refactor(net)!: moq-net names say one thing #6751 and fix(net): align transport and reader behavior across runtimes #6905): just check ran every selected lane and passed, toml included (flake and swift skip locally as below); generated index.api.md and moq.dart match main. cargo test -p moq-net --all-features passes (fuzz seeds_reach_every_arm and regressions included), and just test interop --all passes. Earlier, on head 0b71d54: just check ran every selected lane (rs, js, py, c, cpp, kt, go, dart, drafts, markdown, gh, quest, shell, toml, nix, justfile) and passed; flake skips itself (no user namespaces) and swift has no local toolchain. An earlier run on this merge saw ietf blind handle picks up a publisher that arrives late fail once under full load; it passed on every rerun (see Follow-ups). cargo test -p moq-net --lib fuzz:: passes (seeds reach every arm, regressions replay). just test interop --all passes, including ietf_range_updates_interop. quest check passes.
  • Not run: test/interop/relay-log.test.sh, the smoke and conformance lanes (they need docker or external peers).

Follow-ups

  • integration: ietf blind handle picks up a publisher that arrives late can see active go undefined after the DOES_NOT_EXIST refusal when the machine is loaded; worth a flake quest.

🤖 Generated with Claude Code

(Written by Claude Opus 5.5)

kixelated and others added 9 commits October 25, 2026 00:00
Tests, the relay, JS, CI, and docs still to follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…terop, docs, and quests

@moq/net removes DRAFT_07 and DRAFT_14..17, their ALPNs, and the
control-stream adapter; the moql SETUP negotiates only lite-01/02, and
both sides refuse an IETF version offered there. Interop clients, the
token cross-language vector, IETF drafts, docs, MIGRATE guides, and
quests move to draft 18 and later. The draft-16 unregistered filter type
test moves to draft 18 for the Moxygen smoke lane.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mance run

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title Drop moq-transport 14-17 feat(net)!: drop moq-transport drafts 14 through 17 Oct 25, 2026
@kixelated
kixelated marked this pull request as ready for review October 25, 2026 11:56
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-27T11:58:46.672994Z ea45122 New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed commit: 86d747d

No actionable bugs found in static review. Removing the legacy adapter, request window and obsolete codec branches meaningfully simplifies the retained draft-18+ paths. Lite-01/02 negotiation retains its existing u16 framing, and skipped-request-ID history remains bounded after removal of the configurable request limit.

The documented anonymous-dial coverage gap and file-by-file-only JavaScript test result remain verification follow-ups, not newly discovered defects. Cloudflare/Moxygen smoke changes still need external interoperability validation.

Verification: inspected Rust/JS negotiation, request/session lifecycle, retained codecs, error mapping, limits and relevant regression changes. No builds, tests or external-peer interoperability run; author-reported results were not independently verified.

Draft 16 was the only moq-transport version where neither side declares a
hop. moq-lite-01 carries none either, so the anonymous dial keeps its
coverage, and draft 18 keeps a named-hop case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@kixelated kixelated left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review by review (OpenAI)

Reviewed commit: 2036e94

No new actionable bugs found. The previous anonymous-dial coverage gap is addressed: the shared split-horizon scenario now runs both named draft-18 peers and anonymous lite-01 peers, checking namespace echo suppression and subscription routing in each case. Reusing one scenario keeps assertions consistent without duplicating the test implementation.

Verification: static comparison against 86d747d and inspection of the updated test and relevant handshake behavior. Tests were not run. Earlier full-suite and external-interoperability verification limits are unchanged.

kixelated and others added 3 commits October 25, 2026 09:54
Main dropped drafts 19 through 21 (#6754), so the remaining IETF set is
drafts 18 and 22. Version lists collapse to [18, 22], draft-19/20 stand-ins
become draft-22, the draft-20/21 filter field encoding goes, and the draft-22
fuzz regressions take 6753's inputs re-indexed for the shorter version table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claimed group and joining fetches now wait for stream credit (#6702); with no
request window left, they take their ID synchronously once the stream opens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated added this pull request to the merge queue Oct 25, 2026
@kixelated

Copy link
Copy Markdown
Collaborator Author

Audit note: moq-dev/moq#6798 rewrites three quests this PR's sweep missed (the regex misses plural "drafts"):

  • ietf-request-cancel now Requires d14-17 (maintainer: drop the older drafts).
  • ietf-takeover's drafts 17-22 are now drafts 18 and 22.

Still on you here:

  • The ietf-extension/README.md "drafts 16 and 18" lines.
  • ietf-lazy-discovery's 14/15 rationale.

(Written by Claude Opus 5.5)

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 25, 2026
# Conflicts:
#	doc/lib/dart/index.md
#	doc/lib/kt/index.md
#	doc/lib/swift/index.md
@kixelated
kixelated enabled auto-merge October 25, 2026 18:50
@kixelated
kixelated added this pull request to the merge queue Oct 25, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 25, 2026
The adapter's lost-AUTH change (#6734) goes with the adapter; its session
tests move to draft 18. The JS overlapping SUBSCRIBE_NAMESPACE wait (#6714)
keeps only its stream-cancel path, and the moql SETUP tests from
Client::with_url (#6749) drop their draft-14 case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 27, 2026
kixelated and others added 4 commits October 27, 2026 02:30
Carry #6751's renames into the draft 14-17 removal: stats::Message,
Session::allocator(), track info(), and keep both MIGRATE entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep #6905's accept timeout and signal; legacyPeerImplementation stays
removed with the draft 14-16 bidi SETUP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Re-landing after moq-dev/moq#6751 and moq-dev/moq#6905 merged. Merged origin/main twice (no rebase):

  • refactor(net)!: moq-net names say one thing #6751's renames (stats::Message, Session::allocator(), track::Consumer::info()) are carried into this PR's IETF code, its edits to the deleted ietf/adapter.rs are dropped, and both MIGRATE entries are kept.
  • fix(net): align transport and reader behavior across runtimes #6905's accept timeout and signal are kept without legacyPeerImplementation, and its malformed-SETUP test now expects the moql SETUP's own type error.
  • Remaining draft-17+ comments say draft-18+.
  • Fuzz kinds (lite roundtrips 22-27, SETUP 28-29) and every kio::coop::Budget site match main.

just check, cargo test -p moq-net --all-features, and just test interop --all pass. The optional CodeQL alert is at rs/moq-tokio/src/server.rs:1408, code this PR does not touch. Landing c6268a7.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 27, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 27, 2026
Carry #6752's requests() rename; drop the draft 14-16 subscriber tests it renamed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Merged main (641c41e) after moq-dev/moq#6752 landed:

Local: just check (all lanes), cargo test -p moq-net --all-features (fuzz seeds_reach_every_arm, regressions), and just test interop --all pass.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 27, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 27, 2026
Port drafts 14 through 17 removal onto lifetime-free Path and Relative (#6843).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Collaborator Author

Re-landing after the merge queue dropped this on a conflict with moq-dev/moq#6843.

(Written by Claude Opus 5.5)

@kixelated
kixelated added this pull request to the merge queue Oct 27, 2026
Merged via the queue into main with commit 22808bb Oct 27, 2026
11 of 12 checks passed
@kixelated
kixelated deleted the quest/m1/ietf-drop/d14-17 branch October 27, 2026 12:24
kixelated added a commit that referenced this pull request Oct 27, 2026
Draft 14 is gone, so the trailing-slash namespace seed now runs as draft 18.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated added a commit that referenced this pull request Oct 27, 2026
Main's tip is the squash of #6753, whose tree matches the head merged before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated added a commit that referenced this pull request Oct 27, 2026
…ect-drop

Keep #6753's draft-22-only selection while retaining this branch's typed-ID, plain-reader and late-object-0 datagram assertions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant