From b8fa72b572b758fe96ad69b30607aa2f8fc6a361 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 16 Oct 2026 09:07:34 -0700 Subject: [PATCH 1/4] chore(quest): claim quest/m1/quic/fork Co-Authored-By: Claude Opus 5.5 From 312e3e551a86fbc194392b751baa791b8604384b Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 16 Oct 2026 09:11:17 -0700 Subject: [PATCH 2/4] docs(quest): finish the hard fork epic moq-dev/noq is frozen in moq-dev/noq#41, and every carried change in its CHANGELOG-MOQ.md is ported or recorded as not applicable in #5664. Delete the epic and drop its Required entries, rewording the prose that waited on the switch. Co-Authored-By: Claude Opus 5.5 --- quest/m1/README.md | 3 +- quest/m1/quic/README.md | 12 +++--- quest/m1/quic/fork/README.md | 65 ------------------------------ quest/m1/quic/peer-limits.md | 10 +---- quest/m1/quic/reliable-reset.md | 4 -- quest/m1/quic/scheduler.md | 4 -- quest/m1/quic/send-errors.md | 4 -- quest/m1/quic/shard.md | 4 -- quest/m2/noq-socket-close.md | 4 -- quest/m2/perf/README.md | 8 ++-- quest/m2/perf/uring-copies.md | 4 -- quest/m2/perf/uring-one-enter.md | 1 - quest/m2/perf/uring-quiescence.md | 1 - quest/m2/quic-ack-hook.md | 8 ++-- quest/m2/quic-ack-progress.md | 6 +-- quest/m2/quic-bbr-natural-drain.md | 4 -- quest/m2/quic-deadline.md | 1 - quest/m2/quic-egress-profile.md | 4 -- quest/m2/quic-io-boundary.md | 1 - quest/m2/quic-keep-alive.md | 4 -- quest/m2/quic-probe.md | 4 -- quest/m2/quic-qmux.md | 1 - quest/m2/rate-quic.md | 8 ++-- quest/m3/cut-through/README.md | 3 +- quest/m3/cut-through/loss-delay.md | 4 -- quest/m3/quic-careful-resume.md | 4 -- quest/m3/quic-ecn.md | 1 - quest/m3/quic-gcc.md | 4 -- 28 files changed, 20 insertions(+), 161 deletions(-) delete mode 100644 quest/m1/quic/fork/README.md diff --git a/quest/m1/README.md b/quest/m1/README.md index c589857182..a24275f135 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -65,8 +65,7 @@ above them. - [Cluster routing](/quest/m1/cluster-routing/README.md) - prove shared routing contracts, implement per-origin routes, and connect outbound local clusters - [P2P](/quest/m1/p2p/README.md) - application-selected peer sessions use shared priorities, routing, and same-epoch handover - [Routing guide](/quest/m1/routing-guide.md) - concepts and practical outbound federation/P2P setup -- [Controlled time](/quest/m1/time/README.md) - every crate and package reads time through moq-clock or @moq/clock, with regression tests for the changed contracts; ranks above the fork, whose switch adopts its instant -- [Hard fork](/quest/m1/quic/fork/README.md) - quinn hard-forked in-tree as `moq-quic`, ranked ahead of perf; the rest of the QUIC line follows it +- [Controlled time](/quest/m1/time/README.md) - every crate and package reads time through moq-clock or @moq/clock, with regression tests for the changed contracts - [Own the QUIC stack](/quest/m1/quic/README.md) - quinn hard-forked in-tree as `moq-quic`, carrying BBR, reliable reset, hierarchical scheduling, peer limits, and endpoint sharding - [Finalize moq-lite-07](/quest/m1/lite07-finalize.md) - when the maintainer cuts it, lite-07 negotiates as `moq-lite-07` and the next release ships it - [moq-transport passthrough](/quest/m1/ietf-extension/README.md) - subgroups, object IDs, properties, end status, datagram objects, and unknown track properties survive moq-transport -> moq-relay (and a relay cluster) -> moq-transport; moxygen's moq-test passes nightly diff --git a/quest/m1/quic/README.md b/quest/m1/quic/README.md index c320e8c3b6..c2fb3a8df8 100644 --- a/quest/m1/quic/README.md +++ b/quest/m1/quic/README.md @@ -3,8 +3,8 @@ ## Goal MoQ owns the QUIC features it needs in an in-tree stack, `moq-quic`, hard -forked from quinn (see [the fork](/quest/m1/quic/fork/README.md) for why -quinn and not noq). One core serves the tokio backend, the thread-per-core +forked from quinn rather than noq, whose multipath, NAT traversal, and QAD +MoQ never negotiates. One core serves the tokio backend, the thread-per-core `moq-uring` backend, and qmux; iroh stays on upstream noq. The features are BBR correctness, reliable stream resets, hierarchical stream scheduling with per-broadcast fairness, bounded incomplete-message memory, wider limits for @@ -19,9 +19,9 @@ careful resume, and a receive-timestamps spike toward GCC live in ## Plan Decided in the 2026-09-30 plan: the moq-dev/noq soft fork is replaced by a -hard fork of quinn in `rs/`, so every QUIC change here waits for -[the fork](/quest/m1/quic/fork/README.md). moq-dev/noq is frozen to -security patches for `release`. +hard fork of quinn in `rs/`, where every QUIC change here lands. +moq-dev/noq is frozen to security patches for `release` and archived once +no released MoQ crate depends on it. Older quests say "the fork" or "noq"; read that as `moq-quic`. Their steps to publish a fork release, pin it, or offer a change upstream are superseded: @@ -55,7 +55,6 @@ Decided in the 2026-09-30 audit: deadlines, qmux, BBR loss parity, ECN measurement, ACK progress, and the ACK hook moved to m2, since no m1 quest consumes them. Decided 2026-10-08: L4S and careful resume moved on to m3, and GCC shrank to a receive-timestamps spike, since none has a consumer. -The BBR app-limited fixes land in `moq-quic` without waiting for the switch. Decided in the 2026-10-10 receive-memory plan: native message assembly holds connection credit until complete-unit handoff, while stream credit advances @@ -67,7 +66,6 @@ cache limits remain separate; bitrate pacing composes with this memory cap. ## Required -- [Hard fork](/quest/m1/quic/fork/README.md) - quinn in-tree as `moq-quic`, with BBR3 and lazy stream slots, and MoQ switched onto it - [Retain connection credit](/quest/m1/quic/receive-credit.md) - native receivers own connection credit independently of stream reads - [Bound message assembly](/quest/m1/quic/receive-memory.md) - complete headers and frames return credit, and receiver priority cancellation restores progress - [Reliable stream reset](/quest/m1/quic/reliable-reset.md) - `RESET_STREAM_AT`, diff --git a/quest/m1/quic/fork/README.md b/quest/m1/quic/fork/README.md deleted file mode 100644 index 091f1bafe6..0000000000 --- a/quest/m1/quic/fork/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# [XS] Hard-fork quinn into the monorepo as moq-quic - -## Goal - -MoQ's QUIC stack lives in `rs/`, forked from quinn-rs/quinn `main`: -`moq-quic` (the sans-IO core), quinn-udp in `moq-sock`, and quinn's async -layer and `web-transport-moq` in moq-tokio. Every MoQ QUIC path (moq-tokio -and moq-uring) runs on it, the `moq-noq*` dependencies are gone, and a QUIC change lands in the same -PR as the MoQ code that needs it. - -Out of scope: iroh keeps upstream noq (the `iroh` feature still compiles it for -iroh's controller factory), and multipath, NAT traversal, and QAD are not -carried. - -## Plan - -Decided in the 2026-09-30 plan, with reasons, so later sessions don't reopen -them: - -- **Hard fork, no merges.** The moq-dev/noq soft fork never merged upstream - (its weekly sync job failed on a workflow-permission error), n0-computer/noq - slowed to 5-7 commits a month in Aug-Sep, and n0's strict semver limits - what we can upstream, not what a fork can change. Upstream fixes are - cherry-picked by hand; offering our changes upstream is optional courtesy, - not tracked work. -- **Base on quinn, not noq.** quinn-proto is 32.9k lines against noq-proto's - 58.5k, about 15k of which is multipath, NAT traversal, and QAD that MoQ - never negotiates. Stripping those from noq was estimated at 2-3 weeks with - loss-recovery risk, and would leave every quinn fix a hand port. quinn ships - security fixes the day the advisory publishes (11 in 2026), and staying - close to its code keeps those cherry-picks cheap. The cost is re-porting - BBR3, the controller callbacks, and lazy stream slots, which is why MoQ - moved to noq in the first place (#1706, #3342, #3789). -- **Multipath is deleted**, and with it the multipath spike. -- **In-tree**, so `just check` and CI cover the stack, one PR spans the core - and its consumers, and `release` and `main` each carry their own copy instead of - double-landing fixes on the 1.3 and 2.0 fork lines. -- **One new crate, named by role**: `moq-quic`. Decided 2026-10-06: - quinn-udp becomes a `moq-sock` module, since both runtimes consume it, and - quinn's async layer and `web-transport-moq` become moq-tokio modules, - tokio-only, rather than `moq-quic-udp` and `moq-quic-tokio` crates. Each - import's first commit stays verbatim from upstream for diffability. The - imported code's README and license credit quinn and noq. -- **A break.** moq-tokio exposes `noq::Endpoint`, - `noq::TransportConfig`, and `noq::Incoming` publicly, so the crate swap is - a break. -- **Security folds into the fork.** Rebasing on quinn picks up the 2026 - advisories noq is missing; `release` stays on `moq-noq` until the next cut. - The fork does not replace iroh's upstream noq. -- **moq-dev/noq is frozen**: security patches for `release` only, archived once - no released MoQ crate depends on it. The other - [QUIC quests](/quest/m1/quic/README.md) wait for this line and land - in-tree. - -This README's own work: delete moq-dev/noq's `moq-sync.yml` and mark its -README frozen. Advisory triage is documented in `rs/moq-quic/README.md`. -Every carried change in moq-dev/noq's `CHANGELOG-MOQ.md` -is either ported by a child quest or recorded as not applicable in -[#5664](https://github.com/moq-dev/moq/pull/5664). - -## Related - -- [Shard the endpoint](/quest/m1/quic/shard.md) - the first feature the fork makes possible -- [Remove moq-uring copies](/quest/m2/perf/uring-copies.md) - cheap copy removals on the new core -- [Redesign the QUIC I/O boundary](/quest/m2/quic-io-boundary.md) - the breaking perf rewrite, gated on a profile diff --git a/quest/m1/quic/peer-limits.md b/quest/m1/quic/peer-limits.md index e246a8dbeb..c04d470731 100644 --- a/quest/m1/quic/peer-limits.md +++ b/quest/m1/quic/peer-limits.md @@ -14,9 +14,8 @@ The in-tree `moq-quic` `Connection` (`rs/moq-quic/src/connection/mod.rs`) already exposes runtime `set_max_concurrent_streams`, `set_receive_window`, and `set_send_window`; a raise queues `MAX_STREAMS` and `MAX_DATA` on the next packet, and a shrink is a debt paid as the peer consumes credit. The existing -setters provide this seam; the transport integration waits for -[the fork switch](/quest/m1/quic/fork/README.md), so moq-tokio and moq-uring -run on `moq-quic` instead of `moq-noq`. +setters provide this seam in `moq-quic`, which moq-tokio and moq-uring both +run on. Decided 2026-10-08: the relay's peer config surface already exists. A session is a cluster peer when its admitted grant is marked `peer`, and the @@ -45,8 +44,3 @@ unbounded assembly pool. Tests: a cluster session sees the raised `MAX_STREAMS` after SETUP and a viewer session does not; the io_uring path applies the same values; a `peer` table below the defaults is refused at resolve time. - -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - moq-tokio and moq-uring run on `moq-quic`, whose setters this calls - diff --git a/quest/m1/quic/reliable-reset.md b/quest/m1/quic/reliable-reset.md index 7087609d6a..0a24882b13 100644 --- a/quest/m1/quic/reliable-reset.md +++ b/quest/m1/quic/reliable-reset.md @@ -63,10 +63,6 @@ Track the unversioned draft during implementation. The planning baseline is draft 10, with transport parameter `0x1d` and frame type `0x24`; do not freeze provisional codepoints if the document changes before release. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - lands in `moq-quic`, not the frozen fork - ## Related - moq-net (`rs/moq-net/src/tail.rs`) and `@moq/net` (`js/net/src/tail.ts`) wait diff --git a/quest/m1/quic/scheduler.md b/quest/m1/quic/scheduler.md index b7da42d3b2..6cd79ee8e9 100644 --- a/quest/m1/quic/scheduler.md +++ b/quest/m1/quic/scheduler.md @@ -101,10 +101,6 @@ scheduler completion must not wait for that dependent integration. Preserve working behavior on backends not yet migrated, and remove queue code only where the new implementation makes it redundant. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - lands in `moq-quic`, not the frozen fork - ## Closes - [#699](https://github.com/moq-dev/moq/issues/699) - close this issue when the diff --git a/quest/m1/quic/send-errors.md b/quest/m1/quic/send-errors.md index 0bd8252e7e..db6bb1e1e8 100644 --- a/quest/m1/quic/send-errors.md +++ b/quest/m1/quic/send-errors.md @@ -20,10 +20,6 @@ Only fatal, destination-specific errors end the attempt; transient ones against an unroutable family, and check that moq-uring maps the same errors through its ring. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq_sock::udp` and moq-tokio's imported quinn layer - ## Related - [quinn#2766](https://github.com/quinn-rs/quinn/issues/2766) - the upstream issue diff --git a/quest/m1/quic/shard.md b/quest/m1/quic/shard.md index a8db361d0f..dd84fbb86f 100644 --- a/quest/m1/quic/shard.md +++ b/quest/m1/quic/shard.md @@ -37,10 +37,6 @@ own threading model. Update `doc/bin/relay/` for the flag change. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the stack has to be in-tree before the library can own sharding - ## Related - [UDP demux](/quest/m1/p2p/udp-demux.md) - demuxes each shard's socket; keep the demux over whatever the library hands out diff --git a/quest/m2/noq-socket-close.md b/quest/m2/noq-socket-close.md index 5c9ac2a90c..0e66115081 100644 --- a/quest/m2/noq-socket-close.md +++ b/quest/m2/noq-socket-close.md @@ -17,10 +17,6 @@ sends are dropped and receives end. Test it there and replace moq-tokio's wrappe `TestReconnectAcrossRelayRestart` and moq-tokio's `close_releases_quic_socket` stay green. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - imports the endpoint into moq-tokio - ## Related - [Listener close](https://github.com/moq-dev/moq/pull/4087) - the local wrapper this replaces diff --git a/quest/m2/perf/README.md b/quest/m2/perf/README.md index ed38015dba..fd7e9d3d4c 100644 --- a/quest/m2/perf/README.md +++ b/quest/m2/perf/README.md @@ -20,13 +20,11 @@ Planning quests can settle their contracts independently. Facts from the 2026-09 hot-path survey, so quests don't re-litigate them: - Decided in the 2026-10-05 audit: perf quests that edit moq-uring's QUIC - driver (Run to quiescence) Require the - [hard fork](/quest/m1/quic/fork/README.md), so their before and after are - measured on `moq-quic` instead of being invalidated by the switch. -- `moq-uring`'s only backend is noq. Every profile names its backend. The + driver (Run to quiescence) measure their before and after on `moq-quic`. +- `moq-uring`'s only backend is `moq-quic`. Every profile names its backend. The historical quiche-flavor numbers cited in [Run to quiescence](/quest/m2/perf/uring-quiescence.md) and - [moq-uring on moq-clock](/quest/m1/time/uring.md) are re-measured on noq. + [moq-uring on moq-clock](/quest/m1/time/uring.md) are re-measured on `moq-quic`. - Cross-thread wakeups are already cheap: one futex word per worker, at most one `futex(FUTEX_WAKE)` per park cycle, wake bursts coalesce through the `kio::Tasks` bitset. No eventfd, no MSG_RING, by design (`SINGLE_ISSUER`). diff --git a/quest/m2/perf/uring-copies.md b/quest/m2/perf/uring-copies.md index d752aaa92d..167165422f 100644 --- a/quest/m2/perf/uring-copies.md +++ b/quest/m2/perf/uring-copies.md @@ -23,7 +23,3 @@ Found in the 2026-09-30 fork planning; none needs a QUIC API change: The clock-read fix is [moq-uring on moq-clock](/quest/m1/time/uring.md). Measure with the echo benches and `just bench`. Paths above are pre-fork names. - -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the copies are removed on `moq-quic`, not the frozen fork diff --git a/quest/m2/perf/uring-one-enter.md b/quest/m2/perf/uring-one-enter.md index 7e1ee92cbe..c5bcba189a 100644 --- a/quest/m2/perf/uring-one-enter.md +++ b/quest/m2/perf/uring-one-enter.md @@ -41,7 +41,6 @@ stopped on the relay-port race (fixed by #5636); the completed diagnostic used preflighted unique ports below the host's client ephemeral range, with no runtime retry. The benchmark CLI is unchanged. -Driver-touching follow-ups still wait on the [hard fork](/quest/m1/quic/fork/README.md). The completed work changes only the Worker loop, Shared::push, observations, and their consumers, leaving `rs/moq-uring/src/quic/noq` alone. diff --git a/quest/m2/perf/uring-quiescence.md b/quest/m2/perf/uring-quiescence.md index be6d0695a7..fd1c908748 100644 --- a/quest/m2/perf/uring-quiescence.md +++ b/quest/m2/perf/uring-quiescence.md @@ -49,6 +49,5 @@ meaning with a budget of 1 and gains a sibling proving the budget bound. ## Required -- [Hard fork](/quest/m1/quic/fork/README.md) - the noq driver this edits moves onto `moq-quic` (decided in the 2026-10-05 audit) - [One enter per turn](/quest/m2/perf/uring-one-enter.md) - the metrics and the submit placement this sweep is measured with diff --git a/quest/m2/quic-ack-hook.md b/quest/m2/quic-ack-hook.md index 7b5d9ad980..e370652872 100644 --- a/quest/m2/quic-ack-hook.md +++ b/quest/m2/quic-ack-hook.md @@ -13,10 +13,10 @@ Decided in the 2026-10-05 audit: re-planned on moq-net's own transport traits. moq-net has no `web-transport-trait` dependency, so it could not call a hook that exists only upstream. The method lives on `rs/moq-net/src/transport.rs`'s `poll::SendStream`, implemented by the -moq-tokio and moq-uring adapters (the in-tree web-transport-moq after -[the fork](/quest/m1/quic/fork/README.md)); no `web-transport-trait` release -is needed. Rejected: keeping the method upstream. This quest supersedes the -design in moq-dev/web-transport#368, whose snapshot-counter shape loses the +moq-tokio and moq-uring adapters (moq-tokio's through `quic::web`); no +`web-transport-trait` release is needed. Rejected: keeping the method +upstream. This quest supersedes the design in moq-dev/web-transport#368, +whose snapshot-counter shape loses the wakeups a latency sample needs. Add one method to `SendStream`, in the trait's poll style: diff --git a/quest/m2/quic-ack-progress.md b/quest/m2/quic-ack-progress.md index 8d0f313081..1700926c41 100644 --- a/quest/m2/quic-ack-progress.md +++ b/quest/m2/quic-ack-progress.md @@ -8,7 +8,7 @@ peer's reported ACK delay. Nothing MoQ builds on top needs private state. ## Plan -The work lives in `moq-quic`, in-tree after [the fork](/quest/m1/quic/fork/README.md). +The work lives in `moq-quic`. `moq-quic`'s `SendBuffer` (`connection/send_buffer.rs`) already tracks most of what is needed: the acknowledged range set (`acks`), the write offset, the @@ -40,10 +40,6 @@ is in-tree too and can land in the same PR. Decided in the 2026-09-30 audit: moved to m2 with its consumers, the ACK hook and [frame-granularity starvation](/quest/m2/starvation-frames.md). -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the accessor lands in `moq-quic` - ## Related - [poll_acked on moq-net's send stream](/quest/m2/quic-ack-hook.md) - the first diff --git a/quest/m2/quic-bbr-natural-drain.md b/quest/m2/quic-bbr-natural-drain.md index a729dfbdb1..cabd16a103 100644 --- a/quest/m2/quic-bbr-natural-drain.md +++ b/quest/m2/quic-bbr-natural-drain.md @@ -81,10 +81,6 @@ pinned code and configurations. Keep transport differences and QUICHE flags explicit and compare each algorithm change separately. A simulation result is not an end-to-end network measurement. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq-quic`, not the frozen fork - ## Related - [Discover media headroom](/quest/m2/quic-probe.md) - preserving an estimate and discovering spare capacity are separate problems diff --git a/quest/m2/quic-deadline.md b/quest/m2/quic-deadline.md index 145ae3ee3c..a4bba574cb 100644 --- a/quest/m2/quic-deadline.md +++ b/quest/m2/quic-deadline.md @@ -51,7 +51,6 @@ Decided in the 2026-09-30 audit: moved to m2. No m1 quest consumes it. ## Required -- [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq-quic`, not the frozen fork - [Hierarchical stream scheduling](/quest/m1/quic/scheduler.md) - the scheduler decides which stream's data a probe carries diff --git a/quest/m2/quic-egress-profile.md b/quest/m2/quic-egress-profile.md index 8ca35ce552..b22d7cbd0d 100644 --- a/quest/m2/quic-egress-profile.md +++ b/quest/m2/quic-egress-profile.md @@ -49,10 +49,6 @@ Report CPU per Gbps, RSS, loss, and p99 latency via `just bench BASE` on Linux. The verdict names which levers ship and which qdisc, if any, relay hosts need. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq-quic`, not the frozen fork - ## Related - [QUIC I/O boundary](/quest/m2/quic-io-boundary.md) - redesigns the transmit buffers the pool lever would feed diff --git a/quest/m2/quic-io-boundary.md b/quest/m2/quic-io-boundary.md index 1e9eadc4e5..0749bb2aed 100644 --- a/quest/m2/quic-io-boundary.md +++ b/quest/m2/quic-io-boundary.md @@ -39,6 +39,5 @@ the same workloads. ## Required -- [Hard fork](/quest/m1/quic/fork/README.md) - the redesign breaks `moq-quic`'s API - [Relay profiling recipe](/quest/m2/perf/lock-profile.md) - the captures that rank the candidates - [Remove moq-uring copies](/quest/m2/perf/uring-copies.md) - the cheap wins land first, so the profile shows what is left diff --git a/quest/m2/quic-keep-alive.md b/quest/m2/quic-keep-alive.md index f88bd51831..76203cdc47 100644 --- a/quest/m2/quic-keep-alive.md +++ b/quest/m2/quic-keep-alive.md @@ -33,10 +33,6 @@ Tests: the derived interval follows a changed idle timeout, including a peer that advertises a shorter one; an idle connection survives with the default; an explicit value wins; `0s` disables. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the derivation lands in `moq-quic`, not the frozen fork - ## Related - [noq#810](https://github.com/n0-computer/noq/issues/810) - the deadline-driven proposal to n0; flub and matheus23 asked to keep a cap for NAT bindings, which the override covers diff --git a/quest/m2/quic-probe.md b/quest/m2/quic-probe.md index 504be79533..ddca323c76 100644 --- a/quest/m2/quic-probe.md +++ b/quest/m2/quic-probe.md @@ -47,10 +47,6 @@ retain the baseline and record why before exposing an ineffective option. Promoted from m2 on 2026-10-09 by maintainer priority: the viewer up-switch requires it. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq-quic`, not the frozen fork - ## Related - [Viewer up-switch](/quest/m2/viewer-upswitch.md) - the viewer side, which requires this diff --git a/quest/m2/quic-qmux.md b/quest/m2/quic-qmux.md index 0d068f8e66..1c07c86f9f 100644 --- a/quest/m2/quic-qmux.md +++ b/quest/m2/quic-qmux.md @@ -78,7 +78,6 @@ the fork plan the same day kept it there. ## Required -- [Hard fork](/quest/m1/quic/fork/README.md) - qmux drives `moq-quic` - [Reliable stream reset](/quest/m1/quic/reliable-reset.md) - qmux reuses the extension's stream state rather than implementing reset locally - [Hierarchical stream scheduling](/quest/m1/quic/scheduler.md) - qmux must diff --git a/quest/m2/rate-quic.md b/quest/m2/rate-quic.md index 269d7fca50..b0648fffb4 100644 --- a/quest/m2/rate-quic.md +++ b/quest/m2/rate-quic.md @@ -60,10 +60,9 @@ backpressure the peer cannot ignore, rather than metering and closing. connection and reset on revalidation or a union change. Reuse the runtime limits seam [peer limits](/quest/m1/quic/peer-limits.md) adds (`set_limits(Limits)` on moq-net's transport trait, implemented by the - moq-tokio and moq-uring adapters after the fork switch), extended with - the two rates. -- Lands in `moq-quic`, so it waits for the [fork](/quest/m1/quic/fork/README.md). - The relay drops its refusal for QUIC sessions in the same PR. + moq-tokio and moq-uring adapters), extended with the two rates. +- Lands in `moq-quic`. The relay drops its refusal for QUIC sessions in + the same PR. Tests, on a simulated clock: a peer sending flat out is held to the cap within the burst; a peer that ignores credit is closed with a flow-control @@ -84,7 +83,6 @@ that a one-second rate window can also be the complete assembly allowance. ## Required -- [Hard fork](/quest/m1/quic/fork/README.md) - the credit and pacer changes land in `moq-quic` - [Peer limits](/quest/m1/quic/peer-limits.md) - adds the runtime `set_limits(Limits)` seam and shrink-as-debt behavior this extends - [Bound message assembly](/quest/m1/quic/receive-memory.md) - separate retained memory from paced outstanding credit - [Bitrate claim](/quest/m2/rate-claim.md) - the cap this enforces diff --git a/quest/m3/cut-through/README.md b/quest/m3/cut-through/README.md index d555db078e..6d429fc457 100644 --- a/quest/m3/cut-through/README.md +++ b/quest/m3/cut-through/README.md @@ -21,8 +21,7 @@ send stream offsets in any order. Decided 2026-10-02: the line moved from m2 to m3. It is a speculative optimization with no consumer asking for it, so it parks until one does and -is deleted if it goes stale. The QUIC primitives land in `moq-quic`, the -[hard fork](/quest/m1/quic/fork/README.md)'s stack. +is deleted if it goes stale. The QUIC primitives land in `moq-quic`. Decided 2026-10-08: the four build quests were deleted. They churned with every frame-model and transport change while waiting on a verdict nobody had diff --git a/quest/m3/cut-through/loss-delay.md b/quest/m3/cut-through/loss-delay.md index 858c0d420d..37e04d31a6 100644 --- a/quest/m3/cut-through/loss-delay.md +++ b/quest/m3/cut-through/loss-delay.md @@ -39,10 +39,6 @@ Public API: an additive trait accessor. Wire: a new `moq-stats` field, additive on `main` since `Traffic` is `#[non_exhaustive]` and readers default missing fields. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the `moq-quic` assembler this counts in - ## Related - [QoS](/quest/m1/qos/README.md) - the per-broadcast ingress conventions this follows diff --git a/quest/m3/quic-careful-resume.md b/quest/m3/quic-careful-resume.md index 369dd02321..538f984e0e 100644 --- a/quest/m3/quic-careful-resume.md +++ b/quest/m3/quic-careful-resume.md @@ -32,10 +32,6 @@ Measure time to the encoder's target rate after a reconnect on the impaired path profile, plus loss and latency during the jump. Ship it on by default only when the jump never makes the first second worse than slow start. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq-quic`, not the frozen fork - ## Related - [noq#815](https://github.com/n0-computer/noq/issues/815) - the careful-resume proposal to n0 diff --git a/quest/m3/quic-ecn.md b/quest/m3/quic-ecn.md index a0a61ce38d..d6bb3b607b 100644 --- a/quest/m3/quic-ecn.md +++ b/quest/m3/quic-ecn.md @@ -35,7 +35,6 @@ need the fork. ## Required -- [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq-quic`, not the frozen fork - [Measure ECN on the backbone](/quest/m2/quic-ecn-measure.md) - the provider verdict this quest acts on diff --git a/quest/m3/quic-gcc.md b/quest/m3/quic-gcc.md index 2d8da9d47f..eadd13ce85 100644 --- a/quest/m3/quic-gcc.md +++ b/quest/m3/quic-gcc.md @@ -34,10 +34,6 @@ bottleneck rates. State the boundary beside the result: netem cannot establish behavior against production cross traffic or real wifi and cellular loss. -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the extension lands in `moq-quic` - ## Related - [Per-stream deadlines](/quest/m2/quic-deadline.md) - the forward-delay estimate this measures against From 562b0c66bf920cc35e349de68b7832df99e529d9 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 16 Oct 2026 09:29:58 -0700 Subject: [PATCH 3/4] docs(quest): retarget stale noq baselines to moq-quic Codex and CodeRabbit flagged quests that still pointed at the deleted moq-uring quic/noq driver, the moq-noq-proto pin, or the fork as a prerequisite. Co-Authored-By: Claude Opus 5.5 --- quest/m1/quic/datagram-priority.md | 2 +- quest/m1/quic/peer-limits.md | 2 +- quest/m1/quic/reliable-reset.md | 4 ++-- quest/m1/quic/scheduler.md | 2 +- ...tch-completion-wakeups-with-min-timeout.md | 2 +- quest/m2/perf/README.md | 4 ++-- quest/m2/perf/uring-copies.md | 2 +- quest/m2/perf/uring-one-enter.md | 2 +- quest/m2/perf/uring-quiescence.md | 10 +++++----- quest/m2/quic-ecn-measure.md | 19 ++++++++++--------- quest/m2/uring-drop-close.md | 2 +- ...fixed-file-slots-for-worker-udp-sockets.md | 2 +- quest/m3/quic-ecn.md | 18 ++++++++++-------- 13 files changed, 37 insertions(+), 34 deletions(-) diff --git a/quest/m1/quic/datagram-priority.md b/quest/m1/quic/datagram-priority.md index 7a00fcd1d4..7d78b89d6d 100644 --- a/quest/m1/quic/datagram-priority.md +++ b/quest/m1/quic/datagram-priority.md @@ -95,7 +95,7 @@ synchronous `send_datagram` taking a send-group handle and a group sequence. Every implementation follows: moq-tokio (`transport.rs`, `transport/owned.rs`), moq-uring (`transport/adapter.rs`, -`quic/noq/connection.rs`, `quic/web.rs`), moq-ffi and moq-wasm +`quic/driver/connection.rs`, `quic/web.rs`), moq-ffi and moq-wasm (`transport/adapter.rs`), moq-net's `ietf/adapter.rs`, and the test mocks. moq-uring's `quic/web.rs` serves WebTransport over the worker's own QUIC connection, so it honors the handle and order like raw QUIC. moq-wasm sits diff --git a/quest/m1/quic/peer-limits.md b/quest/m1/quic/peer-limits.md index c04d470731..7a97758dab 100644 --- a/quest/m1/quic/peer-limits.md +++ b/quest/m1/quic/peer-limits.md @@ -25,7 +25,7 @@ its own. - moq-net's transport trait gains `set_limits(Limits)` on the session, `Limits` carrying the three values, implemented by the moq-tokio and - moq-uring adapters over `moq-quic` after the fork switch; every other + moq-uring adapters over `moq-quic`; every other backend, the browser included, reports it unsupported. - The peer table gains the same three values (the stream limit and the two windows), diff --git a/quest/m1/quic/reliable-reset.md b/quest/m1/quic/reliable-reset.md index 0a24882b13..7f97964bf2 100644 --- a/quest/m1/quic/reliable-reset.md +++ b/quest/m1/quic/reliable-reset.md @@ -2,7 +2,7 @@ ## Goal -noq-proto and its WebTransport adapter implement +`moq-quic` and moq-tokio's WebTransport adapter (`quic::web`) implement [QUIC Stream Resets with Partial Delivery](https://datatracker.ietf.org/doc/draft-ietf-quic-reliable-stream-reset/). A reset WebTransport data stream reliably delivers enough prefix bytes for the receiver to associate it with its session before surfacing the application @@ -16,7 +16,7 @@ the receiver may discard that header and cannot attribute the reset. ## Plan -Implement the current reliable-reset draft in noq-proto: +Implement the current reliable-reset draft in `moq-quic`: - advertise and validate the empty `reset_stream_at` transport parameter, including remembered negotiation state for 0-RTT; diff --git a/quest/m1/quic/scheduler.md b/quest/m1/quic/scheduler.md index 6cd79ee8e9..d349f03ca4 100644 --- a/quest/m1/quic/scheduler.md +++ b/quest/m1/quic/scheduler.md @@ -15,7 +15,7 @@ group backlog. ## Plan -Add a generic send-group primitive to noq-proto. A group owns its +Add a generic send-group primitive to `moq-quic`. A group owns its strict priority and fair-share scheduler state; each stream owns only its order within that group. Prefer an owned group handle whose drop removes its scheduler state and whose priority can be updated without walking every open diff --git a/quest/m2/3200-moq-uring-batch-completion-wakeups-with-min-timeout.md b/quest/m2/3200-moq-uring-batch-completion-wakeups-with-min-timeout.md index 157321b632..16a9d93016 100644 --- a/quest/m2/3200-moq-uring-batch-completion-wakeups-with-min-timeout.md +++ b/quest/m2/3200-moq-uring-batch-completion-wakeups-with-min-timeout.md @@ -36,7 +36,7 @@ The kernel returns when `N` CQEs arrive, when `t` expires after partial progress Benchmark chat, 1:1 video, and fanout workloads with `N = 1/4/8/16` and `t = 0/5/10/20 us`. Record CQEs per wake, enters per second, CPU per message, p50, p99, and p999 latency. Pick no production default until the latency budget and CPU win are both demonstrated. Decided in the 2026-09-30 audit: moved to m2. It trades latency for CPU, -the win is unmeasured on noq, and io_uring ships in no package. +the win is unmeasured on `moq-quic`, and io_uring ships in no package. ## Required diff --git a/quest/m2/perf/README.md b/quest/m2/perf/README.md index fd7e9d3d4c..1f5b159029 100644 --- a/quest/m2/perf/README.md +++ b/quest/m2/perf/README.md @@ -45,7 +45,7 @@ The relay's `/metrics` endpoint already carries the ring-level counters row per io_uring worker. Decided in the 2026-09-30 audit: io_uring is off by default and ships in no -package, and none of the uring micro-opts is measured on noq. The unmeasured +package, and none of the uring micro-opts is measured on `moq-quic`. The unmeasured ones moved out (3200 to m2; 3129 with the open contract, 3201, 3202, and 3204 to m3), and NAPI busy polling (3203), registered wait arguments (3205), and the priority `set_track` wakes were dropped. Egress requeue folded into Run to @@ -78,7 +78,7 @@ optimization. - [Run to quiescence](/quest/m2/perf/uring-quiescence.md) - a received packet's reply is staged in the same turn, under a pass and train budget that keeps the fairness rule - [Demand aggregate](/quest/m2/perf/demand-aggregate.md) - a track subscribe, leave, or preference update no longer walks every reader of the track - [Ingest batch](/quest/m2/perf/ingest-batch.md) - relay ingest pays one lock, wake, and clock read per burst of whole frames instead of per frame -- [Remove moq-uring copies](/quest/m2/perf/uring-copies.md) - egress, stream send and receive, and datagram receive stop copying where the QUIC core already allows it, after the fork +- [Remove moq-uring copies](/quest/m2/perf/uring-copies.md) - egress, stream send and receive, and datagram receive stop copying where the QUIC core already allows it, with before/after measurements on `moq-quic` ## Related diff --git a/quest/m2/perf/uring-copies.md b/quest/m2/perf/uring-copies.md index 167165422f..8e0ad7dbb8 100644 --- a/quest/m2/perf/uring-copies.md +++ b/quest/m2/perf/uring-copies.md @@ -9,7 +9,7 @@ supports zero-copy, with a measured before/after. Found in the 2026-09-30 fork planning; none needs a QUIC API change: -- Egress: `quic/noq/connection.rs` copies each GSO train from `scratch` into +- Egress: `quic/driver/connection.rs` copies each GSO train from `scratch` into the TX buffer. Hand the TX pool's `Vec` to `poll_transmit` directly; it encrypts in place and only reserves when capacity is short. - Stream send: moq-net's `write_chunk(Bytes)` falls back to the trait's diff --git a/quest/m2/perf/uring-one-enter.md b/quest/m2/perf/uring-one-enter.md index c5bcba189a..805957e78b 100644 --- a/quest/m2/perf/uring-one-enter.md +++ b/quest/m2/perf/uring-one-enter.md @@ -42,7 +42,7 @@ the completed diagnostic used preflighted unique ports below the host's client ephemeral range, with no runtime retry. The benchmark CLI is unchanged. The completed work changes only the Worker loop, Shared::push, observations, -and their consumers, leaving `rs/moq-uring/src/quic/noq` alone. +and their consumers, leaving the QUIC driver alone. ## Related diff --git a/quest/m2/perf/uring-quiescence.md b/quest/m2/perf/uring-quiescence.md index fd1c908748..d6004e5209 100644 --- a/quest/m2/perf/uring-quiescence.md +++ b/quest/m2/perf/uring-quiescence.md @@ -8,8 +8,8 @@ the same drive-loop turn, so one enter carries the reply. Today lands in the next turn by design (rs/kio/src/task.rs:246-257, test `a_mid_pass_wake_lands_in_the_next_pass`), so a datagram costs three turns: dispatch sets the demux bit, the demux drains packets and kicks each -connection driver (rs/moq-uring/src/quic/noq/endpoint.rs:208-220, -:285-290), and the drivers stage `SendMsg` a turn later. Every hop is a turn +connection driver (`Endpoint::demux` in +rs/moq-uring/src/quic/driver/endpoint.rs), and the drivers stage `SendMsg` a turn later. Every hop is a turn and up to an enter. The other io_uring runtimes drain their local queue to exhaustion, or to a quantum, before touching the ring. @@ -30,14 +30,14 @@ must not starve the socket. stale first pass a park-returning turn runs today (worker.rs:180 polls on readiness the previous turn already consumed). - The egress driver stages one GSO train of `TRAIN_SEGMENTS = 63` segments - per turn and then wakes itself (`Driver::flush`, - rs/moq-uring/src/quic/noq/connection.rs:743-751), so a deep backlog pays a + per turn and then wakes itself (`Driver::flush` in + rs/moq-uring/src/quic/driver/connection.rs), so a deep backlog pays a whole turn per train and would consume every pass. That cadence is a hardcoded fairness choice across connections sharing a socket. Make it a trains-per-turn budget on `flush` and sweep 1, 2, and 4 together with the pass budget, under the fanout and single-heavy-connection shapes, so trains per turn and passes per turn are measured together. A no-win keeps 1 train. - The #3120 numbers are the deleted quiche driver's; re-profile on noq. + The #3120 numbers are the deleted quiche driver's; re-profile on `moq-quic`. Decided in the 2026-09-30 audit: the egress requeue quest merged here, since both budgets need the same sweep. - Add `passes` per turn to the metrics beside `turns`. diff --git a/quest/m2/quic-ecn-measure.md b/quest/m2/quic-ecn-measure.md index cb789685ba..e5b45bf332 100644 --- a/quest/m2/quic-ecn-measure.md +++ b/quest/m2/quic-ecn-measure.md @@ -14,11 +14,13 @@ A manual procedure on Linux, run as root, with the commands and what to record written here so the dualpi2 run and any later provider re-check repeat it. -Use moq-noq 1.3.2 or later, which carries the classic BBR CE response -([moq-dev/noq#12](https://github.com/moq-dev/noq/pull/12)), for the -controller-response verdict and record the exact dependency version. Provider -mark-survival captures alone do not establish a controller response; a result -from 1.3.1 is a defective baseline, not evidence that classic ECN cannot help. +Use `moq-quic`, whose BBR3 carries the classic CE response ported from +[moq-dev/noq#12](https://github.com/moq-dev/noq/pull/12) (see +`rs/moq-quic/README.md`), for the controller-response verdict and record the +exact commit. Provider mark-survival captures alone do not establish a +controller response; a result from a stack without that response, such as +moq-noq 1.3.1, is a defective baseline, not evidence that classic ECN cannot +help. - Bottleneck: two relays on the io_uring runtime across a netem link with a rate limit and delay, once with `fq_codel` marking (`ecn` on) and once @@ -40,7 +42,6 @@ from 1.3.1 is a defective baseline, not evidence that classic ECN cannot help. Decided in the 2026-09-30 audit: moved to m2 with its only consumer, [L4S on the backbone](/quest/m3/quic-ecn.md). -Decided in the 2026-10-06 audit: no longer waits on the hard fork. No code -lands here, and the pinned moq-noq-proto 2.0.1 already carries the classic -CE response, so the study runs today. The fork stays Required on L4S on the -backbone, which does land code in `moq-quic`. +Decided in the 2026-10-06 audit: no code lands here, and `moq-quic` already +carries the classic CE response, so the study runs today. L4S on the +backbone lands its code in `moq-quic`. diff --git a/quest/m2/uring-drop-close.md b/quest/m2/uring-drop-close.md index a8323610ef..0b26b5841c 100644 --- a/quest/m2/uring-drop-close.md +++ b/quest/m2/uring-drop-close.md @@ -13,7 +13,7 @@ keep the session alive structurally until its capsule is sent. Decided 2026-10-07: first check whether moq-net always calls `close()` before dropping a session (the `Connection` doc comment in -`rs/moq-uring/src/quic/noq/connection.rs` says its session machine does); if +`rs/moq-uring/src/quic/driver/connection.rs` says its session machine does); if it does, the leak only affects direct moq-uring users, which still need it fixed. Close with a generic application code on drop of the last handle, matching what the other backends do, with a test that drops diff --git a/quest/m3/3202-moq-uring-use-fixed-file-slots-for-worker-udp-sockets.md b/quest/m3/3202-moq-uring-use-fixed-file-slots-for-worker-udp-sockets.md index 7fdd1cd074..fbc3831cde 100644 --- a/quest/m3/3202-moq-uring-use-fixed-file-slots-for-worker-udp-sockets.md +++ b/quest/m3/3202-moq-uring-use-fixed-file-slots-for-worker-udp-sockets.md @@ -31,7 +31,7 @@ Registered files let SQEs address a stable table slot with `types::Fixed`. This Benchmark steady-state send/receive traffic and high socket-churn workloads. Record CPU, cycles, instructions, throughput, and socket lifetime cost. Keep the implementation only if the hot-path win justifies the slot-lifecycle complexity. Decided in the 2026-09-30 audit: moved to m2. The hot-path win is -unmeasured on noq, and io_uring ships in no package. Decided 2026-10-08: +unmeasured on `moq-quic`, and io_uring ships in no package. Decided 2026-10-08: moved to m3 with the rest of the speculative ring work; no fleet demand. ## Closes diff --git a/quest/m3/quic-ecn.md b/quest/m3/quic-ecn.md index d6bb3b607b..405a7981f3 100644 --- a/quest/m3/quic-ecn.md +++ b/quest/m3/quic-ecn.md @@ -9,14 +9,16 @@ marks fall back to no ECN, and a viewer's session is unaffected. ## Plan -ECT(0) marking and ACK ECN counts are carried end to end, and BBR's classic -CE response ([moq-dev/noq#12](https://github.com/moq-dev/noq/pull/12), in -moq-noq 1.3.2; `main` pins moq-noq-proto 2.0.1) is the baseline. This quest -adds the scalable policy separately. noq-proto has no ECN knob: `sending_ecn` starts on per path and validation -failure or an ACK without counts turns it off, so both `off` and `ect1` -need the fork. - -- In the fork: an `Ect1` marking option and the accounting to keep the two +ECT(0) marking and ACK ECN counts are carried end to end, and BBR3's classic +CE response, ported to `moq-quic` from +[moq-dev/noq#12](https://github.com/moq-dev/noq/pull/12) (see +`rs/moq-quic/README.md`), is the baseline. `main` no longer depends on +moq-noq; only upstream noq-proto remains, for iroh. This quest adds the +scalable policy separately. `moq-quic` has no ECN knob: `sending_ecn` starts +on per path and validation failure or an ACK without counts turns it off, so +both `off` and `ect1` need a `moq-quic` change. + +- In `moq-quic`: an `Ect1` marking option and the accounting to keep the two codepoints apart, so an L4S response (proportional to the CE fraction per RTT, per RFC 9330 to 9332) can be tried as a `Controller` change without a transport change. Off by default. From 75f85a00ddb5794b301818eb011559fe534bc7b6 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 16 Oct 2026 09:43:31 -0700 Subject: [PATCH 4/4] docs(quest): retarget every QUIC quest to moq-quic in-tree Drop the blanket "read the fork as moq-quic" note and fix each quest inline: actionable plans target moq-quic, dated history stays labeled, and iroh's upstream noq is left alone. The web-transport-moq release wait is moot now that the close fix is in-tree, so it is deleted. Co-Authored-By: Claude Opus 5.5 --- quest/README.md | 2 +- quest/m1/README.md | 5 ++-- quest/m1/close-tail-drain.md | 6 ++--- quest/m1/quic/README.md | 6 +---- quest/m1/quic/receive-credit.md | 4 +-- quest/m1/quic/scheduler.md | 2 +- quest/m1/rs-request-credit.md | 8 +++--- quest/m1/test-flakes-2/README.md | 3 +-- quest/m1/test-flakes-2/interop-close-code.md | 17 ++++++------- .../m1/test-flakes-2/interop-close-release.md | 25 ------------------- quest/m1/time/README.md | 2 +- quest/m1/time/relay-seam.md | 4 +-- quest/m2/README.md | 2 +- quest/m2/noq-socket-close.md | 4 +-- quest/m2/one-port/README.md | 4 +-- quest/m2/perf/uring-copies.md | 2 +- quest/m2/quic-bbr-loss-parity.md | 5 ++-- quest/m2/quic-bbr-natural-drain.md | 10 +++++--- quest/m2/quic-deadline.md | 2 +- quest/m2/quic-egress-profile.md | 2 +- quest/m2/quic-io-boundary.md | 4 +-- quest/m2/quic-probe.md | 2 +- quest/m2/wire-stats/presence.md | 2 +- quest/m3/README.md | 2 +- quest/m3/cut-through/loss-delay.md | 2 +- quest/m3/quic-careful-resume.md | 2 +- 26 files changed, 49 insertions(+), 80 deletions(-) delete mode 100644 quest/m1/test-flakes-2/interop-close-release.md diff --git a/quest/README.md b/quest/README.md index ff8b6e99b4..48b5651cdb 100644 --- a/quest/README.md +++ b/quest/README.md @@ -8,7 +8,7 @@ grouped into milestones ordered by priority. ## Plan m0 holds urgent fixes and release-line maintenance. m1 is the finite next -breaking release: clustering stability first, the QUIC library switch, and +breaking release: clustering stability first, the in-tree QUIC stack, and planned public API and format breaks with their correctness and validation. m2 holds independently shippable capabilities and optimizations, plus the publication and adoption steps that follow m1. m3 holds external conditions diff --git a/quest/m1/README.md b/quest/m1/README.md index a24275f135..566b9a67ca 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -14,9 +14,8 @@ Decided with the maintainer on 2026-10-13: through a stale route; a working backup recovers; matching-epoch handover preserves eligible content; a new epoch produces an explicit Restart. Catalogs, long-lived readers, and late joiners must obey the same contract. -- Prioritize the QUIC library switch beside routing. Its clock prerequisite - lands first. Keep its correctness, interoperability, memory, and performance - evidence; a passing simulator alone does not validate a real transport. +- Prioritize the in-tree QUIC stack (`moq-quic`) beside routing. Keep its + correctness, interoperability, memory, and performance evidence; a passing simulator alone does not validate a real transport. - Finish planned breaking APIs in this release, including public clocks, signed priority, binding shape, watch worker, and the QoS lag API. Keep prerequisites of those changes here even when a prerequisite is additive. diff --git a/quest/m1/close-tail-drain.md b/quest/m1/close-tail-drain.md index 6ab5d415df..755f5c56d7 100644 --- a/quest/m1/close-tail-drain.md +++ b/quest/m1/close-tail-drain.md @@ -20,7 +20,7 @@ Found while reworking the in-memory transport (#5530). Facts at 813a92b48: `:931-942`) does the same, and `ietf::session::start` aborts again after the race in each of its two arms, drafts 14-16 (`:371-374`) and drafts 17+ (`:588-591`). -- Real QUIC keeps that data readable: noq's `poll_accept` hands out +- Real QUIC keeps that data readable: moq-tokio's `quic::driver` `poll_accept` hands out already-received streams before the connection error, and reads return buffered chunks and the FIN, reporting `ConnectionLost` only when blocked. moq-uring's raw QUIC follows the same order, but its WebTransport layer @@ -71,8 +71,8 @@ Decided (maintainer, 2026-10-14): The receiver drain also needs moq-uring WebTransport to classify and hand out its pending uni streams before reporting the connection error, with a regression for a tail stream and CONNECTION_CLOSE arriving in the same poll. -Check the other `poll_accept_uni` adapters (such as `rs/moq-ffi` and the -noq WebTransport path) for the same ordering. +Check the other `poll_accept_uni` adapters (such as `rs/moq-ffi` and +moq-tokio's `quic::web` path) for the same ordering. Public API: none. Wire: none. diff --git a/quest/m1/quic/README.md b/quest/m1/quic/README.md index c2fb3a8df8..06bd6a53d8 100644 --- a/quest/m1/quic/README.md +++ b/quest/m1/quic/README.md @@ -23,10 +23,6 @@ hard fork of quinn in `rs/`, where every QUIC change here lands. moq-dev/noq is frozen to security patches for `release` and archived once no released MoQ crate depends on it. -Older quests say "the fork" or "noq"; read that as `moq-quic`. Their steps to -publish a fork release, pin it, or offer a change upstream are superseded: -a change lands in-tree with its consumer, and upstreaming is optional. - The seven BBR correctness fixes shipped in moq-noq 1.3.1 (#4206) are in `moq-quic`'s BBR3. The remaining BBR quests here all edit `bbr3/mod.rs`, so one owner should work there at a time. Controller-level @@ -86,7 +82,7 @@ cache limits remain separate; bitrate pacing composes with this memory cap. - [Scope track priority](/quest/m1/track-priority-scope.md) - the per-broadcast fairness policy on cluster sessions - [Discover media headroom](/quest/m2/quic-probe.md) - test useful-media pacing before adding redundant probe traffic -- [L4S on the backbone](/quest/m3/quic-ecn.md) - an ECT(1) option in the fork, an `ecn` config knob, and a dualpi2 measurement +- [L4S on the backbone](/quest/m3/quic-ecn.md) - an ECT(1) option in `moq-quic`, an `ecn` config knob, and a dualpi2 measurement - [Careful resume on reconnect](/quest/m3/quic-careful-resume.md) - a redial starts at the previous connection's rate - [Keep-alive from the idle timeout](/quest/m2/quic-keep-alive.md) - the keep-alive interval defaults to a fraction of the negotiated idle timeout; an explicit `quic.keep_alive` overrides - [QUIC receive-timestamps spike](/quest/m3/quic-gcc.md) - measures whether receive timestamps give a cheaper, more accurate forward delay than half the RTT diff --git a/quest/m1/quic/receive-credit.md b/quest/m1/quic/receive-credit.md index 9f93925876..79d7c589ef 100644 --- a/quest/m1/quic/receive-credit.md +++ b/quest/m1/quic/receive-credit.md @@ -10,8 +10,8 @@ an entire application message to fit before more bytes arrive. ## Plan -Decided in the 2026-10-10 receive-memory interview: use `moq-quic` after the -fork switch, not a new feature in the frozen moq-dev/noq fork. This quest +Decided in the 2026-10-10 receive-memory interview: use `moq-quic`, not a +new feature in the frozen moq-dev/noq fork. This quest provides the transport primitive; [message assembly](/quest/m1/quic/receive-memory.md) activates it with the recovery policy needed for progress. diff --git a/quest/m1/quic/scheduler.md b/quest/m1/quic/scheduler.md index d349f03ca4..9dafe85cca 100644 --- a/quest/m1/quic/scheduler.md +++ b/quest/m1/quic/scheduler.md @@ -58,7 +58,7 @@ the tier and the weighting. The delivered API is hierarchical send groups. Do not require a separately published scalar-widening API or drop fairness as an intermediate release. -Prototype the byte-accounted scheduler in the fork. An existing Quinn prototype can +Prototype the byte-accounted scheduler in `moq-quic`. An existing Quinn prototype can supply a workload baseline, but a recency field alone does not prove byte fairness: differently sized writes must spend the group's byte credit, and requeueing or adding streams must not reset that credit. diff --git a/quest/m1/rs-request-credit.md b/quest/m1/rs-request-credit.md index fe64a21440..9feada8423 100644 --- a/quest/m1/rs-request-credit.md +++ b/quest/m1/rs-request-credit.md @@ -19,15 +19,15 @@ leaves, or the session closes, and a relay shouldn't kill a subscribe on a slow upstream hop. A single `Pending` poll of `open_bi` is not "no credit": on WebTransport, -`web-transport-moq` opens the QUIC stream and then writes the session header, +moq-tokio's `quic::web` opens the QUIC stream and then writes the session header, which can be pending under send-window pressure. Check credit at the QUIC level instead, likely a non-waiting open on moq-net's `transport::poll` session trait. Also note that `moq-tokio`'s `poll_open_bi` parks an abandoned open in the session's slot rather than dropping it, so the next request inherits it; the non-waiting open -should avoid that. The async backends `moq-tokio` wraps (qmux, iroh, noq) have -no credit query in `web-transport-trait`, which `moq-tokio` needs to -implement that method for them; prefer adding one upstream in +should avoid that. `quic::web` is in-tree and can ask `moq-quic` directly, +but the backends `moq-tokio` wraps through `web-transport-trait` (qmux, +iroh) have no credit query there; prefer adding one upstream in moq-dev/web-transport over leaving them waiting, and say in the PR which backends fail fast. diff --git a/quest/m1/test-flakes-2/README.md b/quest/m1/test-flakes-2/README.md index f95604acd2..093283d2e3 100644 --- a/quest/m1/test-flakes-2/README.md +++ b/quest/m1/test-flakes-2/README.md @@ -37,8 +37,7 @@ Public API: none. Wire: none. - [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 - [TS resume late frames](/quest/m1/test-flakes-2/ts-resume-late-frames.md) - the same-instance TS resume test keeps its late frames, fixed in production or the fixture as the evidence says -- [WebTransport close release](/quest/m1/test-flakes-2/interop-close-release.md) - a compatible published adapter contains the acknowledged-close fix -- [Interop close code](/quest/m1/test-flakes-2/interop-close-code.md) - adopt that release so the browser reliably sees `unauthorized` for a refused session +- [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 - [Auth serve signals](/quest/m1/test-flakes-2/auth-serve-signals.md) - moq-cli's auth serve signal tests hold under load diff --git a/quest/m1/test-flakes-2/interop-close-code.md b/quest/m1/test-flakes-2/interop-close-code.md index 4654da2fd6..0a383d8687 100644 --- a/quest/m1/test-flakes-2/interop-close-code.md +++ b/quest/m1/test-flakes-2/interop-close-code.md @@ -2,9 +2,9 @@ ## Goal -MoQ uses a published `web-transport-moq` release containing the acknowledged -close fix, and the Interop browser close-code test reliably reports a refused -session as `unauthorized`, never as "Connection lost". +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 @@ -24,9 +24,10 @@ 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. -- Once the release condition clears, update the compatible published adapter - requirement and lockfile on `main`. The current requirement is 2.0.4. -- Run strict `just check` and `just test interop --all` on the committed pin, +- `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 @@ -37,10 +38,6 @@ removed; no unpublished dependency belongs in this adoption. Public API: none expected. Wire: existing CLOSE capsule framing and codes are unchanged; refusal delivery is corrected. -## Required - -- [WebTransport publishes the close fix](/quest/m1/test-flakes-2/interop-close-release.md) - a compatible stable adapter release contains the acknowledged-close fix - ## Related - [Source fix](https://github.com/moq-dev/noq/pull/40) - deterministic delivery and cancellation regressions, plus the paired browser/relay evidence diff --git a/quest/m1/test-flakes-2/interop-close-release.md b/quest/m1/test-flakes-2/interop-close-release.md deleted file mode 100644 index ddfb35abe9..0000000000 --- a/quest/m1/test-flakes-2/interop-close-release.md +++ /dev/null @@ -1,25 +0,0 @@ -# [XS] WebTransport publishes the acknowledged-close fix - -## Goal - -Waiting on moq-dev/noq: [#40](https://github.com/moq-dev/noq/pull/40) is merged -and a compatible stable `web-transport-moq` release includes its reliable -CLOSE capsule delivery fix. MoQ can then replace its 2.0.4 adapter pin -without an unpublished source override. - -## Plan - -Check the PR's merge commit, repository release/tag, and published crate -source together. A version newer than 2.0.4 is not proof that it includes the -fix: another release may contain only the unrelated handshake ACK change. -Use the merged commit or equivalent published source, since a squash merge -need not retain the PR head's hash. - -Advance this condition through the source review and a maintainer release; -publishing requires explicit authorization. Delete this quest and its -dependency reference once the published condition is verified. The adoption -quest owns MoQ's dependency/lockfile update and final interop validation. - -## Related - -- [Adopt reliable refusal delivery](/quest/m1/test-flakes-2/interop-close-code.md) - consumes the published adapter and preserves the exact browser refusal assertion diff --git a/quest/m1/time/README.md b/quest/m1/time/README.md index b4f507c457..60381a4089 100644 --- a/quest/m1/time/README.md +++ b/quest/m1/time/README.md @@ -89,7 +89,7 @@ reasons, so later sessions don't reopen them: instant at its boundary. This milestone verifies the exported clock contract and production consumers -needed by the QUIC switch and clustering regressions. Unrelated test/private +needed by the in-tree QUIC stack and clustering regressions. Unrelated test/private cleanup and the global lint ratchet belong to [the follow-up sweep](/quest/m2/time-test-sweep.md). diff --git a/quest/m1/time/relay-seam.md b/quest/m1/time/relay-seam.md index 5a938ca285..b8088e24f5 100644 --- a/quest/m1/time/relay-seam.md +++ b/quest/m1/time/relay-seam.md @@ -20,8 +20,8 @@ Decided 2026-10-10: in-memory, on moq-net's poll transport traits, not a moq-dev/web-transport. Backend-only methods (`poll_acked`, `set_deadline`, `set_limits`) answer "unsupported", as [one adapter](/quest/m2/transport-adapter-dedup.md) decided. Optional latency -and loss run on the moq-clock clock. It waits for the switch, which reshapes -moq-tokio's server types the seam abstracts over. +and loss run on the moq-clock clock. It abstracts over moq-tokio's server +types as the switch to `moq-quic` (#5664) left them. Find the smallest seam that keeps `moq_relay`'s public API narrow. Propose where the session lives (recommended: a moq-net module behind a cargo diff --git a/quest/m2/README.md b/quest/m2/README.md index 2db979d6b1..5833be1a92 100644 --- a/quest/m2/README.md +++ b/quest/m2/README.md @@ -95,7 +95,7 @@ ranked just below deterministic TS legs, which it requires. - [Per-stream deadlines](/quest/m2/quic-deadline.md) - hopeless retransmits become resets, and a tail loss probe fires early while there is still time - [qmux on the QUIC stream state machine](/quest/m2/quic-qmux.md) - qmux is a - first-class crate in the fork over the shared stream state machine + first-class crate over `moq-quic`'s shared stream state machine - [Align BBR loss handling with draft-06](/quest/m2/quic-bbr-loss-parity.md) - losses use their own sample and the draft-05 links go, keeping the spurious-loss undo that already re-enters ProbeUp through Refill - [Measure ECN on the backbone](/quest/m2/quic-ecn-measure.md) - a written verdict on marking versus dropping, and whether Linode and OVH keep marks diff --git a/quest/m2/noq-socket-close.md b/quest/m2/noq-socket-close.md index 0e66115081..ff4c4f1f81 100644 --- a/quest/m2/noq-socket-close.md +++ b/quest/m2/noq-socket-close.md @@ -2,8 +2,8 @@ ## Goal -moq-tokio's QUIC endpoint (quinn's async layer, which the hard fork imports -into moq-tokio; `moq-quic` is the sans-IO core and owns no socket) can close +moq-tokio's QUIC endpoint (quinn's async layer, imported +into moq-tokio as `quic::driver`; `moq-quic` is the sans-IO core and owns no socket) can close its UDP socket, and report when it has, without waiting for every connection handle to drop. moq-tokio then deletes the closable socket wrapper that #4087 added to make `Listener::close` release the diff --git a/quest/m2/one-port/README.md b/quest/m2/one-port/README.md index 838422dc16..865cf29726 100644 --- a/quest/m2/one-port/README.md +++ b/quest/m2/one-port/README.md @@ -41,7 +41,7 @@ them from m1. RFC 7983 already partitions the first byte: STUN is 0 to 3, DTLS 20 to 63, RTP and RTCP 128 to 191. QUIC fills the gaps: a long header is 192 to 255 and a short header 64 to 127, as long as the fixed bit is set, so the QUIC -config disables QUIC-bit greasing (RFC 9287) explicitly; noq turns it on by +config disables QUIC-bit greasing (RFC 9287) explicitly; `moq-quic` turns it on by default and nothing here disables it today. SRT does not fit: its data packets start with a 0 bit and its control packets with a 1, so both overlap. SRT is demuxed by flow instead. A 4-tuple ICE has succeeded on is pinned @@ -60,7 +60,7 @@ unknown tuple is not SRT; it is dropped or given to the WebRTC mux. One OS socket, or one shard of a reuseport group, is read by the demux and fanned into virtual sockets, one per stack, each with the `AsyncUdpSocket` shape. Sends go straight to the shared socket, so every stack answers from -the same address and port. noq accepts the virtual socket through +the same address and port. moq-tokio's `quic::driver` accepts the virtual socket through `new_with_abstract_socket`. `moq-rtc`'s `Mux` already demuxes STUN by ufrag internally and takes a fed socket in [WebRTC on the shared socket](/quest/m2/one-port/rtc-feed.md). SRT skips `srt-tokio`, diff --git a/quest/m2/perf/uring-copies.md b/quest/m2/perf/uring-copies.md index 8e0ad7dbb8..77dd67eb33 100644 --- a/quest/m2/perf/uring-copies.md +++ b/quest/m2/perf/uring-copies.md @@ -22,4 +22,4 @@ Found in the 2026-09-30 fork planning; none needs a QUIC API change: Copy once per completion and split it into segments. The clock-read fix is [moq-uring on moq-clock](/quest/m1/time/uring.md). -Measure with the echo benches and `just bench`. Paths above are pre-fork names. +Measure with the echo benches and `just bench`. diff --git a/quest/m2/quic-bbr-loss-parity.md b/quest/m2/quic-bbr-loss-parity.md index 831354517b..341c6fed9a 100644 --- a/quest/m2/quic-bbr-loss-parity.md +++ b/quest/m2/quic-bbr-loss-parity.md @@ -25,9 +25,8 @@ requires. Preserve that behavior and its regression. While in the file, move the remaining draft-05 links and renamed pseudocode identifiers (such as `probe_up_acked_per_inc`) to draft-06; comment-only. -Decided in the 2026-10-05 audit: this waits on the hard fork, which the -maintainer prioritizes, and lands in `moq-quic`'s BBR3, not in the frozen -moq-dev/noq. Add failing regressions on the shared test `Sim`: a loss before the +Decided in the 2026-10-05 audit: this lands in `moq-quic`'s BBR3, not in +the frozen moq-dev/noq. Add failing regressions on the shared test `Sim`: a loss before the first ACK sample, and a loss between ACKs that must not alter the next ACK's sample. Retain the spurious-loss undo coverage through Refill. Internal only; no `Controller` or wire change. diff --git a/quest/m2/quic-bbr-natural-drain.md b/quest/m2/quic-bbr-natural-drain.md index cabd16a103..b69f0d84aa 100644 --- a/quest/m2/quic-bbr-natural-drain.md +++ b/quest/m2/quic-bbr-natural-drain.md @@ -17,7 +17,8 @@ one study, since both reuse the same media profiles, harness, and baseline. ### Natural drains -Use the corrected released fork as baseline. ProbeRTT targets half the +Use `moq-quic`'s BBR3, which carries the released fork's corrections, as +baseline. ProbeRTT targets half the estimated BDP, floored at the minimum pipe window; entering the mode need not withhold useful bytes. First locate actual cwnd stalls and deadline misses using steady low-rate traffic, 30-fps frames with keyframes, and gaps @@ -29,7 +30,8 @@ natural-drain credit. [QUICHE BBR3](https://github.com/google/quiche/blob/535a27 postpones RTT aging across zero-inflight idle intervals; its [tests](https://github.com/google/quiche/blob/535a2730e77d47e0dc03746555cc9c34b17bc9e9/quiche/quic/core/congestion_control/bbr3_simulator_test.cc#L1724) cover restart behavior. These source defaults are not deployment evidence. -Noq's Linux-style idle-restart suppression is narrower. +In the 2026-09-21 audit, noq's Linux-style idle-restart suppression was +narrower. A candidate credits sustained low inflight, a completed sampled round, and fresh RTT evidence toward ProbeRTT. Determine the predicate experimentally; @@ -58,7 +60,9 @@ restart from idle resets the gain to 1.0. The 2026-09-21 audit compared noq-proto 1.3.0 / upstream `1a26a8b` with Google Linux BBRv3 `90210de4` and Google QUICHE `535a2730`. Recheck current -upstream sources before testing. Use QUICHE's actual `bbr3_sender.cc` with +upstream sources before testing. The audit describes noq; `moq-quic`'s BBR3 +was ported from it (#4921), so recheck each difference against `moq-quic`. +Use QUICHE's actual `bbr3_sender.cc` with its shared `bbr2_*` model; the older BBR2 sender is not a substitute for its BBR3 state machine. diff --git a/quest/m2/quic-deadline.md b/quest/m2/quic-deadline.md index a4bba574cb..e0193c031a 100644 --- a/quest/m2/quic-deadline.md +++ b/quest/m2/quic-deadline.md @@ -14,7 +14,7 @@ change is needed. ## Plan -Implement in the fork. +Implement in `moq-quic`. - Add `set_deadline(Instant)` on `SendStream`. A stream without one behaves exactly as today. diff --git a/quest/m2/quic-egress-profile.md b/quest/m2/quic-egress-profile.md index b22d7cbd0d..3d0adabca7 100644 --- a/quest/m2/quic-egress-profile.md +++ b/quest/m2/quic-egress-profile.md @@ -35,7 +35,7 @@ Then, only where the profile shows a cost: - `sendmmsg` in `moq_sock::udp` behind the existing GSO path, submitting every train ready across connections in one call, falling back to per-train `sendmsg` on partial failure the way the GSO fallback does. -- A `BufFactory`-style seam on `SendBuffer` in the fork that takes buffers +- A `BufFactory`-style seam on `SendBuffer` in `moq-quic` that takes buffers from a pool sized from the send window and returns them on ACK. Design it with [the I/O boundary redesign](/quest/m2/quic-io-boundary.md), which reworks the same transmit buffers. diff --git a/quest/m2/quic-io-boundary.md b/quest/m2/quic-io-boundary.md index 0749bb2aed..052c939486 100644 --- a/quest/m2/quic-io-boundary.md +++ b/quest/m2/quic-io-boundary.md @@ -11,8 +11,8 @@ those buffers with the ring is ## Plan Decided in the 2026-09-30 plan: commit to the redesign, but start only after -a noq or `moq-quic` profile shows where ingress and egress spend their time. -No current profile is from noq, and every other copy is removed without an +a `moq-quic` profile shows where ingress and egress spend their time. +No current profile is from `moq-quic`, and every other copy is removed without an API change by [Remove moq-uring copies](/quest/m2/perf/uring-copies.md). Candidates, to be ranked by the profile: diff --git a/quest/m2/quic-probe.md b/quest/m2/quic-probe.md index ddca323c76..d61d1b7ae3 100644 --- a/quest/m2/quic-probe.md +++ b/quest/m2/quic-probe.md @@ -25,7 +25,7 @@ being useful if the original was lost does not make redundancy free. Keep all bytes in congestion accounting and count unique media delivery once. Wire-capacity evidence must remain distinct from application goodput. -Implement only the measured winning mechanism in the fork's recovery and +Implement only the measured winning mechanism in `moq-quic`'s recovery and pacing layer. For redundant probes, evaluate the existing IMMEDIATE_ACK extension so ACK delay does not obscure a short sample. Enable probing only while an active application requests headroom, within explicit byte/time diff --git a/quest/m2/wire-stats/presence.md b/quest/m2/wire-stats/presence.md index 6f1f569b27..273e90ebd7 100644 --- a/quest/m2/wire-stats/presence.md +++ b/quest/m2/wire-stats/presence.md @@ -15,7 +15,7 @@ reading. A closing session adds its final reading. An embedder registers a conne - **Sources:** - **QUIC and WebTransport:** `bytes_sent` / `bytes_received` from - `moq_net::session::Stats`. noq maps them to `udp_tx` / `udp_rx`. + `moq_net::session::Stats`. `moq-quic` maps them to `udp_tx` / `udp_rx`. - **WebSocket:** the qmux counters from [qmux byte counters](/quest/m2/wire-stats/qmux.md). Until those land, a WebSocket session reports 0: an undercount, never a guess. diff --git a/quest/m3/README.md b/quest/m3/README.md index 4bdd417dc1..29459cd8b5 100644 --- a/quest/m3/README.md +++ b/quest/m3/README.md @@ -34,7 +34,7 @@ m4's upstream waits in here and moved m2 work with no consumer. - [#3202](/quest/m3/3202-moq-uring-use-fixed-file-slots-for-worker-udp-sockets.md) - moq-uring: fixed-file slots for worker UDP sockets, if its own benchmark measures a win - [#3129](/quest/m3/3129-moq-uring-write-the-webtransport-stream-header-at-open.md) - moq-uring writes the WebTransport stream header at open and settles the open contract, once a caller hits it - [QUIC receive timestamps](/quest/m3/quic-gcc.md) - a spike measuring receive timestamps in ACKs on native and relay-to-relay egress; delay-based control only if it justifies one -- [L4S on the backbone](/quest/m3/quic-ecn.md) - an ECT(1) option in the fork, an `ecn` config knob, and a dualpi2 measurement, if the ECN measurement says marks survive +- [L4S on the backbone](/quest/m3/quic-ecn.md) - an ECT(1) option in `moq-quic`, an `ecn` config knob, and a dualpi2 measurement, if the ECN measurement says marks survive - [Careful resume on reconnect](/quest/m3/quic-careful-resume.md) - a Rust redial starts at the previous connection's rate - [Cut-through](/quest/m3/cut-through/README.md) - a lossy-hop bench decides whether a relay should forward bytes behind a QUIC stream hole; the build is re-planned if it says go - [Unreal prototype](/quest/m3/unreal.md) - a UE5 module on the C++ package with exceptions disabled, rendering a subscribed broadcast to a texture diff --git a/quest/m3/cut-through/loss-delay.md b/quest/m3/cut-through/loss-delay.md index 37e04d31a6..daed9e3cea 100644 --- a/quest/m3/cut-through/loss-delay.md +++ b/quest/m3/cut-through/loss-delay.md @@ -13,7 +13,7 @@ production number that sizes the cut-through opportunity. Decided 2026-09-30: one monotonic byte counter, no hold-time histogram, on the ingress (`Role::Subscriber`) rows next to [publisher timeliness](/quest/m2/qos-publisher-timeliness.md)'s fields. -Independent of the bench; it can start once `moq-quic` lands. +Independent of the bench. - `moq-quic` counts per receive stream. The assembler stamps each chunk buffered past the contiguous frontier with its arrival time; when the frontier passes it, diff --git a/quest/m3/quic-careful-resume.md b/quest/m3/quic-careful-resume.md index 538f984e0e..7f405fb34e 100644 --- a/quest/m3/quic-careful-resume.md +++ b/quest/m3/quic-careful-resume.md @@ -18,7 +18,7 @@ RTT with its age, jumps the congestion window toward that estimate once the new path's RTT matches the recorded one, and drops back to ordinary slow start on the first loss or a mismatched RTT. -- Implement in the fork as a `Controller` wrapper: any controller can be +- Implement in `moq-quic` as a `Controller` wrapper: any controller can be resumed. BBR3 seeds its bandwidth model and pacing rate directly; Cubic seeds `ssthresh`. - The store is a bounded, in-process map keyed by remote address plus SNI,