diff --git a/quest/README.md b/quest/README.md index 44d4a25ff1e..19f5ad3323b 100644 --- a/quest/README.md +++ b/quest/README.md @@ -51,12 +51,3 @@ that fails intermittently in CI, Nightly, or the merge queue becomes a child of m0's [test flakes](/quest/m0/test-flakes-2/README.md) epic. Skills that plan follow-ups plan a reported flake there without asking whether or where; the planning PR's review is the check. - -## Required - -- [m0: immediate priorities](/quest/m0/README.md) - urgent work of any kind, and maintenance of the current release -- [m1: additive work](/quest/m1/README.md) - this cycle's improvements and fixes that need no breaking release; each ships with the next cut or as a backported patch -- [m2: the next breaking release](/quest/m2/README.md) - every change that would need a breaking release if it landed after the cut, plus the cut gate; the cut waits on m2 alone -- [m3: later work, higher priority](/quest/m3/README.md) - byte streams and mesh libraries first, release execution, what a named consumer needs, and bug fixes in shipped code -- [m4: later work, lower priority](/quest/m4/README.md) - tests, tooling, benchmarks, optimizations, and features nobody waits on yet -- [m5: deferred](/quest/m5/README.md) - gated on the outside world (hardware, a partner, a consumer, a provider's offer, or an upstream release), or speculative with no named consumer diff --git a/quest/m0/README.md b/quest/m0/README.md index 6b9f456fbbd..abcc4ad29c9 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -23,15 +23,3 @@ Routing: Wildcard landed in #4403, so a service claims the prefix it could serve instead of enumerating broadcasts. Serving the relay's ingested-only view (`origin::Consumer::local()`) to localhost workers belongs to moq.pro's edge, which embeds moq-relay; it moved there on 2026-09-28. - -## Required - -- [Nightly passes on main](/quest/m0/nightly/README.md) - the scheduled Nightly passes end to end, so red means a new break -- [Interop and Video pass on main](/quest/m0/interop-green/README.md) - the scheduled Interop and Video workflows pass, so red means a new break -- [Publish the release line's drain() wrappers](/quest/m0/ffi-shutdown-backport.md) - Dart `moq` 0.1.1 reaches pub.dev from `release` -- [CI cost and latency](/quest/m0/ci/README.md) - cloud CI runs only in GitHub's merge queue, one tested entry at a time, expensive checks run nightly and gate `release`, caches move to R2, and runners are chosen last -- [More tests under load](/quest/m0/test-flakes-2/README.md) - load-only and queue failures, one quest per flake, fixed at the cause, since each one drops a queued PR -- [just check passes on macOS](/quest/m0/macos-check.md) - `check cpp` and `check py`, the last two macOS failures, pass on a macOS host -- [Agent build output can't fill the desktop's disk](/quest/m0/agent-disk-budget.md) - finished agent checkouts reclaim their mbx targets automatically, so parallel agent builds stop filling the root disk -- [MoQ builds against rind 0.4 and its corrected adapters](/quest/m0/rind-adapters.md) - the calls rind 0.4 and its adapter patch releases change, adapted the day they publish -- [moq-transport stops sending our max age as MAX_CACHE_DURATION](/quest/m0/ietf-max-age.md) - a late joiner reads the newest catalog through any draft-18 relay, fixing the regression from moq-dev/moq#7729 before the cut ships it diff --git a/quest/m0/ci/README.md b/quest/m0/ci/README.md index 47bba1854d8..bab2beb5828 100644 --- a/quest/m0/ci/README.md +++ b/quest/m0/ci/README.md @@ -173,10 +173,3 @@ feature was considered and not planned: the churn outweighs the build saving. Measure each change against a current baseline and record the result in its PR. The historical samples locate candidates; they are not controlled benchmarks. - -## Required - -- [Read-only pull-request CI](/quest/m0/ci/read-only-secrets.md) - write secrets and publisher identities reach only protected branches and tags, never a pushed branch -- [Verify the R2 Rust cache](/quest/m0/ci/mbx-r2-verify.md) - confirm the hosted Nightly jobs reuse the previous Nightly, then measure restore time and expiry -- [Release tags push to nix.moq.dev, and Cachix stops taking writes](/quest/m0/ci/cachix-retire.md) - backport `release-nix.yml` and its Just module to `release`, drop `cachix.yml`, prove a tag substitutes from nix.moq.dev, then revoke the Cachix token (the cache stays for old tags) -- [Measure the Linux cache effect of native media exclusions](/quest/m0/ci/hakari-followups.md) - scheduled Linux jobs measure cache reuse after unrelated tests stop compiling PipeWire and libclang diff --git a/quest/m0/nightly/README.md b/quest/m0/nightly/README.md index a7b30bfa623..6da7bd3e02a 100644 --- a/quest/m0/nightly/README.md +++ b/quest/m0/nightly/README.md @@ -47,7 +47,3 @@ more children for the causes nothing owned. Dropped: one-night bench moves near the paired threshold (re-check if one repeats), a one-off `remote error: 52` in the browser bench smoke, and failures main or [moq-dev/moq#8290](https://github.com/moq-dev/moq/pull/8290) already fixes. - -## Required - -- [Nightly's macOS platform job passes](/quest/m0/nightly/macos.md) - `moq-audio`'s tests compile on macOS again and the websocket version test's timeout is fixed if it recurs diff --git a/quest/m0/test-flakes-2/README.md b/quest/m0/test-flakes-2/README.md index 36282107cb1..ba440e0fce6 100644 --- a/quest/m0/test-flakes-2/README.md +++ b/quest/m0/test-flakes-2/README.md @@ -267,7 +267,3 @@ queue before counting queues, fixed by [moq-dev/moq#8396](https://github.com/moq-dev/moq/pull/8396). Public API: none. Wire: none. - -## Required - -- [Kotlin's playout-delay smoke test holds up under load](/quest/m0/test-flakes-2/kt-playout-delay.md) - the audio playout-delay smoke test passes under load, and its `@Ignore` is removed diff --git a/quest/m1/README.md b/quest/m1/README.md index c6652de3f81..15bdd7466a0 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -29,34 +29,6 @@ breaking epics and quests stay in m1 for now and are listed in m2's stream-credit. The [re-cut follow-up](/quest/m2/recut-held.md) moves what remains of them once their claims merge. -## Required - -- [Drop set](/quest/m1/drop-set.md) - each cursor's disposition record is billed to the cache pool, as the track's drop runs are, so fragmenting drops costs what the pool holds; eviction folds final runs or ends the cursor with `TooFarBehind` -- [Routing guide](/quest/m1/routing-guide.md) - concepts and practical outbound federation setup -- [A reader on a failed copy continues on the held re-offer](/quest/m1/copy-recover.md) - a live reader keeps a group whose copy fails by continuing on the same track's re-offer at the same frame -- [Group errors are cached by kind](/quest/m1/group-error-cache.md) - permanent group errors bind every reader, retryable ones are kept only for a bounded time, and a live SUBSCRIBE_DROP or FETCH answered `Old` no longer caches it for good -- [The overcommitted receive-window cells run again](/quest/m1/receive-windows-evicted.md) - `benchmark_receive_windows` measures its 256-stream and 4 MiB-frame cells again, reporting delivered frames and evictions instead of stalling -- [Stream credit by priority](/quest/m1/stream-credit/README.md) - every stream opens through one priority entry point, and a higher-priority group takes over or resets a lower one when credit runs out -- [Audio jitter target](/quest/m1/audio-jitter-target/README.md) - the playout target is default in both languages; audio that slows down and catches up around it in every player, graded in that direction, and a native trace replay remain -- [Buffered playback subscribes in ascending order](/quest/m1/buffered-ascending.md) - a buffered `` asks for the oldest group first, so a voice reply's opening arrives first, and audio's head hold shrinks to the floor -- [Track drop runs are forgotten below the floor](/quest/m1/drop-runs-prune.md) - a track's dropped-group record stays proportional to its window in Rust and JS -- [A resumed QUIC client gives up on its own idle timer](/quest/m1/quic-resume-idle.md) - a client stopped past its idle timeout closes within about one timeout of resuming, without waiting on a stateless reset -- [A reused moq-transport alias delivers a group that beats its SUBSCRIBE_OK](/quest/m1/ietf-alias-reuse.md) - a new SUBSCRIBE clears its track's alias tombstone, so moqxr's alias-0 catalog refetch no longer hangs -- [A screen share publishes only while joined](/quest/m1/room-screen-joined.md) - `@moq/room` publishes no screen share before joining or after leaving -- [The TLA+ models run nightly and reviews resync them](/quest/m1/model-checks-nightly.md) - every model config runs in Nightly, open findings must still fail, and review reruns a model whose covered code changed -- [The route model covers a mesh with clients and an announce budget](/quest/m1/route-mesh-model.md) - every ordering on 4-5 relay meshes with two origins and clients, with an announce budget and convergence -- [Seeded lite-07 meshes hold the route rules and an announce budget](/quest/m1/route-mesh-sweep.md) - the route rules and message budget checked on real sessions over random meshes -- [A model of a relay chain's failover delivers every group once](/quest/m1/failover-chain-model.md) - route, resume, and subscribe composed across a relay chain whose hops fail -- [Route sweeps are checked against the TLA+ model](/quest/m1/route-trace-validation.md) - each `sweep_handoff` run is a behaviour of `RouteHandoff.tla`, with a trace format the other models reuse -- [The route rules hold from any state, not only the runs TLC reaches](/quest/m1/route-inductive.md) - Apalache checks an inductive invariant behind the route rules on meshes of up to five relays -- [A symbolic model proves a route key proof binds to its session and side](/quest/m1/route-key-model.md) - Tamarin proves no replay, reflection, or relaying of lite-07's Route Key Parameter, and gates the cut -- [A hostile peer's session cannot panic, leak, or disturb another broadcast](/quest/m1/session-fuzz.md) - whole-session fuzz targets for moq-lite and moq-transport with a bystander broadcast as the oracle -- [A reused moq-transport alias refuses its track at once](/quest/m1/ietf-alias-refuse.md) - a SUBSCRIBE_OK on an alias already bound fails its readers and removes its entry without waiting on the peer's FIN acknowledgement -- [Unused crates, scripts, and files are deleted](/quest/m1/unused-code.md) - moq-room, the moq-native tombstone, demo/throttle, sh/dart/publish.sh, demo/web's Solid deps, and unpublished packages' release notes go -- [The CARLA bridge builds outside the root workspace](/quest/m1/carla-workspace.md) - workspace builds stop compiling the demo bridge -- [A client's first dial fails fast](/quest/m1/reconnect-fail-fast.md) - a client that never got a session stops instead of retrying, later failures back off, and a version mismatch is logged on both sides -- [Find out whether Cloudflare's relay really sends SOLICIT](/quest/m1/cf-solicit.md) - capture its SETUP, then close moq-dev/moq#8418 as their bug or fix our parsing - ## Related - [A busy js/net serve yields](https://github.com/moq-dev/moq/pull/5289) - js/net's serve loop leaves the browser its event loop under a fast publisher, if it does not already diff --git a/quest/m1/audio-jitter-target/README.md b/quest/m1/audio-jitter-target/README.md index 99b595c656f..8df019a18a8 100644 --- a/quest/m1/audio-jitter-target/README.md +++ b/quest/m1/audio-jitter-target/README.md @@ -87,15 +87,6 @@ the native decode path too, asserting the same target series the browser's `playout.test.ts` does. The audio quality harness's `pulse` rows already grade native playback against its budgets. -## Required - -- [Stretch model](/quest/m1/audio-jitter-target/stretch.md) - every player slows down when its buffer runs low and speeds up once it refills, by one rule and one set of vectors, buffered mode included -- [The `stretch` setting](/quest/m1/audio-jitter-target/stretch-setting.md) - a player sets how far audio may trail before it skips, and zero turns the stretch off -- [Calibrate](/quest/m1/audio-jitter-target/calibrate.md) - every browser and native ceiling re-measured from seven Nightlies with the model -- [Capped budgets](/quest/m1/audio-jitter-target/capped-budgets.md) - the AAC browser budgets are re-measured from nightlies after the TS importer groups each PES -- [Chromium Opus stalled share](/quest/m1/audio-jitter-target/opus-stalled-share.md) - the Chromium Opus browser rows' stalled-share ceiling is measured with the stretch, and passes -- [Native backpressure](/quest/m1/audio-jitter-target/native-backpressure.md) - native playback decodes audio only when the ring has room, holding the rest of the target encoded as the browser does - ## Closes - [#2812](https://github.com/moq-dev/moq/issues/2812) - the iOS stutter report the same estimator fixes diff --git a/quest/m1/audio-jitter-target/native-backpressure.md b/quest/m1/audio-jitter-target/native-backpressure.md deleted file mode 100644 index 5554e3c36c1..00000000000 --- a/quest/m1/audio-jitter-target/native-backpressure.md +++ /dev/null @@ -1,73 +0,0 @@ -# [M] Native playback decodes audio only when the ring has room - -## Goal - -Native playback (`moq_audio::decode::Consumer` feeding `moq play`'s sink) -decodes an audio frame when the browser's `Backpressure` would: while playing, -once the playhead is within the ring's floor of it, and, live, once the media -queued behind it covers the part of the target held encoded, so a backlog past -the target still reaches the ring to be caught up. The rest of the target -delay stays encoded upstream, so native memory follows the bytes actually -received and the ring never grows with the delay. Once this lands, Rust splits -the target between decoded PCM and encoded media the way JS does, and -`moq play` holds no decoded PCM outside the ring. - -## Plan - -Planned 2026-11-09 (maintainer, /quest-complete follow-up of -[moq-dev/moq#8362](https://github.com/moq-dev/moq/pull/8362): "quest-plan -backpressure like JS does. So we don't decode audio until there's space in -the ring buffer"). โœ… m1, in this epic (rejected: m2, m3). - -The browser already works this way: `Backpressure` in -`js/watch/src/audio/buffer.ts` decides when the decode loop may decode a frame, -holding the ring at its floor of PCM and the hold encoded in the container -consumer. Native decodes promptly instead: `Consumer::read` decodes each packet -as it is read, and the PCM waits in `play_audio`'s queue in -`rs/moq-cli/src/play/media.rs`. #8362 keeps a delay past the ring's budget in -sync by parking that PCM there until it is due. This quest replaces that queue -with the gate, so the hold stays encoded. - -Mirror the browser's rules, including the stalled refill that starts playback -with the whole target ahead of the playhead, rather than inventing new ones. -Share names and tests with the JS side where the two can match. - -The gate waits before decoding, never before reading. `Consumer::read` stamps -each packet's arrival for the jitter estimate (`target.observe` in -`rs/moq-audio/src/decode/consumer.rs`), and `Consumer::delay()` documents that -reads paced to the speaker make the estimate measure the pacing. Keep reading -and observing encoded packets as they arrive and hold them encoded, as -`js/watch` reads a frame and only then awaits `ring.wait()`. - -The gate has two inputs, and `play_audio` owns both, so the consumer needs -them passed in: - -- The playhead the JS worklet reports. Native can derive it from - `Sink::buffered()` (`rs/moq-audio/src/playback/sink.rs`) and the last - write's timestamp. -- The shared playout delay: the catalog `delay` plus the target, the largest - among the subscribed renditions, which the browser passes as - `sync.out.delay` and `play_audio` already holds the sink to through - `presentation.due`. `Consumer::delay()` is this track's jitter target alone; - a gate on it would decode at a depth the sink has already outrun and could - not replace #8362's hold. - -Decided 2026-11-09 (maintainer, /quest-unblock): the gate must not start -audio early when a shared catalog delay is under the ring's cap, with a test. -โœ… Fix it here (rejected: pad the missing lead in -[moq-dev/moq#8362](https://github.com/moq-dev/moq/pull/8362)). With a shared delay -that fits the sink's cap, that PR writes the frame without its hold-path lead -padding, so audio can start up to ~150 ms early -(`rs/moq-cli/src/play/media.rs`). The browser-mirroring refill starts with the -whole target ahead of the playhead and replaces that padding path, so the fix -lands with the gate. - -Keep the gate inside moq-audio's consumer if that stays additive; if it needs -a public API change, it moves to m2. - -Public API: additive if the gate stays inside `moq_audio::decode::Consumer`. -Wire: none. - -## Related - -- [Stretch model](/quest/m1/audio-jitter-target/stretch.md) - requires this gate, then changes the stalled refill mirrored here to a small cushion in both players diff --git a/quest/m1/audio-jitter-target/stretch.md b/quest/m1/audio-jitter-target/stretch.md index 262a02e6fed..25da7023dd2 100644 --- a/quest/m1/audio-jitter-target/stretch.md +++ b/quest/m1/audio-jitter-target/stretch.md @@ -123,10 +123,6 @@ decision now runs a filter. Public API: none expected. Wire: none. -## Required - -- [Native backpressure](/quest/m1/audio-jitter-target/native-backpressure.md) - native holds its ring at a floor and the rest of the target encoded, as the browser does, so one rule reads the same buffer in both - ## Closes - [#8031](https://github.com/moq-dev/moq/issues/8031) - buffered playback loses lip sync and cuts audio out on a live stream diff --git a/quest/m1/stream-credit/README.md b/quest/m1/stream-credit/README.md index 3f4b7c29445..f0fbc1d3bb3 100644 --- a/quest/m1/stream-credit/README.md +++ b/quest/m1/stream-credit/README.md @@ -46,7 +46,3 @@ which JS cannot raise; Chrome stalled at 103, Firefox at 100): This epic owns the end-to-end test: a browser reader and a Rust relay over WebTransport, 300 live tracks of mixed priority, the highest-priority ones receiving every group, and nothing hanging. - -## Required - -- [Takeover](/quest/m1/stream-credit/takeover.md) - on lite-07 a higher-priority group takes over an acknowledged stream, and a group that lost its stream resumes diff --git a/quest/m2/README.md b/quest/m2/README.md index 9a2c9848ee8..3fc00bd770f 100644 --- a/quest/m2/README.md +++ b/quest/m2/README.md @@ -192,19 +192,4 @@ quests that require them. ## Required - [Drop set](/quest/m1/drop-set.md) - each cursor's disposition record is billed to the cache pool, as the track's drop runs are, so fragmenting drops costs what the pool holds; eviction folds final runs or ends the cursor with `TooFarBehind` (held in m1 by an open claim) -- [Subscribe ranges](/quest/m2/subscribe-ranges/README.md) - a lite-07 SUBSCRIBE asks for past and live ranges with absolute or relative ends, in either order, and replaces FETCH for multi-group reads (single-group FETCH stays); merged ranges never starve a subscriber; relays fill misses by range, including over moq-transport -- [Address groups by timestamp](/quest/m2/time-addressing/README.md) - group start timestamps replace sequence numbers in the moq-net API and lite-07 wire, while old subscribers, old publishers, and published JS clients keep working -- [Cluster routing](/quest/m2/cluster-routing/README.md) - prove shared routing contracts, implement per-origin routes, and connect outbound local clusters -- [Promote the routes epic out of cluster routing](/quest/m2/promote-cluster-routes.md) - no epic holds another, once the open PRs under it land -- [A group a subscriber gives up on is always reported](/quest/m2/group-drops.md) - the wire names every abandoned group and the drop signal is public, so readers count losses instead of stalling - [Stream credit by priority](/quest/m1/stream-credit/README.md) - every stream opens through one priority entry point, and a higher-priority group takes over or resets a lower one when credit runs out (held in m1 by an open claim) -- [Prove cache-aware routing](/quest/m2/cache-routing-proof.md) - warm routes and the eligibility rule hold in route-layer sweeps, and the warm message's wire placement is chosen before the lite-07 cut -- [Route latency](/quest/m2/route-latency.md) - the maintainer decides whether a lite-07 ROUTE carries an informational latency sum, and it lands before the cut if so -- [Finalize moq-lite-07](/quest/m2/lite07-finalize.md) - when the maintainer cuts it, lite-07 negotiates as `moq-lite-07` and the next release ships it -- [Unbounded groups](/quest/m2/unbounded-groups/README.md) - groups and frames lose their size caps; a group keeps a 32 MB tail, and readers behind it replay through paced flights or refresh -- [Small API fixes before the cut](/quest/m2/api-shape/README.md) - one path and one spelling per item, names by role, and no dead or wrong-role public surface across net, transport, media, native, apps, JS, and bindings -- [Probe](/quest/m2/probe/README.md) - a session probes up to the bitrate it wants to send or receive, so a stopped simulcast rendition resumes and a viewer up-switches; browser padding is parked in m3 (held in m2 by open claims; moves to m3) -- [Finish the milestone re-cut](/quest/m2/recut-held.md) - claim-held epics move to the milestone their kind and priority give them once their claims merge -- [A watcher reads connecting, not offline, while its connection is down](/quest/m2/watch-connecting-status.md) - `@moq/watch` status says OFFLINE only when connected and unannounced -- [moq-transport is a compatibility layer again](/quest/m2/ietf-scope/README.md) - our extensions, JS FETCH serving, and track listing leave moq-transport; live media and joining FETCH stay -- [The reconnect loop stops judging errors by kind](/quest/m2/reconnect-no-error-kinds.md) - after a first session every failure retries with backoff; `Verdict::Refused`, `Verdict::Fatal`, and `From<&Error> for Verdict` go diff --git a/quest/m2/cluster-routing/README.md b/quest/m2/cluster-routing/README.md index bcccbbd027f..d6e3fb3bd68 100644 --- a/quest/m2/cluster-routing/README.md +++ b/quest/m2/cluster-routing/README.md @@ -129,11 +129,6 @@ Each implementation updates the docs it makes stale. The separate [routing guide](/quest/m1/routing-guide.md) explains the combined design and setup after the capabilities land. -## Required - -- [Outbound federation](/quest/m2/cluster-routing/federation.md) - an outbound-only local relay exchanges authorized broadcasts with the CDN and survives partition/healing -- [Routes and announces](/quest/m2/cluster-routing/routes/README.md) - implement the proven route layer with Rust/JS parity and tiered-cluster acceptance - ## Related - [P2P](/quest/m4/p2p/README.md) - application-selected peer sessions feed the shared routing model diff --git a/quest/m2/cluster-routing/routes/README.md b/quest/m2/cluster-routing/routes/README.md index e77823753b9..8d4fe86ef09 100644 --- a/quest/m2/cluster-routing/routes/README.md +++ b/quest/m2/cluster-routing/routes/README.md @@ -541,11 +541,6 @@ benchmarks. ## Required -- [js/net route layer](/quest/m2/cluster-routing/routes/js.md) - `js/net` encodes, decodes, and resolves the route layer -- [Route layer acceptance](/quest/m2/cluster-routing/routes/acceptance.md) - forwarding fixtures ported and the model deleted, incident fixtures, end-to-end checks, and benchmarks -- [Firefox tabs prove their route key](/quest/m2/cluster-routing/routes/browser-proof.md) - a current Firefox tab opens a lite-07 session with a route-key proof the relay verifies, once neqo's exporter follows the draft -- [Playwright bundles Chromium's spec exporter](/quest/m2/cluster-routing/routes/playwright-pin.md) - the toolchain's Playwright bundles Chromium 158+, so the route key lane proves the Chromium tab -- [A ROUTE_END echo arrives behind the echoer's routes](/quest/m2/cluster-routing/routes/echo-order.md) - no node drops its feasibility distance while a route derived from its own can still arrive, so routes never count to infinity - [The route model covers a mesh with clients and an announce budget](/quest/m1/route-mesh-model.md) - every ordering on 4-5 relay meshes with two origins and clients, with an announce budget and convergence - [Seeded lite-07 meshes hold the route rules and an announce budget](/quest/m1/route-mesh-sweep.md) - the route rules and message budget checked on real sessions over random meshes diff --git a/quest/m2/probe/README.md b/quest/m2/probe/README.md index 535612b10f0..e4d84843236 100644 --- a/quest/m2/probe/README.md +++ b/quest/m2/probe/README.md @@ -97,10 +97,6 @@ This README's own work, once the children land: `doc/lib` pages rather than adding a page, unless the material outgrows them. Children keep their own API docs and drafts current inline. -## Required - -- [Browser send estimate](/quest/m2/probe/browser-send-estimate.md) - browser publishers adapt to `getStats()`'s send estimate once Chrome and Safari report one - ## Related - [Realtime uplink congestion control](/quest/m3/quic-realtime/README.md) - a delay-based alternative to BBR3 on native uplinks; it must implement native probing to ship (decided 2026-10-25) diff --git a/quest/m2/subscribe-ranges/README.md b/quest/m2/subscribe-ranges/README.md index 337688b3b8c..63e756422e2 100644 --- a/quest/m2/subscribe-ranges/README.md +++ b/quest/m2/subscribe-ranges/README.md @@ -100,12 +100,6 @@ This line owns the end-to-end test: a relay with a sparse cache answers a wide past range plus live in both orders, over lite-07 and moq-transport, with every sequence delivered or dropped. -## Required - -- [JS head fills and time lookups](/quest/m2/subscribe-ranges/js-fills.md) - JS readers fill a cached group's missing head before handing it out, and look a time start up through `Fill.time` -- [Lite-07 FETCH is single-group only](/quest/m2/subscribe-ranges/lite07-fetch.md) - lite-07 FETCH reads one group or a slice of one, and SUBSCRIBE ranges of whole groups, in Rust, JS, and the draft, with JS multi-group fills moving onto the subscription -- [Delete the old start bookkeeping](/quest/m2/subscribe-ranges/start-bookkeeping.md) - what each lite cursor is owed and dropped lives in the model, and `TrackRun` only translates it per version - ## Related - [Rust groups by start](/quest/m2/time-addressing/model.md) - the cut reworks `Absolute(group)` ends and sequence-range drops onto times diff --git a/quest/m2/time-addressing/README.md b/quest/m2/time-addressing/README.md index a3bc0b72e75..266177c7e0e 100644 --- a/quest/m2/time-addressing/README.md +++ b/quest/m2/time-addressing/README.md @@ -8,14 +8,3 @@ or starts from a time, nothing maps between group numbers and time, and no producer has to remember group numbers. Old subscribers, old publishers, and published JS clients keep working. VOD, FETCH, and archives need no backwards compatibility. - -## Required - -- [Rust groups by start](/quest/m2/time-addressing/model.md) - the moq-net model and API address groups by start, and legacy wires carry the start ticks as the group ID -- [Lite-07 by start](/quest/m2/time-addressing/lite07.md) - lite-07 carries starts, previous-start links, GROUP_END, and time bounds instead of sequence numbers -- [moq-transport IDs verbatim](/quest/m2/time-addressing/ietf.md) - group IDs pass through as keys, Prior Group ID Gap signals drops best-effort, END_OF_GROUP marks a whole group, and our Timestamp property goes -- [@moq/net by start](/quest/m2/time-addressing/js.md) - JS matches Rust's model, wire, and legacy mapping -- [Consumers by start](/quest/m2/time-addressing/consumers.md) - hang drops duration and discontinuity markers, and every consumer that numbered groups uses starts -- [Bindings by start](/quest/m2/time-addressing/bindings.md) - moq-ffi, moq-c, and every binding expose starts, with migration docs -- [E2EE nonce](/quest/m2/time-addressing/e2ee.md) - the nonce binds the start instead of the sequence -- [Guide](/quest/m2/time-addressing/guide.md) - a page explaining seek by time, group ends, restarts, strictly increasing starts, and how legacy peers see group IDs diff --git a/quest/m2/unbounded-groups/README.md b/quest/m2/unbounded-groups/README.md index db7516ba140..19ad9e2c424 100644 --- a/quest/m2/unbounded-groups/README.md +++ b/quest/m2/unbounded-groups/README.md @@ -177,9 +177,3 @@ owns the rest: a long compressed group through a small cache pool with a plain reader on a legacy wire, which [moq-dev/moq#6993](https://github.com/moq-dev/moq/pull/6993) covered only at the model layer (maintainer, 2026-10-30). - -## Required - -- [Byte holes](/quest/m2/unbounded-groups/byte-holes.md) - segments inside a frame shed like front frames and flights start at `(frame, byte)` on the current lite wip; the frame cap goes -- [JS byte holes](/quest/m2/unbounded-groups/js-byte-holes.md) - `@moq/net` mirrors the byte-offset wire and continues a frame cut off mid-way -- [Compressed frames have no size cap and inflate as a bounded stream](/quest/m2/unbounded-groups/compressed-stream.md) - A compressed frame of any size publishes and is received in Rust and `@moq/net`, like a plain one diff --git a/quest/m3/README.md b/quest/m3/README.md index 5ba40b1d8ee..d20f011e1a4 100644 --- a/quest/m3/README.md +++ b/quest/m3/README.md @@ -33,167 +33,3 @@ them from `main` through a git submodule, so it needs them merged, not released. They stay out of m1 and m2 so the cut does not wait on them; each starts as soon as its prerequisites (sockets, fastest-reader pacing, outbound federation) land. - -## Required - -- [Byte streams](/quest/m3/stream/README.md) - TCP connections ride MoQ losslessly through relays, proxied per hop rather than as IP packets -- [Mesh libraries](/quest/m3/mesh/README.md) - an `Endpoint` reaches any enrolled node by endpoint ID over relays or a sparse direct overlay, with address hints and a `.status` track; the mesh binary and UI live in Kixel -- [`@moq/net` broadcasts expose their requests](/quest/m3/net-broadcast-requests.md) - a JS broadcast serves tracks it never created, on demand, like Rust -- [`@moq/crypto` loads a stored signing key](/quest/m3/crypto-key-load.md) - one device key proves mesh identity and signs broadcasts -- [JS announced coalescing](/quest/m3/js-announced-coalesce.md) - `@moq/net`'s `Announced` keeps one pending event per path, like Rust -- [An audio track's final flush joins its open group](/quest/m3/audio-flush-group.md) - a zero-`delay.max` subscriber gets the tail, not `Old` -- [Release execution](/quest/m3/release/README.md) - publication, installed-artifact proof, cleanup, and downstream adoption after m2 -- [Vendored code has every upstream fix it needs](/quest/m3/vendor-sync/README.md) - the next cycle's vendor sync, which the cut moves under the m2 cut gate -- [Release pull requests read the R2 Rust cache](/quest/m3/mbx-r2-release-cache.md) - after the cut brings the platform Rust cache to `release` -- [Binary release publishers run on their tag](/quest/m3/release-tag-publishers.md) - after the cut brings the workflows to `release` -- [Relays split horizon per session](/quest/m3/route-split-horizon.md) - a relay never advertises a route back over the session it came from -- [Cache-aware routing](/quest/m3/cache-routing/README.md) - a relay stays on a broadcast's path only for a local reader, two downstream sessions, or its one consumer's cheapest cold route, and joins a neighbor's copy instead of pulling another -- [crates.io trusts the workflow](/quest/m3/crates-trusted-publisher.md) - maintainer action: the crates the cut first-publishes by token get a trusted publisher for `release-rs.yml` -- [Rust releases publish through OIDC](/quest/m3/release-rs-oidc.md) - release-plz publishes with trusted publishing and `CARGO_REGISTRY_TOKEN` is revoked -- [One policy for oversized container metadata](/quest/m3/import-metadata-policy.md) - fMP4 and MKV refuse or stream huge metadata by one documented rule -- [Video quality](/quest/m3/video-quality/README.md) - a nightly VMAF harness grades every encoder backend and on-demand GoP pops against floors, and moq-boy's encode is fixed under it -- [rust2's exporter is ready for moq](/quest/m3/rust2-exporter.md) - waiting on moq-dev/rust2's exporter to generate every language moq ships -- [Switch to rust2's exporter](/quest/m3/ffi-exporter.md) - moq's bindings come from rust2-ffi, moq-ffi shrinks to its remainder, and moq's UniFFI generator code is deleted -- [Generated C bindings](/quest/m3/c/README.md) - C generated from moq-ffi ships as `moq-c` 0.8.0 and replaces the hand-written crate -- [A runtime-free QUIC driver](/quest/m3/quic-sansio-driver.md) - a caller's own loop moves UDP datagrams and polls moq sessions over moq-quic, for rust2's bindings -- [QoS](/quest/m3/qos/README.md) - the relay's egress `lag` histogram and `dropped` counters on the stats totals and prefix tracks -- [The DASH manifest keeps segments across a reconfigure](/quest/m3/dash-reconfigure.md) - a same-codec reconfigure keeps the old instance's segments listed in DASH, as HLS does -- [Plan: watch worker](/quest/m3/plan-watch-worker.md) - prototype an invisible page worker against app-spawned workers, and land the jank harness that decides -- [Watch worker](/quest/m3/watch-worker.md) - watch playback runs in a worker onto an OffscreenCanvas, so main-thread jank never stalls video or audio -- [Vulkan Video encode on AMD](/quest/m3/vulkan-encode.md) - H.264 and H.265 from an external Vulkan image on RADV, hand-rolled on ash, proven on an RX 9070 -- [H.265 encodes respect the encoder's minimum size](/quest/m3/h265-min-width.md) - an H.265 encode below AMD's 384-wide minimum is skipped by `Kind::Auto`, and the error names it -- [VA-API encodes an external Vulkan image](/quest/m3/vaapi-vulkan-import.md) - an explicit-sync DMA-BUF reaches Intel's encoder, proven on Arrow Lake -- [C++ FFI reuse](/quest/m3/cpp-ffi-reuse.md) - C++ packages link the shared default-feature FFI build once it is proven compatible -- [OBS native codecs](/quest/m3/obs-moq-video/README.md) - replace FFmpeg video and audio decoding with moq-video and moq-audio, deliver GPU frames, and use native audio/video encoders -- [MoQ in obs-studio](/quest/m3/obs-studio/README.md) - a native MoQ output and service merged into obs-studio, once its maintainers agree; the plugin carries it until then -- [AudioToolbox decode](/quest/m3/audio-decode-audiotoolbox.md) - macOS and iOS decode HE-AAC, multichannel AAC, and what else the framework offers -- [AudioToolbox encode](/quest/m3/audio-encode-audiotoolbox.md) - macOS and iOS encode AAC-LC, for moq-dev/studio's RTMP destinations -- [Media Foundation decode](/quest/m3/audio-decode-mediafoundation.md) - Windows decodes HE-AAC, multichannel AAC, and what else the MFTs offer -- [Media Foundation encode](/quest/m3/audio-encode-mediafoundation.md) - Windows encodes AAC-LC, for moq-dev/studio's RTMP destinations -- [GPU CI](/quest/m3/gpu-ci.md) - NVIDIA tests gate the merge queue on a self-hosted GPU runner VM, and `just rs nvidia` runs them locally instead of skipping -- [Media stats](/quest/m3/stats/README.md) - publishers announce a stats track in the catalog, viewers answer a soliciting catalog through a per-catalog `.echo` broadcast, and one model turns both into a health verdict and a preflight report -- [Wire stats](/quest/m3/wire-stats/README.md) - `Presence` counts each root's transport bytes on the wire, `wire_tx` and `wire_rx`, from QUIC, WebSocket, and embedder gateway sources -- [Session outcome records](/quest/m3/session-outcome-records.md) - relay stats publish each refusal and abnormal session end as a record per label, bounded under a flood, beside the counters -- [Audio renditions carry a language](/quest/m3/audio-lang.md) - audio renditions have an optional BCP-47 `lang`, and watch auto-picks within one language -- [fMP4 and TS imports publish BCP-47 languages](/quest/m3/import-lang-iso639.md) - ISO 639-2 codes become `en`-style tags on audio and text -- [HLS carries every audio language](/quest/m3/hls-audio-languages.md) - every `EXT-X-MEDIA` audio entry imports with its `LANGUAGE`, and exports write it back -- [A refused follower asks a replacement handler](/quest/m3/follow-refused-retry.md) - a same-instance handler swap with identical route details re-asks a refused `Following`, while listeners still see no change -- [iOS capture](/quest/m3/mobile-capture-ios.md) - Rust captures the camera and screen on iOS, setting the catalog rotation -- [Android capture](/quest/m3/mobile-capture-android.md) - Rust captures through NDK/JNI on Android, reusing the existing codecs and setting the catalog rotation -- [Latest readers use Range::live()](/quest/m3/readers-range-live.md) - after #6278, readers start at the live edge without waiting on `largest()` -- [PulseAudio capture periods](/quest/m3/pulseaudio-capture-period.md) - capture on cpal's PulseAudio host arrives in short periods, not the server's 2 s default fragment, proven on the null sink's monitor -- [A JSON snapshot consumer resyncs after a bad frame](/quest/m3/json-snapshot-resync.md) - a decode failure drops the group and the consumer resumes at the next snapshot by itself, so `@moq/room` and moq-boy keep reading -- [Go module proxy](/quest/m3/go-module-proxy.md) - `moq.dev/moq-ffi` ships from a static GOPROXY we host, so its staticlibs stop growing git history by ~61 MiB per release -- [Go per-platform lib modules](/quest/m3/go-ffi-platform-modules.md) - a Go build downloads only the host's staticlib, and `go mod vendor` works -- [Dart on iOS](/quest/m3/dart-ios.md) - prove the shipped iOS native asset actually loads on a device, which no CI can -- [Mobile completion](/quest/m3/mobile-completion.md) - verify the Swift and Kotlin bindings over Rust-owned capture -- [Migrated sessions close once their replacement synced](/quest/m3/goaway-migration-followups.md) - moq-tokio holds the early close for the replacement's announce sync, and the JS `Connection` closes early too -- [moq-transport requests end through one lease](/quest/m3/ietf-request-lease.md) - every IETF request ends through one polled lease, and the two 18k-line files split by mechanism -- [A moq-transport group head fills its hole in place](/quest/m3/ietf-fill-refill.md) - fills and joining FETCHes write into the tail's group, deleting the `Fill` handoff -- [One port](/quest/m3/one-port/README.md) - one UDP port carries QUIC, SRT, and WebRTC media through an embedder hook, and one TCP port carries HTTP, RTMP, and RTMPS -- [WebSocket caps](/quest/m3/rate-websocket.md) - paced reads and writes over bounded socket buffers hold WebSocket to the same caps -- [moq-webrtc pacing](/quest/m3/rtc-pacing.md) - a capped WHEP viewer never receives more than its cap plus burst, NACK resends included -- [SRT rate handle](/quest/m3/srt-rate-handle.md) - a per-connection cap paces SRT pulls, retransmits included, and closes SRT publishers past it -- [One port on the io_uring workers](/quest/m3/uring-demux.md) - `moq-uring`'s workers host the UDP demux, so a ring relay keeps WebRTC media and SRT on its QUIC port -- [Synced data playback](/quest/m3/watch-data-sync.md) - js/watch releases JSON and binary payloads on the media playhead, and a slow data track holds media back -- [WebCodecs audio priming](/quest/m3/webcodecs-priming.md) - `@moq/publish` measures each browser's `AudioEncoder` priming and corrects AAC timestamps and Opus pre-skip, so audio decodes at its capture timestamp -- [poll_acked on moq-net's send stream](/quest/m3/quic-ack-hook.md) - the - backend-neutral hook on moq-net's own transport trait that awaits an - acknowledged stream offset, implemented by the moq-tokio and moq-uring adapters -- [Relay io_uring packages](/quest/m3/relay-io-uring-package.md) - Linux relay packages ship io_uring once the ring is on par with tokio -- [Direct3D11 render import](/quest/m3/render-d3d11.md) - Windows presents without downloading every frame to system memory -- [Media Foundation encodes on the texture's adapter](/quest/m3/mf-encode-adapter.md) - Windows machines with two GPUs keep an exported texture on the GPU route into a hardware encoder -- [Intra-refresh GOPs](/quest/m3/intra-refresh/README.md) - video with periodic intra refresh imports and plays back cleanly with one group per sweep and a catalog `warmup` -- [#3115](/quest/m3/3115-moqsink-the-publication-has-no-generation-so-a-flush.md) - moqsink: a flushing restart after EOS opens a new publication generation -- [Realtime uplink congestion control](/quest/m3/quic-realtime/README.md) - native publishers pick `Realtime`, a receive-ts delay-based controller that keeps the uplink queue near empty for teleoperation -- [Windows capture parity](/quest/m3/capture-windows.md) - system and per-app audio and a settled app-capture policy -- [Linux capture parity](/quest/m3/capture-linux.md) - Wayland window/system-audio capture, per-app audio, and explicit display-selection and app-capture limits -- [Per-app audio on macOS](/quest/m3/capture-app-audio-macos.md) - one application's audio through ScreenCaptureKit -- [cpal loads libasound at runtime](/quest/m3/cpal-alsa-runtime.md) - condition: a cpal release whose Linux build carries no load-time libasound requirement -- [Audio capture without ALSA link](/quest/m3/capture-alsa-link.md) - moq-audio capture and playback build on Linux without linking libasound, and capture becomes a default feature -- [Ship capture and playback](/quest/m3/cli-packaging.md) - a released moq binary can capture and play, which no distribution currently enables -- [moq-relay in nixpkgs](/quest/m3/nixpkgs-relay.md) - `nix-shell -p moq-relay` installs the released relay from upstream nixpkgs, auto-updated from our tags -- [moq-cli in nixpkgs](/quest/m3/nixpkgs-cli.md) - the released `moq` CLI with its full release feature set joins nixpkgs as `moq-cli` -- [GPU capacity and health](/quest/m3/gpu-health.md) - moq-video reports each device's sessions, memory, utilization, and health on NVIDIA, AMD, and Intel alike -- [A release carries multi-vendor GPU input](/quest/m3/gpu-release.md) - `release` carries the GPU surface validated on AMD and Intel; health follows separately -- [The remaining library spawns](/quest/m3/spawn-audit.md) - every async spawn left in a library crate becomes a polled `kio::Tasks` child or is listed with why it stays -- [DVR rewind](/quest/m3/archive-dvr.md) - follow-on capability after the release contract is stable -- [Publisher timeliness at relay ingest](/quest/m3/qos-publisher-timeliness.md) - follow-on capability after the release contract is stable -- [The relay refuses a cluster peer it cannot dial](/quest/m3/relay-undialable-peers.md) - moq-tokio reports the schemes it can dial and names the missing feature when one can't, and the relay refuses an undialable peer at startup instead of retrying forever -- [moq-transport finish interop](/quest/m3/ietf-finish.md) - the interop `finish` case runs on every even moq-transport draft instead of being skipped -- [JS joining FETCH](/quest/m3/ietf-js-joining-fetch.md) - the JS publisher answers a joining FETCH that arrives after a quick finish, mirroring the Rust bound -- [An Absolute join never races an older-history FETCH](/quest/m3/ietf-absolute-join-race.md) - reproduce #7680's suspected collision on main, then fix it or keep the test and delete -- [A passing interop run stops publishers cleanly](/quest/m3/interop-shutdown-warnings.md) - no lingering publisher or unfinished-producer warning in a green interop run -- [Cost audit](/quest/m3/audit-cost.md) - CI jobs, tests, dependencies, build time, and artifact size each earn their cost, deleted by default -- [Code audit](/quest/m3/audit-code.md) - unused code is deleted, overbuilt code simplified, and every lint suppression still needed -- [Test coverage audit](/quest/m3/audit-test-coverage.md) - behavior that matters is tested and every test runs in CI -- [Documentation audit](/quest/m3/audit-docs.md) - docs match the code, with no stale pages, broken examples or links, or undocumented exports -- [Performance audit](/quest/m3/audit-perf.md) - benchmarks that regressed are explained, fixed, or planned, and `main` ships no slower than `release` -- [Interop audit](/quest/m3/audit-interop.md) - our interop runner entries match what we ship, and every red interop cell with a moq.dev side is fixed, reported, or noted as down or unsupported -- [Typecheck with bun check](/quest/m3/bun-check.md) - workspace packages typecheck through bun once nixpkgs ships bun 1.4.4 -- [Clean ALSA playback onset](/quest/m3/audio-alsa-onset.md) - no onset restarts or clicks over PulseAudio -- [Read a bus source's own samples](/quest/m3/audio-strip-tap.md) - a tap reads one source's samples before its delay with their bus-clock positions, for the studio's clap sync -- [moq-audio filter chain](/quest/m3/audio-filters.md) - per-source suppression, gate, compressor, limiter, ducking, and plugins, which moq-dev/studio configures -- [moq-hls exposes each rendition's bound source](/quest/m3/hls-rendition-source.md) - playlists and segments report the source path and instance they read, so a cache can key on the source -- [The memory bench finishes at 1 MiB frames](/quest/m3/memory-bench-hang.md) - the allocation mode's park at `size=1048576` is root-caused and fixed -- [Audio's Latest start reaches back](/quest/m3/audio-latest-reach-back.md) - moq_audio's start covers min plus warmup like other consumers -- [moq-lite tails count drops](/quest/m3/lite-tail-drop-count.md) - SUBSCRIBE_SKIP and SUBSCRIBE_DROP accounting replaces the session-tail grace from lite-05 -- [Audio track changes are gapless](/quest/m3/gapless-audio-switch.md) - no silence beyond a frame on audio format or rendition changes, enforced by media QA -- [We own our WebRTC stack](/quest/m3/webrtc/README.md) - one moq-webrtc crate holds the gateway, its ICE module, the data-channel transport, and a vendored, trimmed str0m/dimpl/is/sctp-proto -- [PUBLISH_DONE says why](/quest/m3/publish-done-codes.md) - GOING_AWAY, TOO_FAR_BEHIND, and EXPIRED round-trip as stream codes -- [A revoked announce resets instead of FINning](/quest/m3/announce-revoke-reset.md) - a PUBLISH_NAMESPACE revoked after its OK resets with INTERNAL_ERROR, per draft-22 ยง6.4.2.3 -- [moq repair refuses a live recording](/quest/m3/mp4-repair-lock.md) - the recorder's advisory lock keeps `moq repair mp4` off a file still being written -- [The error-queue reader decodes truncated control data](/quest/m3/errqueue-truncation.md) - `MSG_ERRQUEUE` keeps what fit on `MSG_CTRUNC`, like the receive paths -- [The QUIC driver tells an MTU probe from an oversized send](/quest/m3/quic-emsgsize-classify.md) - a non-probe `EMSGSIZE` is logged and counted instead of dropped silently -- [fMP4 decode times from the declared reorder depth](/quest/m3/fmp4-declared-clock.md) - `DeclaredClock` replaces the sub-GOP cadence cap, as in TS, FLV, and MKV -- [An ended HLS playlist has no trailing gap](/quest/m3/hls-trailing-gap.md) - no zero-duration `EXT-X-GAP` before `EXT-X-ENDLIST` -- [/fetch answers from the announce sync](/quest/m3/fetch-synced.md) - a missing broadcast gets a 404 once announcements are synced, not after 30 s -- [An advertisement stuck on a zero-credit peer gives up](/quest/m3/advertise-credit-timeout.md) - A Rust moq-transport publisher whose PUBLISH_NAMESPACE or namespace update cannot leave because the peer grants no send credit gives up on it within a bounded time, as it already does on a silent answer: it resets the request and frees its state -- [moq-sock's control buffer is sized for the send options too](/quest/m3/cmsg-len-send.md) - `cmsg::LEN` in moq-sock is derived from, or checked at compile time against, both the receive options and the send options -- [A panic inside moq-tokio's connection internals fails callers instead of panicking them](/quest/m3/connection-panic-isolation.md) - after a moq-tokio QUIC connection driver panics, every client-side caller gets the connection's terminal error instead of panicking in its own task, and the certificate reload watcher and qmux driver tasks are supervised -- [No large future in the FFI layers can overflow a runtime or foreign thread's stack](/quest/m3/ffi-future-size.md) - every future moq-c and moq-ffi spawn or block on is below a size bound that a lint enforces, so unoptimized builds stay inside the runtime thread stack -- [An empty tail stream for a headless moq-transport group creates no group](/quest/m3/headless-empty-tail.md) - when a moq-transport subscription's fill for the Largest Group fails, an empty subgroup stream for that headless group is dropped instead of creating an empty group that reads as complete -- [A recording stalled on an open group reports what it waits for](/quest/m3/hls-stalled-segment.md) - when a moq-hls recording waits on a listed segment whose group a still connected publisher never closes, the wait is visible -- [A kept draft-18 join pins its head group](/quest/m3/ietf-join-pin-head.md) - on draft 18, a joining FETCH that our publisher keeps open after a quick finish is answered even if the publisher drops its `track::Producer` right after `finish()` -- [The JS player keeps a track's start when decoding from its first packet](/quest/m3/js-warmup-trim.md) - `@moq/watch` trims an audio track's catalog `warmup` only on a mid-stream join, as moq-audio does -- [A library recorder gets the takeover cut](/quest/m3/mux-source-cut.md) - A recorder built directly with `moq_hls::export::Broadcaster::new` ends a replaced instance's recording at what it listed when another publisher takes the broadcast over, exactly as one built through `Server::broadcaster` does -- [The OBS source joins audio at the live edge](/quest/m3/obs-decode-latest.md) - the OBS MoQ source's audio decoder starts at the newest cached group instead of replaying the track's backlog, so a reconnect or rendition change plays live audio at once -- [OBS simulcast layers reach moq-watch from a live OBS, including the dock's Go Live](/quest/m3/obs-multitrack-check.md) - A live OBS 32.2.2 run, recorded in the PR, shows the `WHIPSimulcastTotalLayers` profile setting attaching two or more scaled video encoders to `moq_output`, each published as its own rendition and watched in ``, both through the obs-websocket recipe in `doc/bin/obs.md` and through the MoQ dock's Go Live, which honors the profile's layer count instead of creating a single encoder -- [Opus export never writes a channel mapping it can't stand behind](/quest/m3/opus-surround-export.md) - exporting a catalog Opus rendition with 3 to 8 channels and no description writes a `dOps` with the Vorbis family 1 mapping table, as the TS importer assumes, instead of an invalid family 0 `dOps` -- [Open-GOP MPEG-2 export trims leading B-pictures in zero-stuffed CBR streams](/quest/m3/pes-hold-open-gop.md) - A TS export starting or resuming inside an open GOP of MPEG-2 video drops the orphaned leading B-pictures even when their PES ends on zero stuffing, as CBR encoders emit, without ever trimming part of a reference picture whose start code straddles two PES packets -- [A multi-program TS import survives a source switch](/quest/m3/ts-multi-program-restart.md) - `--program all` restarts each affected program on an unannounced source switch, as a single-program import does after moq-dev/moq#7780, instead of ending the whole import -- [The lite publisher tells transport faults from cancels](/quest/m3/publish-cancel-classify.md) - `rs/moq-net`'s lite publisher no longer counts every `Error::Transport` as a clean cancel -- [tls:// sessions report their negotiated ALPN](/quest/m3/tls-link-alpn.md) - A session accepted on a `tls://` listener reports the negotiated moq ALPN in `Link::alpn`, as raw QUIC, WebTransport, and WebSocket sessions already do, so admission and logs see the protocol on every transport -- [PUBLISH token renewal is consistent across pause and forward, and the multi-token cost is profiled](/quest/m3/token-auth-followups.md) - on a moq-transport session, a REQUEST_UPDATE carrying an AUTHORIZATION TOKEN on a PUBLISH gets the same answer whether the PUBLISH is paused or forwarding -- [An audio-only broadcast that can't play hides its play button](/quest/m3/audio-only-play.md) - center-play follows the audio-only rule, proven by a browser test -- [moq-quic's long header type is one variant](/quest/m3/quic-long-type.md) - collapse LongType after the 0-RTT removal -- [One predicate for the lite close wait](/quest/m3/subscriber-fin-fold.md) - fold waits_for_subscriber_fin into has_track_stream -- [MKV imports ffmpeg's multichannel FLAC](/quest/m3/mkv-flac-channel-mask.md) - a channel-mask-only Vorbis comment is accepted, so default ffmpeg multichannel FLAC needs no remux -- [The publish support panel lists only codecs publishing accepts](/quest/m3/publish-support-probe.md) - the settings panel runs the publisher's Annex B encoder probe -- [TLS reload follows symlinked certificate files](/quest/m3/watch-symlink-targets.md) - in-place rewrites of symlink targets in other directories reload roots, served chains, and client certificates -- [A published capture exposes its bandwidth grant](/quest/m3/video-publish-grant.md) - a moq-video publish shows each track's granted bitrate, not only its target -- [The test relay can enable stats](/quest/m3/relay-test-stats.md) - `moq_relay::test_relay` starts with stats on when asked -- [macOS capture listing futures are Send](/quest/m3/capture-shareable-send.md) - ScreenCaptureKit listing and start no longer hold a non-Send block across an await -- [A capture listing a picker can draw](/quest/m3/capture-list.md) - windows grouped by app with icons and placed on their displays, camera kinds, low-rate pictures, and a wait for changes on macOS, Windows, and X11, for moq-dev/studio's Add page -- [Denied macOS system audio names its settings pane](/quest/m3/audio-system-denied-hint.md) - a permission error pointing at Screen & System Audio Recording -- [One encoder follows several connections' estimates](/quest/m3/bandwidth-multi-connection.md) - a track published to two relays tracks both estimates -- [Bandwidth reservations ignore in-process readers](/quest/m3/reservation-local-readers.md) - a local recorder no longer counts as uplink demand -- [Container export starts apart from its skip budget](/quest/m3/export-live-start.md) - fMP4 and MP4 export start at the live edge and report sample counts -- [MP4 export trims exactly at both ends](/quest/m3/mp4-export-window.md) - a presentation window with no lead-in and no presented tail -- [Container export ends cleanly when its broadcast closes](/quest/m3/export-close.md) - every container export returns `None` when its instance closes, whichever signal arrives first -- [Audio capture opens a format the mix accepts](/quest/m3/audio-capture-negotiate.md) - multichannel and odd-rate devices capture, with discrete input selection -- [moq-mux imports a regular MP4](/quest/m3/mp4-import.md) - non-fragmented MP4, `moov` first or last -- [An audio encoder flushes without ending its track](/quest/m3/audio-encode-flush.md) - a clip's last partial frame is heard while the source stays live -- [Padding probes from the browser](/quest/m3/probe-padding.md) - parked: the maintainer doubts padding is the right way for a browser to probe -- [JS rung disable](/quest/m3/probe-rung-disable-js.md) - `@moq/publish` applies the native rung rule, recovering through padding; parked with it -- [Layered broadcasts](/quest/m3/layers/README.md) - hang specifies a layer layout track, and `moq play` and `@moq/watch` composite layers over the main picture -- [moq-rtmp dials rtmps:// and always advertises a tcUrl](/quest/m3/rtmp-rtmps-tcurl.md) - the RTMP client dials an `rtmp://` or `rtmps://` URL and sends its `tcUrl` on both, for moq-dev/studio's destinations -- [moq-webrtc and moq-rtmp dial through a caller's policy](/quest/m3/webrtc-dial-policy.md) - a host that dials untrusted URLs refuses private, loopback, and link-local addresses on every WHIP, WHEP, and RTMP dial -- [A room keeps a participant while one of its aliases is announced](/quest/m3/room-alias-withdraw.md) - withdrawing `camera` while `camera.hang` stays announced keeps the participant -- [@moq/auth key derivation and key sets validate like single keys](/quest/m3/auth-key-validation.md) - `Key.public` shares no scope and never yields an invalid key, and key sets and Rust refuse mismatched keys at parse -- [Binding server helpers observe session errors and describe close truthfully](/quest/m3/serve-session-errors.md) - Python retrieves session task errors, and the Kotlin, Go, and Dart docs say close ends every connection -- [A GOAWAY to a draining fallback session is followed](/quest/m3/reconnect-probe-redirect.md) - a redirect that reaches a draining fallback session is not lost -- [A connection reports Migrating while its predecessor still serves](/quest/m3/reconnect-predecessor-status.md) - Disconnected means nothing serves -- [A group read to its FIN stays finished across updates](/quest/m3/lite-finished-across-updates.md) - a lite-07 subscriber never records a group it got whole as stale -- [A dead redirect target falls back to the configured relay](/quest/m3/net-redirect-fallback.md) - `@moq/net` stops redialing a dead redirect target -- [Room participants survive your own connection blip](/quest/m3/room-keep-through-blip.md) - remote participants stay on screen across the local user's reconnect diff --git a/quest/m3/c/README.md b/quest/m3/c/README.md index d9e9e8e0ea1..407a8d81512 100644 --- a/quest/m3/c/README.md +++ b/quest/m3/c/README.md @@ -56,5 +56,3 @@ publication; [old-crate retirement](/quest/m3/release/c-retire.md) follows. ## Required - [Switch to rust2's exporter](/quest/m3/ffi-exporter.md) - the C ABI comes from rust2's exporter instead of a UniFFI generator -- [C consumers](/quest/m3/c/consumers.md) - the C interop client and `doc/lib/c` samples move onto the generated API -- [Async failure contract](/quest/m3/c/async-failure-contract.md) - every generated async call returns a task and calls back exactly once, cancelled when its task was freed first diff --git a/quest/m3/cache-routing/README.md b/quest/m3/cache-routing/README.md index 00f80c27ec1..66f04a670f2 100644 --- a/quest/m3/cache-routing/README.md +++ b/quest/m3/cache-routing/README.md @@ -99,7 +99,6 @@ This README's own work, once its children land: ## Required - [Prove cache-aware routing](/quest/m2/cache-routing-proof.md) - warm routes and the eligibility rule hold in route-layer sweeps, and the wire placement is chosen -- [Warm routes and per-broadcast parent selection](/quest/m3/cache-routing/select.md) - relays advertise warm routes and pull each broadcast through the cheapest eligible neighbor ## Related diff --git a/quest/m3/intra-refresh/README.md b/quest/m3/intra-refresh/README.md index c84d21e13ac..ca268987a97 100644 --- a/quest/m3/intra-refresh/README.md +++ b/quest/m3/intra-refresh/README.md @@ -46,12 +46,3 @@ make these presentation guarantees true even when sweep lengths change. a true IDR needs none. - H.264 and H.265 only. AV1 and VP9 have no standard gradual refresh signal. WebCodecs has no intra-refresh option, so js/publish is consumer-only. - -## Required - -- [Dual decoder](/quest/m3/intra-refresh/dual-decoder.md) - js/watch's two decoders open on an H.264 recovery point in Firefox and Safari, as they now do in Chromium -- [Plan: recovery boundaries](/quest/m3/intra-refresh/recovery-boundary.md) - settle how a catalog `warmup` duration stays safe for a later, longer sweep -- [Consumer warmup](/quest/m3/intra-refresh/consumer-warmup.md) - the transcoder decodes the groups covering `warmup` as history before each group, except at a true IDR -- [H.264 import](/quest/m3/intra-refresh/h264-import.md) - the splitter keeps `recovery_frame_cnt` and import publishes `warmup` from it -- [H.265 import](/quest/m3/intra-refresh/h265-import.md) - the splitter reads the recovery-point SEI so an HEVC intra-refresh stream forms groups and publishes `warmup` -- [Export sync flags](/quest/m3/intra-refresh/export-sync-flags.md) - fmp4, MKV, and HLS stop advertising a refresh group start as a sync sample diff --git a/quest/m3/layers/README.md b/quest/m3/layers/README.md index 48371c383e5..30ca6309dc4 100644 --- a/quest/m3/layers/README.md +++ b/quest/m3/layers/README.md @@ -35,9 +35,3 @@ Decided 2026-11-08 (maintainer, moq-dev/studio /quest-plan): maps priority onto moq-lite's subscription priorities and unsubscribes a toggled-off layer. - m3: moq-dev/studio is the named consumer, and its side sits in its m2. - -## Required - -- [hang specifies a layer layout track](/quest/m3/layers/spec.md) - a versioned layout track in the hang draft, `rs/hang`, and `js/hang` that both players composite -- [moq play composites layers](/quest/m3/layers/play.md) - `moq play` composites visible layers, mixes their audio, and toggles them -- [The watch player composites layers](/quest/m3/layers/watch.md) - `@moq/watch` composites visible layers, mixes their audio, and toggles them diff --git a/quest/m3/mesh/README.md b/quest/m3/mesh/README.md index 581c4a612fa..3203a95e21a 100644 --- a/quest/m3/mesh/README.md +++ b/quest/m3/mesh/README.md @@ -105,15 +105,6 @@ the third, and survives a relay restart. - [Outbound federation](/quest/m2/cluster-routing/federation.md) - a local relay dials its relays and prefers LAN peers - [Byte streams](/quest/m3/stream/README.md) - lossless TCP-level streams over MoQ -- [Endpoint API](/quest/m3/mesh/endpoint.md) - an iroh-shaped `Endpoint` that connects to an endpoint ID and service and accepts byte streams -- [Mesh relay node](/quest/m3/mesh/node.md) - a relay node enrolls into a mesh, dials its relays, and admits only enrolled LAN peers -- [Mesh enrollment is bounded and revocation takes effect](/quest/m3/mesh/device-bounds.md) - a reusable key enrolls at most its own use budget and a revoked device loses access within a bounded time -- [Certificate credentials](/quest/m3/mesh/cert-credentials.md) - a certificate chain and a proof signature stand in for a JWT, checked against a trust store the application swaps live -- [Address hints](/quest/m3/mesh/addr.md) - nodes publish their addresses on mesh tracks and dial each other directly where mDNS cannot find them -- [Sparse overlay](/quest/m3/mesh/overlay.md) - each node keeps about log N deterministic direct links, forwards for the rest, and falls back to relays across a partition -- [JS mesh enrollment client](/quest/m3/mesh/js-enroll.md) - `@moq/auth` enrolls and refreshes from JS like `moq_auth::mesh::Client` -- [Status track](/quest/m3/mesh/status.md) - a signed `.status` track per node with its links and per-link RTTs -- [Mesh library guide](/quest/m3/mesh/guide.md) - the doc.moq.dev page for the libraries, the contract, and porting from iroh ## Related diff --git a/quest/m3/obs-moq-video/README.md b/quest/m3/obs-moq-video/README.md index d9ebfec9b2e..f3e64f00b06 100644 --- a/quest/m3/obs-moq-video/README.md +++ b/quest/m3/obs-moq-video/README.md @@ -18,13 +18,6 @@ The quests separate portable decoding, audio, and publishing so each can land an Decided in the 2026-09-30 audit: the Windows and Linux GPU decode paths and the macOS and Windows GPU encoder inputs moved to m2 (listed under Related), because each needs physical-hardware proof, and Linux GPU input is already m2/m3. -## Required - -- [Video source replacement](/quest/m3/obs-moq-video/source.md) - remove the FFmpeg video decode and attempt macOS GPU delivery immediately, with a working CPU fallback on other platforms -- [Linux bundle](/quest/m3/obs-moq-video/linux-bundle.md) - attach a portable Linux x86_64 tarball to every obs-moq release once FFmpeg is gone -- [Video publishing](/quest/m3/obs-moq-video/adapter.md) - back an internal OBS video encoder with moq-video and expose the combined opt-in mode -- [VP8/VP9 in OBS](/quest/m3/obs-moq-video/vpx-obs.md) - play VP8 and VP9 through moq-video's libvpx backend on every OBS platform - ## Related - [Video hardware validation](/quest/m5/video-hardware.md) - physical hardware evidence is required for each claimed GPU path diff --git a/quest/m3/obs-studio/README.md b/quest/m3/obs-studio/README.md index ed00b59b446..2d503ee65f6 100644 --- a/quest/m3/obs-studio/README.md +++ b/quest/m3/obs-studio/README.md @@ -26,10 +26,6 @@ Open, for when the port starts: - What stays in the plugin: the MoQ Source and the dock may remain a plugin even once the output is native. -## Required - -- [obs-studio maintainers agree](/quest/m3/obs-studio/maintainers.md) - condition: agreement in principle to a native MoQ output and service - ## Related - [First C++ package release](/quest/m3/release/cpp-release.md) - the published C++ package the port would build on diff --git a/quest/m3/one-port/README.md b/quest/m3/one-port/README.md index 2dcd558d210..e229b202850 100644 --- a/quest/m3/one-port/README.md +++ b/quest/m3/one-port/README.md @@ -93,11 +93,6 @@ dropped and counted. Decided 2026-10-13: the responder binds its own port ([relay STUN](/doc/bin/relay/config.md#stun)), so the shared port never answers public Binding requests. -## Required - -- [WebRTC on the shared socket](/quest/m3/one-port/rtc-feed.md) - `moq-webrtc` serves WHIP and WHEP media from the WebRTC hook and pins ICE tuples -- [SRT on the shared socket](/quest/m3/one-port/srt-demux.md) - moq-srt drives `srt-protocol` on demuxed packets and the flow table pins its 4-tuples - ## Related - [One port on the io_uring workers](/quest/m3/uring-demux.md) - the io_uring workers host the UDP demux diff --git a/quest/m3/qos/README.md b/quest/m3/qos/README.md index 950e89feae1..87688438394 100644 --- a/quest/m3/qos/README.md +++ b/quest/m3/qos/README.md @@ -55,12 +55,6 @@ crate. Client stats left the line (2026-09-29) when media stats moved out of moq-stats onto hang tracks, which are additive on `main`. -## Required - -- [Viewer lag histogram](/quest/m3/qos/lag-histogram.md) - the egress `lag` - histogram and `dropped` counters land on the stats totals and prefix - tracks - ## Related - [Media stats](/quest/m3/stats/README.md) - publishers and viewers report diff --git a/quest/m3/quic-realtime/README.md b/quest/m3/quic-realtime/README.md index 4ff3836d349..cfbc3a12669 100644 --- a/quest/m3/quic-realtime/README.md +++ b/quest/m3/quic-realtime/README.md @@ -176,10 +176,6 @@ the upstream encoder, so a GStreamer pipeline at a fixed bitrate still queues when capacity drops; [its own quest](/quest/m3/quic-realtime/moqsink-feedback.md) owns that feedback. -## Required - -- [moqsink encoder feedback](/quest/m3/quic-realtime/moqsink-feedback.md) - GStreamer publishers retune their encoder to the target rate - ## Related - [QUIC on the sim](/quest/m4/quic-sim.md) - deterministic successor to the moq-shaper harness once it lands diff --git a/quest/m3/release/README.md b/quest/m3/release/README.md index 0bc42fcdbec..a3066dd3e3e 100644 --- a/quest/m3/release/README.md +++ b/quest/m3/release/README.md @@ -24,27 +24,3 @@ wire, archive-format, and legacy limits. Downstream staging, mixed-version upgrade/rollback, canaries, and broad rollout follow publication and require their own operator authorization. Do not mark production stability proven merely because upstream artifacts published. - -## Required - -- [Migration audit](/quest/m3/release/migrate-audit.md) - the cut writes a MIGRATE.md entry for every break, stating the net published-to-final change -- [API shape review](/quest/m3/release/api-review.md) - every new or changed public API reviewed for a better shape before the cut -- [Feature review](/quest/m3/release/feature-review.md) - every major work line since the last release judged end to end before the cut -- [Cargo feature review](/quest/m3/release/feature-flags.md) - defaults stay lean and every remaining feature is scoped to the crate that owns it, before the cut -- [Claim new npm names](/quest/m3/release/npm-first-publish.md) - a maintainer claims `@moq/clock`, `libav`, and `video` on npm with trusted publishing, before the cut publishes them -- [Cycle phases](/quest/m3/release/cycle-phases.md) - later cycles run additive, API, then wire, and cut on demand -- [Cut and publish](/quest/m3/release/cut.md) - independently executable after m2; release-triggered publication -- [Published assets](/quest/m3/release/assets-release.md) - npm carries hostable worklets -- [C++ publication](/quest/m3/release/cpp-release.md) - archives and matching OBS plugin publish and install -- [Generated C publication](/quest/m3/release/c-publish.md) - released archives run the C samples and interop client -- [Dart publication](/quest/m3/release/dart-publish.md) - the wrapper and native artifacts install from the registry -- [Final libmoq stub](/quest/m3/release/libmoq-final-release.md) - publish the migration notice before removing its source -- [Retire libmoq](/quest/m3/release/libmoq-retire.md) - cleanup only after that publication -- [Retire hand-written C](/quest/m3/release/c-retire.md) - delete the hand-written crate once generated C publishes -- [Retire the web-transport JS qmux](/quest/m3/release/qmux-js-retire.md) - once `@moq/qmux` publishes from `js/qmux`, deprecate `@moq/web-socket-stream` and stop the second publisher -- [Retire the web-transport Rust qmux](/quest/m3/release/qmux-rs-retire.md) - once `qmux` publishes from `rs/qmux`, moq-dev/web-transport stops publishing the crate -- [moq.sh deployment](/quest/m3/release/moq-sh-deploy.md) - verify its release-triggered publication -- [Runner client bump](/quest/m3/release/runner-client-bump.md) - the upstream interop runner's Rust client moves to the published moq-tokio, so it stops stamping every object -- [Smoke clients use request and follow](/quest/m3/release/smoke-bindings-rename.md) - condition: a binding release ships the renames; then the native smoke clients move to them -- [Relay loader adoption](/quest/m3/release/relay-loader-adoption.md) - once their pins carry it, embedding consumers load relay config through `Config::merge` and refuse obsolete spellings -- [moq.dev's hosted demos run on sockets](/quest/m3/release/demo-sockets-deploy.md) - after the cut, a maintainer deploys lite-07 and the socket grants so the hosted boy and CARLA demos connect diff --git a/quest/m3/stats/README.md b/quest/m3/stats/README.md index fc5d2f14893..74b24e0491b 100644 --- a/quest/m3/stats/README.md +++ b/quest/m3/stats/README.md @@ -118,15 +118,6 @@ generic, so they join this line as [client health](/doc/concept/stats.md#health) and [preflight](/quest/m3/stats/preflight.md). moq.pro keeps the per-project connection view and the dashboard flow. -## Required - -- [Rust reporters](/quest/m3/stats/rust.md) - the player and gateways - publish stats and feedback, as the CLI remuxes and capture do -- [Preflight](/quest/m3/stats/preflight.md) - a bounded test run over a - broadcast reports which media layer is broken and why -- [Client health in use](/quest/m3/stats/health-consumers.md) - a per-connection media counter, consumers of the grade, and re-measured limits -- [The media test checks browser feedback](/quest/m3/stats/feedback-media-test.md) - a browser publishes feedback and Rust reads it back with `moq export echo` - ## Related - [QoS](/quest/m3/qos/README.md) - the relay's delivery counters; the diff --git a/quest/m3/stream/README.md b/quest/m3/stream/README.md index 9ad4c08ef53..82ee813ba3d 100644 --- a/quest/m3/stream/README.md +++ b/quest/m3/stream/README.md @@ -56,9 +56,3 @@ This epic owns the end-to-end proof: an unmodified TCP client and server (SSH and an HTTP bulk transfer) talk through a two-relay chain with loss injected on one hop, with no corruption, FIN and reset propagated, and memory bounded by the window. - -## Required - -- [Rust byte streams](/quest/m3/stream/rust.md) - a duplex `AsyncRead`/`AsyncWrite` stream, a listener and a dialer, and `moq` CLI forwarding -- [JS byte streams](/quest/m3/stream/js.md) - the same surface in `@moq/net` -- [Stream benchmark](/quest/m3/stream/bench.md) - throughput and latency against raw TCP through a relay chain, with and without loss diff --git a/quest/m3/vendor-sync/README.md b/quest/m3/vendor-sync/README.md index cd8ce5da46c..9590a11e9e0 100644 --- a/quest/m3/vendor-sync/README.md +++ b/quest/m3/vendor-sync/README.md @@ -68,17 +68,6 @@ which builds pinned upstream libav.js, ffmpeg, and opus releases unmodified. Public API: none expected; a ported fix that changes one says so. Wire: QUIC behavior follows quinn's fixes. -## Required - -- [moq-quic has every quinn fix it needs](/quest/m3/vendor-sync/quinn.md) - moq-quic, moq-sock's `udp`, moq-tokio's driver, and moq-congestion's Cubic and BBR3 carry quinn's fixes -- [The WebRTC ports have every upstream fix they need](/quest/m3/vendor-sync/webrtc.md) - moq-congestion's GoogCC and moq-audio's NetEq time stretch follow WebRTC's fixes -- [moq-congestion's SCReAMv2 follows its draft and reference](/quest/m3/vendor-sync/scream.md) - draft revisions and Ericsson's reference fixes are ported or ruled out -- [moq-rtmp's rml has every upstream fix it needs](/quest/m3/vendor-sync/rml.md) - rust-media-libs fixes to rml_rtmp and rml_amf0 are ported or ruled out -- [moq-v4l has every libv4l-rs fix it needs](/quest/m3/vendor-sync/v4l.md) - libv4l-rs fixes are ported or ruled out -- [moq-nvenc has every upstream fix it needs](/quest/m3/vendor-sync/nvenc.md) - nvidia-video-codec-sdk fixes and NVIDIA SDK releases are ported or ruled out -- [moq-vaapi has every ChromeOS fix it needs](/quest/m3/vendor-sync/vaapi.md) - cros-libva and cros-codecs fixes are ported or ruled out -- [UniFFI generator forks are current](/quest/m3/vendor-sync/uniffi.md) - the four `kixelated/uniffi-*` forks carry the upstream fixes moq's bindings need - ## Related - [Cost audit](/quest/m3/audit-cost.md) - covers crates cargo-deny can see diff --git a/quest/m3/video-quality/README.md b/quest/m3/video-quality/README.md index ff4f00bad74..e1f1b819bc9 100644 --- a/quest/m3/video-quality/README.md +++ b/quest/m3/video-quality/README.md @@ -67,11 +67,3 @@ Decided in planning (2026-10-28): - The moq-boy clip is generated, not stored. The emulator is deterministic, so the harness renders it from a public homebrew ROM on `rom.moq.dev` plus scripted input (โœ… "Generate it" over "Store captures"). - -## Required - -- [Harness](/quest/m3/video-quality/harness.md) - `just test video-quality` scores OpenH264 rows with per-frame VMAF and boundary pops against floors, nightly -- [On-demand pops](/quest/m3/video-quality/on-demand.md) - cold starts, resubscribes, and fetch-encoded groups spliced with live ones stay under the pop ceiling -- [moq-boy quality](/quest/m3/video-quality/moq-boy.md) - moq-boy's encode is measured on generated clips and fixed -- [GPU runners](/quest/m3/video-quality/gpu-runners.md) - `nixos2` and the desktop host self-hosted runners for the nightly job -- [Hardware rows](/quest/m3/video-quality/hardware.md) - NVENC and VA-API rows from three GPU hosts gate the nightly and compare side by side diff --git a/quest/m3/webrtc/README.md b/quest/m3/webrtc/README.md index 19a1d9dfb3c..d1e87be2c15 100644 --- a/quest/m3/webrtc/README.md +++ b/quest/m3/webrtc/README.md @@ -18,17 +18,6 @@ Decided 2026-10-30 with the maintainer (planning interview), after the str0m wor - **Upstream fixes:** after vendoring, nobody merges upstream automatically. Record the vendored upstream versions in the crate docs; the release-cut audit checks the upstream changelogs for security fixes (malformed SRTP/RTCP input, for example) and ports them. - Docs a change makes stale (crate names, `doc/lib/rs`, `doc/setup/upgrade.md`, other quests naming a crate or module) change in the PR that makes them stale. -## Required - -- [A typed DTLS handshake timeout error](/quest/m3/webrtc/dtls-timeout.md) - callers match a DTLS handshake timeout by variant, and session end treats it like an ICE timeout -- [Several bandwidth lines per media section](/quest/m3/webrtc/sdp-bandwidth.md) - answers carry both `b=TIAS` and `b=AS` without splicing -- [DTLS waits for ICE](/quest/m3/webrtc/dtls-after-ice.md) - DTLS flights start once ICE nominates a pair, so a late ICE path can't exhaust them -- [The stack takes kio clock time](/quest/m3/webrtc/clock.md) - the vendored code takes `kio::clock::Instant`, so sim tests drive it directly -- [WHIP/WHEP builds carry no SCTP](/quest/m3/webrtc/sctp-feature.md) - SCTP compiles only with the `p2p` feature -- [The vendored stack keeps only what browsers negotiate](/quest/m3/webrtc/browser-only.md) - PSK suites, `ccm`, and anything else no browser uses are gone -- [The vendored stack exposes only what moq-webrtc calls](/quest/m3/webrtc/dead-api.md) - dead upstream API is deleted once clock settles the time seams -- [A failed client socket ends a WebRTC session with an error](/quest/m3/webrtc/socket-error.md) - a client or `p2p` session whose socket fails ends with its I/O error, not `Ok` or `Closed` - ## Related - [moq-webrtc paces WHEP viewers](/quest/m3/rtc-pacing.md) - adds the NACK hook and the shared pacer on the vendored stack diff --git a/quest/m3/wire-stats/README.md b/quest/m3/wire-stats/README.md index 038b0c4c03f..8f4b9ba0ab4 100644 --- a/quest/m3/wire-stats/README.md +++ b/quest/m3/wire-stats/README.md @@ -70,10 +70,3 @@ receive-side limitations. - **One source registry for sessions and embedders.** An embedder registers a gateway connection's wire source on a `stats::Session` from its stats handle's `session(label)`, the same path the relay's own sessions use. - -## Required - -- [qmux byte counters](/quest/m3/wire-stats/qmux.md) - a WebSocket session - reports its TCP bytes -- [moq-srt wire source](/quest/m3/wire-stats/srt.md) - an SRT connection - reports its wire bytes diff --git a/quest/m4/README.md b/quest/m4/README.md index 03400431dc6..cd752feab61 100644 --- a/quest/m4/README.md +++ b/quest/m4/README.md @@ -17,100 +17,4 @@ deleted. ## Required -- [Wire fuzz coverage](/quest/m4/wire-fuzz-coverage.md) - the cmsg walks in moq-sock and moq-uring have invariant fuzz targets, and the unsafe peer input reaches runs under Miri -- [VA-API renderer tests](/quest/m4/vaapi-render-tests.md) - the VA-API renderer, decode, and transcode tests run in `just rs gpu` on AMD and Intel and fail instead of skipping, and hosted CI reports them ignored -- [One Ruff pin and Swift formatting on aarch64-linux](/quest/m4/format-gate-followups.md) - only the dev shell pins Ruff, and aarch64-linux checks Swift formatting once nixpkgs builds `swiftc` there -- [P2P](/quest/m4/p2p/README.md) - application-selected peer sessions use shared priorities, routing, and same-epoch handover -- [Challenge proof for certificate credentials](/quest/m4/cert-challenge.md) - a relay can require a signed nonce, so a certificate credential replayed within its time window admits nothing -- [Benchmark sources](/quest/m4/bench-sources.md) - every measuring nightly benchmark feeds the regression table, and none is a smoke run -- [The fan-out benchmark's session scenario builds again](/quest/m4/bench-fanout-session.md) - `just bench-fanout` measures sessions, not only the model -- [A browser round-trips media through moq-webrtc](/quest/m4/whip-whep-browser.md) - Chromium and Firefox publish over WHIP and play over WHEP nightly -- [Shared corpora live in each crate's fixtures/](/quest/m4/corpus-fixtures.md) - moq-auth's corpus moves beside moq-net's -- [An MV-HEVC stream with access unit delimiters stays one frame per access unit](/quest/m4/h265-layered-aud.md) - x265's `--aud` layered output imports, or is refused by name -- [HLS and DASH browser playback](/quest/m4/hls-player-test.md) - hls.js and dash.js play, reload, switch, and survive reconfiguration nightly -- [Cache fair share](/quest/m4/cache-fairness.md) - one tenant cannot crowd another out of the relay's shared group cache -- [Peer grant bound](/quest/m4/peer-grant-bound.md) - a peer's AUTH_OK costs near-linear time in its bytes on every input shape, in Rust and in a browser -- [A regrant re-checks only the routes it can change](/quest/m4/regrant-route-recheck.md) - an `AUTH_OK` no longer costs routes times grant members on every lite announce stream -- [Upstream reports](/quest/m4/upstream-reports.md) - report the faad, retina, and mr-boxington bugs found before the cut -- [moq-net's library tests pass under cargo test](/quest/m4/net-test-subscriber.md) - two moq-net tests stop each installing a global tracing subscriber, so plain `cargo test -p moq-net --lib` passes -- [Perf](/quest/m4/perf/README.md) - eliminate measured hot-path costs across moq-uring, kio, and the moq-net model -- [kio channel contention](/quest/m4/kio-channel-contention/README.md) - workers spend less time blocked on kio channel-state mutexes, promoted out of Perf -- [Stream transports](/quest/m4/stream-transports/README.md) - qmux drives its own WebSocket and TCP sockets in one task, then serves them from the io_uring workers, promoted out of Perf -- [Transport x version benches](/quest/m4/bench-transport-sweep.md) - the session benches sweep transports as well as versions -- [Shared group serving and ingest](/quest/m4/shared-serve.md) - Rust's moq-lite and moq-transport sessions serve and ingest groups through one poll machine each, with only wire encoding per protocol -- [Shared group serving and ingest in JS](/quest/m4/shared-serve-js.md) - the same split in js/net, following the Rust seam -- [Paired bench BASE](/quest/m4/bench-base-paired.md) - `just bench ` uses the nightly's paired comparison and the old one is deleted -- [Route wakes](/quest/m4/route-wakes.md) - a route change wakes only the fronts it can move, so pool churn stops scaling with served paths -- [Audio outlives video](/quest/m4/audio-bufferbloat-av.md) - under bufferbloat audio stays within budget while video may skip, rendered frames stay in sync, and native audio rows are enforced -- [ViSQOL grading](/quest/m4/audio-visqol.md) - the nightly scores played audio against a reference clip and fails below measured floors -- [Browser publishing paths under test](/quest/m4/publish-firefox.md) - the media harness publishes from Firefox in Nightly and passes, covering the `