From 01c6a4d8e10be813cd23a71214f8d291d0675845 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Wed, 30 Sep 2026 13:10:59 -0700 Subject: [PATCH 1/2] chore(quest): turn outside conditions into quests and bump quest kixelated/quest#28 rejects plain-text Required bullets: a blocked quest drops out of every ready listing, so its outside condition was forgotten. Each condition is now a small quest beside the one it blocks, which stays ready and resurfaces every /quest-spawn. Bumps the quest pin to 362489b and refreshes the skill stubs (quest-finish -> quest-complete, quest-convert -> quest-import, plus quest-export). Co-Authored-By: Claude Opus 5.5 --- .../{quest-finish => quest-complete}/SKILL.md | 4 +- .claude/skills/quest-convert/SKILL.md | 7 ---- .claude/skills/quest-export/SKILL.md | 7 ++++ .claude/skills/quest-import/SKILL.md | 7 ++++ AGENTS.md | 2 +- flake.lock | 8 ++-- flake.nix | 2 +- quest/README.md | 8 ++-- quest/m1/README.md | 4 ++ quest/m1/ci-runner-stalls.md | 2 +- quest/m1/dev-sync.md | 13 ++++++ quest/m1/gpu-ci.md | 2 +- quest/m1/gpu-runner.md | 18 ++++++++ quest/m1/interop-week.md | 16 ++++++++ quest/m1/obs-moq-video/README.md | 1 + quest/m1/obs-moq-video/decoded-surface.md | 14 +++++++ quest/m1/obs-moq-video/source.md | 2 +- quest/m1/quic/README.md | 4 +- quest/m1/redirect-resolve.md | 3 +- quest/m1/ts-stats-module.md | 2 +- quest/m1/web-transport-moq-release.md | 16 ++++++++ quest/m1/wt-close-upstream.md | 2 +- quest/m2/one-port/README.md | 2 +- quest/m2/one-port/srt-demux.md | 13 +++--- quest/m2/quic-deadline.md | 6 +-- ...use-sendmsg-zc-for-large-udp-gso-trains.md | 2 +- quest/m3/README.md | 15 ++++--- quest/m3/ada-gpu.md | 14 +++++++ quest/m3/c4m-claim-keys.md | 16 ++++++++ quest/m3/cat/README.md | 2 +- quest/m3/embedded-device.md | 13 ++++++ quest/m3/hidden-exemption.md | 2 +- quest/m3/lite07-mesh.md | 15 +++++++ quest/m3/livekit-shim.md | 40 ------------------ quest/m3/nvenc-av1.md | 2 +- quest/m3/quic-gcc.md | 36 ++++++++++++---- quest/m3/quic-receive-ts.md | 41 ------------------- quest/m3/video-embedded.md | 3 +- quest/m3/video-hardware-access.md | 18 ++++++++ quest/m3/video-hardware.md | 6 +-- quest/m3/whep-abr.md | 23 ----------- quest/m3/zero-copy-peer.md | 13 ++++++ quest/m4/README.md | 5 ++- quest/m4/safari-webtransport.md | 2 +- quest/m4/webkit-319818.md | 15 +++++++ 45 files changed, 276 insertions(+), 172 deletions(-) rename .claude/skills/{quest-finish => quest-complete}/SKILL.md (71%) delete mode 100644 .claude/skills/quest-convert/SKILL.md create mode 100644 .claude/skills/quest-export/SKILL.md create mode 100644 .claude/skills/quest-import/SKILL.md create mode 100644 quest/m1/dev-sync.md create mode 100644 quest/m1/gpu-runner.md create mode 100644 quest/m1/interop-week.md create mode 100644 quest/m1/obs-moq-video/decoded-surface.md create mode 100644 quest/m1/web-transport-moq-release.md create mode 100644 quest/m3/ada-gpu.md create mode 100644 quest/m3/c4m-claim-keys.md create mode 100644 quest/m3/embedded-device.md create mode 100644 quest/m3/lite07-mesh.md delete mode 100644 quest/m3/livekit-shim.md delete mode 100644 quest/m3/quic-receive-ts.md create mode 100644 quest/m3/video-hardware-access.md delete mode 100644 quest/m3/whep-abr.md create mode 100644 quest/m3/zero-copy-peer.md create mode 100644 quest/m4/webkit-319818.md diff --git a/.claude/skills/quest-finish/SKILL.md b/.claude/skills/quest-complete/SKILL.md similarity index 71% rename from .claude/skills/quest-finish/SKILL.md rename to .claude/skills/quest-complete/SKILL.md index 4583b29d66..6c6bd4e2dd 100644 --- a/.claude/skills/quest-finish/SKILL.md +++ b/.claude/skills/quest-complete/SKILL.md @@ -1,7 +1,7 @@ --- -name: quest-finish +name: quest-complete description: Decide which open PRs to merge, then merge them in parallel. --- -Run `quest skill finish` and follow its output. +Run `quest skill complete` and follow its output. If `quest` is not installed, follow https://github.com/kixelated/quest/blob/main/SETUP.md first. diff --git a/.claude/skills/quest-convert/SKILL.md b/.claude/skills/quest-convert/SKILL.md deleted file mode 100644 index bb2e8cbeab..0000000000 --- a/.claude/skills/quest-convert/SKILL.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: quest-convert -description: Convert Github issues to quests. ---- - -Run `quest skill convert` and follow its output. -If `quest` is not installed, follow https://github.com/kixelated/quest/blob/main/SETUP.md first. diff --git a/.claude/skills/quest-export/SKILL.md b/.claude/skills/quest-export/SKILL.md new file mode 100644 index 0000000000..7f52f470a6 --- /dev/null +++ b/.claude/skills/quest-export/SKILL.md @@ -0,0 +1,7 @@ +--- +name: quest-export +description: Turn active quests into GitHub issues before leaving Quest. Use when the user invokes /quest-export or asks to export quests before removing Quest. +--- + +Run `quest skill export` and follow its output. +If `quest` is not installed, follow https://github.com/kixelated/quest/blob/main/SETUP.md first. diff --git a/.claude/skills/quest-import/SKILL.md b/.claude/skills/quest-import/SKILL.md new file mode 100644 index 0000000000..fbd48cc9e9 --- /dev/null +++ b/.claude/skills/quest-import/SKILL.md @@ -0,0 +1,7 @@ +--- +name: quest-import +description: Import GitHub issues as quests. +--- + +Run `quest skill import` and follow its output. +If `quest` is not installed, follow https://github.com/kixelated/quest/blob/main/SETUP.md first. diff --git a/AGENTS.md b/AGENTS.md index 15b5547d3f..985b19dbcb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -92,7 +92,7 @@ just fix # Auto-fix lint/formatting, same scope These diff the branch against its base and only run the affected packages. -When work mentions a quest, run `quest guide` and follow it. +Quests: when work mentions a quest, run `quest guide` and follow it. The `quest` binary comes from the kixelated/quest flake input and serves the quest skills; change them upstream and bump the input. A quest deleted on `dev` is done, even while `main` still lists it. diff --git a/flake.lock b/flake.lock index 85980a8b8f..dcc6cd7be3 100644 --- a/flake.lock +++ b/flake.lock @@ -65,17 +65,17 @@ ] }, "locked": { - "lastModified": 1790635831, - "narHash": "sha256-K/X+stFBmlCylJ9wiMCXxKOckoHeSninMvBb0wZa1rM=", + "lastModified": 1790797838, + "narHash": "sha256-/WmkmY7+FJSNGXR6+1i0sV2xHLRnWUxAVC0xogJdqlo=", "owner": "kixelated", "repo": "quest", - "rev": "8590d2a1ddd91c2f499adf37b78aad0d673e3228", + "rev": "362489bcf02833d8674cff339463b086442cf92d", "type": "github" }, "original": { "owner": "kixelated", "repo": "quest", - "rev": "8590d2a1ddd91c2f499adf37b78aad0d673e3228", + "rev": "362489bcf02833d8674cff339463b086442cf92d", "type": "github" } }, diff --git a/flake.nix b/flake.nix index 419fce6133..1d10877644 100644 --- a/flake.nix +++ b/flake.nix @@ -27,7 +27,7 @@ # The quest CLI, which also serves the quest guide and skills the stubs in # .claude/skills call. Bump the rev to upgrade them. quest = { - url = "github:kixelated/quest/8590d2a1ddd91c2f499adf37b78aad0d673e3228"; + url = "github:kixelated/quest/362489bcf02833d8674cff339463b086442cf92d"; inputs.nixpkgs.follows = "nixpkgs"; inputs.flake-utils.follows = "flake-utils"; inputs.crane.follows = "crane"; diff --git a/quest/README.md b/quest/README.md index 38d4b4b9bc..51892ea630 100644 --- a/quest/README.md +++ b/quest/README.md @@ -16,10 +16,10 @@ offer. m4 waits on an upstream release. Priority is separate from branch targeting: published API and wire breaks still land on dev under the repository rules. -A quest waiting on the outside world, in any milestone, states that condition -as a plain-text `Required` bullet, so `quest ready` reports it blocked. -`/quest-audit` re-checks those gates; when one clears, remove the bullet and -move the quest to the milestone its priority belongs in. +A quest waiting on the outside world, in any milestone, requires a small quest +beside it that names the condition. That condition quest stays ready, so +every `/quest-spawn` resurfaces it; when the condition clears, delete it and +move the blocked quest to the milestone its priority belongs in. ## Required diff --git a/quest/m1/README.md b/quest/m1/README.md index c74d353d0b..6002e79ad4 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -34,6 +34,7 @@ QUIC studies there on that rule. - [Close waits for the tail](/quest/m1/close-tail.md) - on lite-07, `close()` returns `Ok` only after each subscriber FINs its Subscribe Stream, having read the track to its end - [Demo serve-hls renditions](/quest/m1/serve-hls-renditions.md) - `just pub serve-hls` serves 720p and 144p instead of two 256-wide copies - [moq play drain tail](/quest/m1/play-drain-tail.md) - retired renditions and finite tracks play their last 10 ms of audio +- [web-transport-moq 1.3.3 ships noq#24](/quest/m1/web-transport-moq-release.md) - the release that carries the close-capsule fix - [WebTransport close upstream](/quest/m1/wt-close-upstream.md) - web-transport-moq delivers the close capsule itself, and moq-tokio's `CLOSE_LINGER` is deleted - [Browser close code](/quest/m1/browser-close-code.md) - a playwright case proves the page reads a relay's close code and reason, on every web-transport backend - [Resumed groups](/quest/m1/resume-latest.md) - a half-delivered group ends once the new copy is past it, so a group-only reader never parks after a mid-group failover @@ -45,6 +46,7 @@ QUIC studies there on that rule. - [Session death parity](/quest/m1/session-death.md) - a local close ends tracks cleanly in both languages, and JS group readers see the session's error on session death - [Watch and publish under CSP](/quest/m1/csp-assets.md) - blob workers stay the default; strict-CSP apps host the files and set a base URL - [More tests under load](/quest/m1/test-flakes-2/README.md) - the second round of load-only failures, one quest per flake, fixed at the cause +- [A week of nightly interop after #4529](/quest/m1/interop-week.md) - the nightly traces the stall diagnosis reads - [CI runner stalls](/quest/m1/ci-runner-stalls.md) - the 0.4 to 0.8 s freezes of both interop tracks on CI are attributed from a week of nightlies and fixed or told apart from playback bugs - [Catalog estimate rate](/quest/m1/catalog-estimate-rate.md) - a rising `jitter`/`delay` estimate republishes the catalog at most once a second, in js/publish and moq-mux - [Legacy end overshoot](/quest/m1/legacy-end-overshoot.md) - browser playback survives a group that starts inside the previous group's estimated end @@ -52,6 +54,7 @@ QUIC studies there on that rule. - [TS PSI reassembly](/quest/m1/ts-psi-reassembly.md) - `import ts` reads a PAT or PMT that spans packets or follows a nonzero pointer_field instead of aborting, and one corrupted section costs a repetition and a counted `CRC_error`, not the import - [TS damaged units](/quest/m1/ts-damaged-units.md) - one malformed PES or access unit is dropped, counted as `damaged`, and resynced at the next keyframe instead of ending the import - [RTMP interleaving](/quest/m1/rtmp-interleaving.md) - isolate partial messages before optimizing assembly copies +- [Merge main into dev](/quest/m1/dev-sync.md) - dev picks up `ts::stats` from main - [TS stats module](/quest/m1/ts-stats-module.md) - on dev, the TS stats types move under `ts::stats` as `Snapshot` and `Stream`, with an owned `track` - [Same-hop importers](/quest/m1/hop-aligned-import.md) - importers fed one stream publish identical groups and timestamps, so failover between a redundant pair survives - [Audio capture without ALSA link](/quest/m1/capture-alsa-link.md) - moq-audio capture and playback build on Linux without linking libasound @@ -86,6 +89,7 @@ QUIC studies there on that rule. - [Opus mapping family](/quest/m1/opus-mapping-family.md) - on dev, the Opus head config keeps its mapping family only in `mapping` - [mp4-atom dOps mapping](/quest/m1/mp4-atom-dops-mapping.md) - a released mp4-atom reads and writes any `dOps` channel mapping family and table - [CMAF surround Opus](/quest/m1/cmaf-opus-surround.md) - fMP4 import and export carry an Opus channel mapping table +- [A self-hosted NVIDIA runner is registered](/quest/m1/gpu-runner.md) - the maintainer registers the host that runs the NVIDIA tests - [GPU CI](/quest/m1/gpu-ci.md) - NVIDIA tests run nightly on a self-hosted GPU runner, and `just rs nvidia` runs them locally instead of skipping - [JS rendition ranking](/quest/m1/js-ranked.md) - `@moq/hang` ranks video renditions like Rust, and `@moq/watch`'s fallback uses it - [Audio rendition pick](/quest/m1/audio-ranked.md) - single-track FLV/RTMP and WHEP serve the best audio rendition, not the first by name diff --git a/quest/m1/ci-runner-stalls.md b/quest/m1/ci-runner-stalls.md index ae944c35bf..722c4a8570 100644 --- a/quest/m1/ci-runner-stalls.md +++ b/quest/m1/ci-runner-stalls.md @@ -25,4 +25,4 @@ Public API: none. Wire: none. ## Required -- A week of nightly interop runs on `main` after #4529, which adds the `delay` column these traces need +- [A week of nightly interop after #4529](/quest/m1/interop-week.md) - the traces carry the `delay` column diff --git a/quest/m1/dev-sync.md b/quest/m1/dev-sync.md new file mode 100644 index 0000000000..2ac1e74a2d --- /dev/null +++ b/quest/m1/dev-sync.md @@ -0,0 +1,13 @@ +# [S] Merge main into dev + +## Goal + +`dev` contains `main` at or after +[#4506](https://github.com/moq-dev/moq/pull/4506) (`c2e7b5815`), so dev has +the `ts::stats` module the TS stats rename works on. + +## Plan + +Unlike the other outside conditions, this is work: a PR merging `main` into +`dev` and resolving its conflicts. As of 2026-09-30 `main` is 130 commits +ahead of `dev` and `dev` is 119 ahead of `main`. diff --git a/quest/m1/gpu-ci.md b/quest/m1/gpu-ci.md index b3b0d6175d..dd9d225e3e 100644 --- a/quest/m1/gpu-ci.md +++ b/quest/m1/gpu-ci.md @@ -51,7 +51,7 @@ Public API: none. Wire: none. ## Required -- A self-hosted runner is registered for moq-dev/moq on the maintainer's host, with the NVIDIA driver +- [A self-hosted NVIDIA runner is registered](/quest/m1/gpu-runner.md) - the host the nightly job runs on ## Related diff --git a/quest/m1/gpu-runner.md b/quest/m1/gpu-runner.md new file mode 100644 index 0000000000..591b3b7bb8 --- /dev/null +++ b/quest/m1/gpu-runner.md @@ -0,0 +1,18 @@ +# [XS] A self-hosted NVIDIA runner is registered + +## Goal + +A self-hosted GitHub Actions runner is registered for moq-dev/moq on the +maintainer's Linux host (RTX 3070 Ti), with the NVIDIA driver installed. This +is a maintainer action: only someone with admin access to the repository and +the host can do it. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +As of 2026-09-30 `gh api repos/moq-dev/moq/actions/runners` lists none. +Register it with the dedicated label and hardening that +[GPU CI](/quest/m1/gpu-ci.md) describes, and share the registration with the +io_uring runner the drain line plans. diff --git a/quest/m1/interop-week.md b/quest/m1/interop-week.md new file mode 100644 index 0000000000..73dba3ddbe --- /dev/null +++ b/quest/m1/interop-week.md @@ -0,0 +1,16 @@ +# [XS] A week of nightly interop after #4529 + +## Goal + +Seven nightly interop runs on `main` have completed since +[#4529](https://github.com/moq-dev/moq/pull/4529) added the player's `delay` +column to the interop trace. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +#4529 merged on 2026-09-29 (`8b6abc0a1`). As of 2026-09-30 one scheduled +`interop.yml` run on `main` includes it, so the seventh lands around +2026-10-06. Check with `gh run list --workflow interop.yml --branch main`. diff --git a/quest/m1/obs-moq-video/README.md b/quest/m1/obs-moq-video/README.md index f44a258241..8b2c19a765 100644 --- a/quest/m1/obs-moq-video/README.md +++ b/quest/m1/obs-moq-video/README.md @@ -20,6 +20,7 @@ Decided in the 2026-09-30 audit: the Windows and Linux GPU decode paths and the ## Required +- [dev's decoded-frame surface reaches main](/quest/m1/obs-moq-video/decoded-surface.md) - the surface the source decodes into is on main - [Video source replacement](/quest/m1/obs-moq-video/source.md) - remove the FFmpeg video decode and attempt macOS GPU delivery immediately, with a working CPU fallback on other platforms - [Audio playback](/quest/m1/obs-moq-video/audio-playback.md) - replace the FFmpeg audio decode with moq-audio - [Linux bundle](/quest/m1/obs-moq-video/linux-bundle.md) - attach a portable Linux x86_64 tarball to every obs-moq release once FFmpeg is gone diff --git a/quest/m1/obs-moq-video/decoded-surface.md b/quest/m1/obs-moq-video/decoded-surface.md new file mode 100644 index 0000000000..0585da10b1 --- /dev/null +++ b/quest/m1/obs-moq-video/decoded-surface.md @@ -0,0 +1,14 @@ +# [XS] dev's decoded-frame surface reaches main + +## Goal + +`main` contains the moq-ffi decoded-frame surface from `dev` +([#4094](https://github.com/moq-dev/moq/pull/4094), renamed in `97575f002`). + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +As of 2026-09-30 both are on `dev` only. Check with +`git merge-base --is-ancestor 97575f002 origin/main`. diff --git a/quest/m1/obs-moq-video/source.md b/quest/m1/obs-moq-video/source.md index e7bf0fd977..1e6d4be0f8 100644 --- a/quest/m1/obs-moq-video/source.md +++ b/quest/m1/obs-moq-video/source.md @@ -17,7 +17,7 @@ The MoQ source loads and plays supported video without FFmpeg's video libraries ## Required - [OBS migration](/quest/m1/cpp/obs.md) - the plugin is on the generated C++ before decode changes -- dev's decoded-frame surface (#4094, 97575f002) reaches main +- [dev's decoded-frame surface reaches main](/quest/m1/obs-moq-video/decoded-surface.md) - the surface this decodes into ## Related diff --git a/quest/m1/quic/README.md b/quest/m1/quic/README.md index 856696ec7b..d0e6c4ee20 100644 --- a/quest/m1/quic/README.md +++ b/quest/m1/quic/README.md @@ -78,7 +78,5 @@ consumes them. - [L4S on the backbone](/quest/m2/quic-ecn.md) - an ECT(1) option in the fork, an `ecn` config knob, and a dualpi2 measurement - [Careful resume on reconnect](/quest/m2/quic-careful-resume.md) - a redial starts at the previous connection's rate - [Keep-alive by deadline](/quest/m2/quic-keep-alive.md) - a PING only when the idle deadline nears, no fixed timer -- [Receive timestamps](/quest/m3/quic-receive-ts.md) - per-packet arrival - times for GCC and deadlines -- [GCC egress experiment](/quest/m3/quic-gcc.md) - a measured verdict on +- [GCC egress experiment](/quest/m3/quic-gcc.md) - receive timestamps and a measured verdict on WebRTC-style delay control diff --git a/quest/m1/redirect-resolve.md b/quest/m1/redirect-resolve.md index 7ee9ef7014..924ae4e493 100644 --- a/quest/m1/redirect-resolve.md +++ b/quest/m1/redirect-resolve.md @@ -24,7 +24,8 @@ needs them. If a consumer turns up, the alternative is returning the same current addresses"), so empty and refused stay distinct. Removing or changing a published method is a break, so this targets `dev`; update `doc/lib/rs` if it mentions the method. +Start by merging `main` into `dev` if `dev` does not have the drain line yet. + ## Required - [Graceful relay drains](/quest/m1/drain/README.md) - the stricter `Connection` lands with the line -- `dev` has merged `main` after the drain line lands diff --git a/quest/m1/ts-stats-module.md b/quest/m1/ts-stats-module.md index a68a4203fb..cb9b5013e4 100644 --- a/quest/m1/ts-stats-module.md +++ b/quest/m1/ts-stats-module.md @@ -42,4 +42,4 @@ Public API: breaking renames in moq-mux. Wire: none. ## Required -- `main` merged into `dev`, carrying #4506's `ts::stats` module (dev has none yet) +- [Merge main into dev](/quest/m1/dev-sync.md) - carries #4506's `ts::stats` module diff --git a/quest/m1/web-transport-moq-release.md b/quest/m1/web-transport-moq-release.md new file mode 100644 index 0000000000..57bdab5807 --- /dev/null +++ b/quest/m1/web-transport-moq-release.md @@ -0,0 +1,16 @@ +# [XS] web-transport-moq 1.3.3 ships noq#24 + +## Goal + +A `web-transport-moq` 1.3.x release on crates.io carries +[moq-dev/noq#24](https://github.com/moq-dev/noq/pull/24), the close-capsule +fix. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +noq#24 merged into `release/1.3` on 2026-09-29. As of 2026-09-30 crates.io +still has 1.3.2; the release PR is +[moq-dev/noq#21](https://github.com/moq-dev/noq/pull/21). diff --git a/quest/m1/wt-close-upstream.md b/quest/m1/wt-close-upstream.md index ac4b763988..a87504abc5 100644 --- a/quest/m1/wt-close-upstream.md +++ b/quest/m1/wt-close-upstream.md @@ -49,7 +49,7 @@ a moq.pro relay that the flood stops. ## Required -- A `web-transport-moq` 1.3.x release that carries moq-dev/noq#24 +- [web-transport-moq 1.3.3 ships noq#24](/quest/m1/web-transport-moq-release.md) - the release to pin ## Related diff --git a/quest/m2/one-port/README.md b/quest/m2/one-port/README.md index d7c055b883..bbef222df9 100644 --- a/quest/m2/one-port/README.md +++ b/quest/m2/one-port/README.md @@ -78,7 +78,7 @@ pre-accepted streams can stand behind. - [UDP demux](/quest/m2/one-port/udp-demux.md) - one socket carries QUIC and STUN answers, with greasing off and a WebRTC hook for embedders - [TCP acceptor](/quest/m2/one-port/tcp-demux.md) - one listener carries TLS-terminated HTTP, RTMP, and RTMPS -- [SRT on the shared socket](/quest/m2/one-port/srt-demux.md) - srt-tokio accepts a virtual socket and the flow table pins its 4-tuples +- [SRT on the shared socket](/quest/m2/one-port/srt-demux.md) - moq-srt drives `srt-protocol` on demuxed packets and the flow table pins its 4-tuples ## Related diff --git a/quest/m2/one-port/srt-demux.md b/quest/m2/one-port/srt-demux.md index d12a492083..f540d2b511 100644 --- a/quest/m2/one-port/srt-demux.md +++ b/quest/m2/one-port/srt-demux.md @@ -9,12 +9,12 @@ induction handshake. ## Plan `srt-tokio` 0.4 takes a `tokio::net::UdpSocket` in `bind_with_socket` and -nothing more abstract. Preferred: an upstream PR giving `SrtListener` a -socket trait (`poll_recv_from` and `poll_send_to`) that a real socket and our -virtual socket both implement, then `moq_srt::Server` takes the virtual -socket. Fallback if refused: `srt-protocol` is sans-io, so `moq-srt` drives -its `Listen` and `Connection` state machines directly on fed packets, which -is more code but removes the dependency on `srt-tokio`'s socket handling. +nothing more abstract. Decided 2026-09-30: `srt-protocol` is sans-io, so +`moq-srt` drives its `Listen` and `Connection` state machines directly on the +demuxed packets. That is more code, but it removes the dependency on +`srt-tokio`'s socket handling. An upstream socket trait was rejected: +upstream (now rosalyntg/srt-rs) has not been pushed since 2024-05, and its +maintainer said they do not actively support it. The demux side is the flow table from [UDP demux](/quest/m2/one-port/udp-demux.md): a 4-tuple already pinned to WebRTC (ICE succeeded) is never tested for SRT. @@ -36,4 +36,3 @@ with a QUIC client active on the same port; a QUIC short header from a new ## Required - [UDP demux](/quest/m2/one-port/udp-demux.md) -- srt-tokio accepts a caller-supplied socket abstraction upstream, or the sans-io fallback is chosen diff --git a/quest/m2/quic-deadline.md b/quest/m2/quic-deadline.md index a644a87043..cdfcd5b1b8 100644 --- a/quest/m2/quic-deadline.md +++ b/quest/m2/quic-deadline.md @@ -21,7 +21,7 @@ Implement in the fork. - On loss detection, before queueing a retransmission for a stream with a deadline, estimate the arrival instant as now plus the forward one-way delay. Start with `min_rtt / 2`, corrected by the peer's reported ACK delay; - the [receive-timestamps spike](/quest/m3/quic-receive-ts.md) replaces that + the [GCC experiment](/quest/m3/quic-gcc.md)'s receive timestamps replace that guess with a measured forward delay. If the estimate is past the deadline, reset the stream with a dedicated error code and drop its retransmit ranges, including bytes already lost, so flow control is returned in one step. @@ -52,8 +52,8 @@ Decided in the 2026-09-30 audit: moved to m2. No m1 quest consumes it. ## Related -- [Receive timestamps](/quest/m3/quic-receive-ts.md) - a measured forward - delay replaces the half-RTT estimate +- [QUIC GCC](/quest/m3/quic-gcc.md) - its receive timestamps give a measured + forward delay that replaces the half-RTT estimate - [Discover media headroom](/quest/m2/quic-probe.md) - can reuse retransmission machinery if redundant capacity probes prove worthwhile - [noq#813](https://github.com/n0-computer/noq/issues/813) - the per-stream deadline proposal to n0 diff --git a/quest/m3/3201-moq-uring-use-sendmsg-zc-for-large-udp-gso-trains.md b/quest/m3/3201-moq-uring-use-sendmsg-zc-for-large-udp-gso-trains.md index 9930a37408..260460eddf 100644 --- a/quest/m3/3201-moq-uring-use-sendmsg-zc-for-large-udp-gso-trains.md +++ b/quest/m3/3201-moq-uring-use-sendmsg-zc-for-large-udp-gso-trains.md @@ -41,7 +41,7 @@ ships in no package. ## Required -- A physical-NIC remote peer to measure zero-copy sends against +- [A physical-NIC peer for the zero-copy sweep](/quest/m3/zero-copy-peer.md) - loopback only measures the forced copy ## Closes diff --git a/quest/m3/README.md b/quest/m3/README.md index 57d3362074..ba3e2a8dc6 100644 --- a/quest/m3/README.md +++ b/quest/m3/README.md @@ -9,31 +9,34 @@ Nothing here should start by opening an editor. ## Plan A quest lands here when its gate is the outside world, not its priority. Its gate -is a plain-text `Required` bullet, re-checked as the root -[questline](/quest/README.md) describes. A +is a condition quest beside it, as the root [questline](/quest/README.md) +describes. A speculative feature with no consumer parks here rather than in m2, and is deleted when it goes stale; git history keeps it. ## Required +- [Video validation hardware is on hand](/quest/m3/video-hardware-access.md) - the machines the validation runs on - [Video hardware validation](/quest/m3/video-hardware.md) - run the encode, capture, and zero-copy paths that were never run on real machines, including PipeWire on KDE, the camera portal, and a Pi +- [An Ada NVIDIA GPU is available](/quest/m3/ada-gpu.md) - the hardware AV1 NVENC is verified on - [NVENC AV1](/quest/m3/nvenc-av1.md) - AV1 encode through NVENC, once an Ada-generation GPU is available +- [An embedded video device is on hand](/quest/m3/embedded-device.md) - the device EGL import is validated on - [Embedded video](/quest/m3/video-embedded.md) - EGL import in the renderer, so moq-video presents on a Pi +- [A physical-NIC peer for the zero-copy sweep](/quest/m3/zero-copy-peer.md) - the rig the zero-copy sweep runs on - [#3201: moq-uring: use SENDMSG_ZC for large UDP GSO trains](/quest/m3/3201-moq-uring-use-sendmsg-zc-for-large-udp-gso-trains.md) - complete the prerequisite issue first - [#3204](/quest/m3/3204-moq-uring-register-tx-pool-buffers-for-zero-copy-sends.md) - moq-uring: register TX-pool buffers for zero-copy sends -- [Receive timestamps](/quest/m3/quic-receive-ts.md) - per-packet arrival times in ACKs, the feedback GCC and deadlines need -- [QUIC GCC](/quest/m3/quic-gcc.md) - a measured verdict on delay-based congestion control for media egress, shipping as `RealTime` +- [QUIC GCC](/quest/m3/quic-gcc.md) - receive timestamps in ACKs and a measured verdict on delay-based congestion control for media egress, shipping as `RealTime` - [AF_XDP UDP path](/quest/m3/af-xdp.md) - the kernel-bypass verdict on today's virtio hosts that gates DPDK - [C# through moq-ffi](/quest/m3/cs/README.md) - generated C# over moq-ffi as a NuGet package with native runtimes - [Unity prototype](/quest/m3/unity.md) - the C# package under IL2CPP, playing subscribed audio - [Unreal prototype](/quest/m3/unreal.md) - a UE5 module on the C++ package with exceptions disabled, rendering a subscribed broadcast to a texture -- [LiveKit client shim](/quest/m3/livekit-shim.md) - a media compatibility facade over the room SDK - [Conan remote](/quest/m3/cpp-conan.md) - a remote we own serves the same tarball to `conan install` -- [WHEP ABR](/quest/m3/whep-abr.md) - a WHEP viewer switches renditions from its own congestion feedback - [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 - [Linux OBS GPU input](/quest/m3/obs-linux-gpu.md) - publish OBS compositor frames without CPU readback on a validated Linux graphics/encoder combination - [Routing cost domains](/quest/m3/routing-cost-domains.md) - design operator boundaries and policy without adding incomparable costs +- [draft-ietf-moq-c4m registers the moqt claim keys](/quest/m3/c4m-claim-keys.md) - the claim keys a CAT carries - [Common Access Tokens](/quest/m3/cat/README.md) - a moq-transport client presents a CAT in SETUP and `moq auth serve` admits it with the scope its `moqt` claim names +- [The moq.pro mesh runs lite-07](/quest/m3/lite07-mesh.md) - the deployment that makes the exemption dead code - [Drop the hidden cluster exemption](/quest/m3/hidden-exemption.md) - relays stop forcing hidden broadcasts on cluster peers once every peer opts in on the wire - [MAVLink bridge](/quest/m3/teleop-mavlink.md) - a `moq-mavlink` gateway replacing the VPN plus two unmanaged UDP flows, with QGroundControl and diff --git a/quest/m3/ada-gpu.md b/quest/m3/ada-gpu.md new file mode 100644 index 0000000000..ba14ea6991 --- /dev/null +++ b/quest/m3/ada-gpu.md @@ -0,0 +1,14 @@ +# [XS] An Ada NVIDIA GPU is available + +## Goal + +An Ada-generation or newer NVIDIA GPU is available to verify AV1 NVENC +encoding, on a CI host or a maintainer's machine. The current GPU host is an +RTX 3070 Ti, which has no AV1 NVENC. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +A consumer asking for AV1 encode is also a reason to get one. diff --git a/quest/m3/c4m-claim-keys.md b/quest/m3/c4m-claim-keys.md new file mode 100644 index 0000000000..4a4987a39e --- /dev/null +++ b/quest/m3/c4m-claim-keys.md @@ -0,0 +1,16 @@ +# [XS] draft-ietf-moq-c4m registers the moqt claim keys + +## Goal + +draft-ietf-moq-c4m assigns the `moqt` claim keys in the IANA CWT Claims +registry, so a CAT can carry them without `TBD` placeholders. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +As of 2026-09-30 the latest revision is -01 (2026-06-18), still using +`TBD_MOQT` and `TBD_MOQT_REVAL`, and the registry has no moqt entry. Check the +[datatracker](https://datatracker.ietf.org/doc/draft-ietf-moq-c4m/) and the +[registry](https://www.iana.org/assignments/cwt/cwt.xhtml). diff --git a/quest/m3/cat/README.md b/quest/m3/cat/README.md index 4087147953..5e6d787a22 100644 --- a/quest/m3/cat/README.md +++ b/quest/m3/cat/README.md @@ -53,7 +53,7 @@ one. Everything rides `moq_auth::Request` and ## Required -- draft-ietf-moq-c4m registers the moqt claim keys +- [draft-ietf-moq-c4m registers the moqt claim keys](/quest/m3/c4m-claim-keys.md) - the claim keys a CAT carries - [Verify](/quest/m3/cat/verify.md) - `moq_auth::cat` turns a CAT into a grant and `moq auth serve` admits one; `moq auth sign|verify` mint and check the format diff --git a/quest/m3/embedded-device.md b/quest/m3/embedded-device.md new file mode 100644 index 0000000000..8e30e30999 --- /dev/null +++ b/quest/m3/embedded-device.md @@ -0,0 +1,13 @@ +# [XS] An embedded video device is on hand + +## Goal + +Someone has a Raspberry Pi or similar V4L2 M2M device without a usable +Vulkan driver, and can validate the renderer's EGL import on it. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +Record the device, OS image, and driver when it exists. diff --git a/quest/m3/hidden-exemption.md b/quest/m3/hidden-exemption.md index 97dc8acac6..762a9de603 100644 --- a/quest/m3/hidden-exemption.md +++ b/quest/m3/hidden-exemption.md @@ -20,4 +20,4 @@ the mesh runs lite-07. ## Required -- The moq.pro mesh deploys lite-07 +- [The moq.pro mesh runs lite-07](/quest/m3/lite07-mesh.md) - every peer opts in on the wire diff --git a/quest/m3/lite07-mesh.md b/quest/m3/lite07-mesh.md new file mode 100644 index 0000000000..8fb2d43a83 --- /dev/null +++ b/quest/m3/lite07-mesh.md @@ -0,0 +1,15 @@ +# [XS] The moq.pro mesh runs lite-07 + +## Goal + +Every relay in the moq.pro mesh dials its cluster peers with moq-lite-07, so +each one opts in to hidden broadcasts on the wire. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +As of 2026-09-30 lite-07 ships only as the off-by-default `moq-lite-07-wip` +ALPN, and moq.pro still has its lite-07 rollout quest open +(`quest/m1/lite07.md` in moq-dev/moq.pro). diff --git a/quest/m3/livekit-shim.md b/quest/m3/livekit-shim.md deleted file mode 100644 index 74e35d14d4..0000000000 --- a/quest/m3/livekit-shim.md +++ /dev/null @@ -1,40 +0,0 @@ -# [L] LiveKit client shim - -## Goal - -A drop-in `livekit-client`-compatible JS package (e.g. `@moq/livekit`) that -runs a multi-participant room entirely over MoQ. The v1 surface is media plus -core events: Room connect/disconnect, local and remote participants, -camera/mic/screenshare publish, auto-subscribe, and the TrackSubscribed event -family; data surfaces (publishData, streams, RPC) are stubbed. The token slot -takes an ordinary moq-auth token, no LiveKit JWT parsing. Done when an -off-the-shelf LiveKit JS sample runs against a MoQ relay with only the import -and the connect URL/token changed. - -## Plan - -In m3 until a LiveKit user asks to migrate; `@moq/room` already serves -new rooms directly. - -- The shim is a LiveKit-API facade over `@moq/room`, which carries hang.live's convention: the room is a path prefix in the connection URL and token root, - participants are discovered from the bare announce stream, identity is the - path before the broadcast name, and each participant publishes - `/camera.hang` (camera + mic, hd/sd renditions) and - `/screen.hang` (screenshare, - whose announce/unannounce is the screenshare lifecycle). The shim groups - the two paths per identity into one RemoteParticipant and maps catalog - entries to TrackPublications. -- Build on `@moq/publish` and `@moq/watch`. LiveKit quality hints - (setVideoQuality, adaptive settings) map to the receiver-driven pixel - target, or no-op gracefully. -- v1 is identity-only: `participant.identity` comes from the path and muted - state derives from catalog track presence. Names and coarse state are a - follow-up wired to the room SDK's `hang/*.json` metadata, not a rival - scheme. -- Mint tokens with `@moq/room`'s `claims(room, identity)`, which scopes the - `publish` claim to the identity's subtree so participants cannot publish at - each other's paths. - -## Required - -- A LiveKit user asks for a drop-in client diff --git a/quest/m3/nvenc-av1.md b/quest/m3/nvenc-av1.md index 1715d6ed32..7af1ec9ac7 100644 --- a/quest/m3/nvenc-av1.md +++ b/quest/m3/nvenc-av1.md @@ -23,7 +23,7 @@ Public API: additive. Wire: existing AV1 codec signaling. ## Required -- Ada or newer NVIDIA GPU available for verification +- [An Ada NVIDIA GPU is available](/quest/m3/ada-gpu.md) - the hardware to verify on ## Related diff --git a/quest/m3/quic-gcc.md b/quest/m3/quic-gcc.md index ff482bdd4d..a1dfea3718 100644 --- a/quest/m3/quic-gcc.md +++ b/quest/m3/quic-gcc.md @@ -1,18 +1,38 @@ -# [L] QUIC GCC egress experiment +# [XL] QUIC GCC egress experiment ## Goal Record a measured verdict on WebRTC-style delay-based congestion control for subscriber-facing media egress against noq's production -controller. Ship it only if it reduces queueing delay and rate variation +controller, driven by the QUIC receive-timestamps extension +(draft-smith-quic-receive-ts): the peer reports when each acknowledged packet +arrived, so the sender sees per-packet one-way delay variation the way +WebRTC's transport-wide congestion control feedback does. Ship it only if it reduces queueing delay and rate variation without collapsing throughput. A written abandonment is a successful outcome. ## Plan +### Receive timestamps + +- Implement the extension in the fork: the transport parameter, the ACK + frame variant with timestamp ranges, and an `on_ack` extension on + `Controller` that hands each acknowledged packet its receive instant. Both + ends are ours; browsers never see it. +- Compare the forward delay it measures against the half-RTT estimate the + [deadline quest](/quest/m2/quic-deadline.md) starts with, on the impaired + path profile with asymmetric delay. Report how often the half-RTT estimate + would have kept a hopeless retransmission or reset a deliverable one. +- Measure the ACK overhead the timestamps add on a fanout-shaped relay egress, + with and without the ACK-frequency extension reducing ACK rate. + +A delay-based controller without per-packet arrival times is a different, +weaker experiment. + +### GCC + Implement the candidate in the fork as a `congestion::Controller`, driven by -the per-packet receive timestamps the receive-timestamps spike delivers; the -sender-side inter-arrival filter is what makes it GCC rather than another -RTT-based controller. If it ships, it joins MoQ's backend-neutral congestion +those per-packet receive timestamps; the sender-side inter-arrival filter is +what makes it GCC rather than another RTT-based controller. If it ships, it joins MoQ's backend-neutral congestion family as `CongestionControl::RealTime`, beside `Loss` (Cubic) and `Delay` (BBR3); MoQ owns which algorithm each name means, and the config never exposes algorithm names. Egress only: relay ingest keeps BBR3. @@ -28,14 +48,12 @@ behavior against production cross traffic or real wifi and cellular loss. Receive timestamps are native-only: browsers never negotiate the extension, so GCC can only target native peers or relay-to-relay sessions, not browser -egress. Decided in the 2026-09-30 audit: parked in m3 until such a consumer -exists. +egress. Decided 2026-09-30: the receive-timestamps spike folds in here, and +neither waits on a native consumer. ## Required - [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq-quic`, not the frozen fork -- [Receive timestamps](/quest/m3/quic-receive-ts.md) - the per-packet - arrival times the delay filter runs on ## Related diff --git a/quest/m3/quic-receive-ts.md b/quest/m3/quic-receive-ts.md deleted file mode 100644 index 7cf17d9bd8..0000000000 --- a/quest/m3/quic-receive-ts.md +++ /dev/null @@ -1,41 +0,0 @@ -# [M] Receive timestamps - -## Goal - -A measured verdict on the QUIC receive-timestamps extension -(draft-smith-quic-receive-ts): the peer reports when each acknowledged packet -arrived, so the sender sees per-packet one-way delay variation the way -WebRTC's transport-wide congestion control feedback does, instead of inferring -it from ACK arrival on the return path. The result is either a released fork -feature with the `Controller` trait carrying per-packet receive instants, or a -written reason it does not pay. - -## Plan - -- Implement the extension in the fork: the transport parameter, the ACK - frame variant with timestamp ranges, and an `on_ack` extension on - `Controller` that hands each acknowledged packet its receive instant. Both - ends are ours; browsers never see it. -- Compare the forward delay it measures against the half-RTT estimate the - [deadline quest](/quest/m2/quic-deadline.md) starts with, on the impaired - path profile with asymmetric delay. Report how often the half-RTT estimate - would have kept a hopeless retransmission or reset a deliverable one. -- Measure the ACK overhead the timestamps add on a fanout-shaped relay egress, - with and without the ACK-frequency extension reducing ACK rate. - -The GCC experiment requires this; a delay-based controller without per-packet -arrival times is a different, weaker experiment. - -Both ends must be ours, so this is native-only and serves native peers or -relay-to-relay sessions. Decided in the 2026-09-30 audit: parked in m3 with -GCC until such a consumer exists. - -## Required - -- [Hard fork](/quest/m1/quic/fork/README.md) - the change lands in `moq-quic`, not the frozen fork -- A native-to-native consumer of receive timestamps (browsers never see them) - -## Related - -- [QUIC GCC](/quest/m3/quic-gcc.md) - the controller that consumes it -- [Per-stream deadlines](/quest/m2/quic-deadline.md) - the other consumer diff --git a/quest/m3/video-embedded.md b/quest/m3/video-embedded.md index a844e2f7df..c362078006 100644 --- a/quest/m3/video-embedded.md +++ b/quest/m3/video-embedded.md @@ -27,5 +27,4 @@ libcamera source composes with what already exists, because ## Required -- Someone with a Raspberry Pi or similar V4L2 M2M device without a usable - Vulkan driver validates the EGL import on it +- [An embedded video device is on hand](/quest/m3/embedded-device.md) - the device to validate on diff --git a/quest/m3/video-hardware-access.md b/quest/m3/video-hardware-access.md new file mode 100644 index 0000000000..e3d1b9d059 --- /dev/null +++ b/quest/m3/video-hardware-access.md @@ -0,0 +1,18 @@ +# [XS] Video validation hardware is on hand + +## Goal + +Someone with the hardware can run the video validation: an Intel GPU +exposing the VAAPI low-power entrypoint, a second render node, a Windows +machine with MJPEG and YUY2 cameras, a live camera per platform, a KDE/Wayland +desktop with an Intel or AMD GPU, a sandbox that can show the camera portal +dialog, and a Raspberry Pi whose CSI camera appears as a PipeWire node. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +The validation can start with whatever subset is available; split the rest +out of [Video hardware validation](/quest/m3/video-hardware.md) when that +happens. diff --git a/quest/m3/video-hardware.md b/quest/m3/video-hardware.md index d2f420a456..960318bcae 100644 --- a/quest/m3/video-hardware.md +++ b/quest/m3/video-hardware.md @@ -66,11 +66,7 @@ is not a bug any amount of review finds. ## Required -- Someone with the hardware runs it: an Intel GPU exposing the VAAPI low-power - entrypoint, a second render node, a Windows machine with MJPEG and YUY2 - cameras, a live camera per platform, a KDE/Wayland desktop with an Intel or - AMD GPU, a sandbox that can show the camera portal dialog, and a Raspberry - Pi whose CSI camera appears as a PipeWire node +- [Video validation hardware is on hand](/quest/m3/video-hardware-access.md) - the machines to run it on ## Closes diff --git a/quest/m3/whep-abr.md b/quest/m3/whep-abr.md deleted file mode 100644 index b91c396e61..0000000000 --- a/quest/m3/whep-abr.md +++ /dev/null @@ -1,23 +0,0 @@ -# [L] WHEP adaptive rendition switching - -## Goal - -A WHEP viewer of a multi-rendition broadcast is switched between video -renditions from its own congestion feedback, the way `@moq/watch` switches -over MoQ, so a weak link gets SD instead of stalling on HD. - -## Plan - -In m3 until a WHEP viewer needs adaptive quality; MoQ viewers already switch -renditions, and a WHEP viewer gets the best rendition today. - -Open questions: whether to drive switching from str0m's bandwidth estimate -(TWCC) or from loss and REMB, how to switch without a keyframe gap (subscribe -the new rendition and splice at its next group, as the JS decoder does), and -whether offering the renditions as WebRTC simulcast layers (RIDs) buys -anything for a receive-only browser. Keep the best rendition -(`hang::catalog::Video::ranked`) as the starting rendition. - -## Required - -- A WHEP viewer that needs rendition switching diff --git a/quest/m3/zero-copy-peer.md b/quest/m3/zero-copy-peer.md new file mode 100644 index 0000000000..97422ae5e8 --- /dev/null +++ b/quest/m3/zero-copy-peer.md @@ -0,0 +1,13 @@ +# [XS] A physical-NIC peer for the zero-copy sweep + +## Goal + +A remote peer reachable through a physical NIC is available to sweep +`SENDMSG_ZC` against. Loopback only measures the kernel's forced copy. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +Record the host and link when it exists, so the sweep is reproducible. diff --git a/quest/m4/README.md b/quest/m4/README.md index 5ef8cbfb66..96567c2f3b 100644 --- a/quest/m4/README.md +++ b/quest/m4/README.md @@ -7,9 +7,10 @@ so it is not forgotten. ## Plan -Each quest states its gate as a plain-text `Required` bullet, re-checked as the -root [questline](/quest/README.md) describes. +Each quest's gate is a condition quest beside it, as the root +[questline](/quest/README.md) describes. ## Required +- [Safari ships the WebKit 319818 fix](/quest/m4/webkit-319818.md) - the Safari release the gate admits - [Safari WebTransport](/quest/m4/safari-webtransport.md) - WebKit browsers return to WebTransport once WebKit 319818 ships fixed diff --git a/quest/m4/safari-webtransport.md b/quest/m4/safari-webtransport.md index 85b3a454a0..4d0cc76fb9 100644 --- a/quest/m4/safari-webtransport.md +++ b/quest/m4/safari-webtransport.md @@ -23,7 +23,7 @@ this. ## Required -- WebKit bug 319818 (https://bugs.webkit.org/show_bug.cgi?id=319818) is fixed and shipping in a Safari release +- [Safari ships the WebKit 319818 fix](/quest/m4/webkit-319818.md) - the release to gate on ## Closes diff --git a/quest/m4/webkit-319818.md b/quest/m4/webkit-319818.md new file mode 100644 index 0000000000..de6fc2f323 --- /dev/null +++ b/quest/m4/webkit-319818.md @@ -0,0 +1,15 @@ +# [XS] Safari ships the WebKit 319818 fix + +## Goal + +A shipping Safari release carries the fix for +[WebKit bug 319818](https://bugs.webkit.org/show_bug.cgi?id=319818), so it +refills MAX_DATA and MAX_STREAMS credit. + +This quest tracks a condition outside the repository. When it holds, delete +this quest and every `Required` entry that links it. + +## Plan + +As of 2026-09-30 the bug is NEW with no fix. Check the bug and the Safari +release notes. From 2838fa11e295426aa94351e2e9b8d265b69be72c Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Wed, 30 Sep 2026 21:28:13 -0700 Subject: [PATCH 2/2] quest: keep the OBS surface condition visible under the questline overlay Move decoded-surface to m1 so the obs-moq-video branch overlay cannot hide it, date the video hardware condition, and place GCC in m3 in the QUIC README. Co-Authored-By: Claude Opus 5.5 --- quest/m1/README.md | 1 + .../decoded-surface.md => obs-decoded-surface.md} | 0 quest/m1/obs-moq-video/README.md | 1 - quest/m1/obs-moq-video/source.md | 2 +- quest/m1/quic/README.md | 7 ++++--- quest/m3/video-hardware-access.md | 3 +++ 6 files changed, 9 insertions(+), 5 deletions(-) rename quest/m1/{obs-moq-video/decoded-surface.md => obs-decoded-surface.md} (100%) diff --git a/quest/m1/README.md b/quest/m1/README.md index 5be7993c8d..fe19c7d5ea 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -89,6 +89,7 @@ QUIC studies there on that rule. - [Dropped sources](/quest/m1/dropped-sources.md) - track consumers see the producer's real error on every end path, never `Dropped` - [C++ through moq-ffi](/quest/m1/cpp/README.md) - generated C++ over moq-ffi with futures and expected-style errors, shipped as a tarball, vcpkg, and Conan, and adopted by the OBS plugin - [Generated C bindings](/quest/m1/c/README.md) - C generated from moq-ffi ships as `moq-c` 0.8.0 and replaces the hand-written libmoq +- [dev's decoded-frame surface reaches main](/quest/m1/obs-decoded-surface.md) - the surface the OBS source decodes into is on main - [OBS native codecs](/quest/m1/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 - [AudioToolbox decode](/quest/m1/audio-decode-audiotoolbox.md) - macOS and iOS decode HE-AAC, multichannel AAC, and what else the framework offers - [HE-AAC catalog output](/quest/m1/he-aac-catalog-output.md) - HE-AAC catalog entries name the output rate and layout, not the LC core diff --git a/quest/m1/obs-moq-video/decoded-surface.md b/quest/m1/obs-decoded-surface.md similarity index 100% rename from quest/m1/obs-moq-video/decoded-surface.md rename to quest/m1/obs-decoded-surface.md diff --git a/quest/m1/obs-moq-video/README.md b/quest/m1/obs-moq-video/README.md index 8b2c19a765..f44a258241 100644 --- a/quest/m1/obs-moq-video/README.md +++ b/quest/m1/obs-moq-video/README.md @@ -20,7 +20,6 @@ Decided in the 2026-09-30 audit: the Windows and Linux GPU decode paths and the ## Required -- [dev's decoded-frame surface reaches main](/quest/m1/obs-moq-video/decoded-surface.md) - the surface the source decodes into is on main - [Video source replacement](/quest/m1/obs-moq-video/source.md) - remove the FFmpeg video decode and attempt macOS GPU delivery immediately, with a working CPU fallback on other platforms - [Audio playback](/quest/m1/obs-moq-video/audio-playback.md) - replace the FFmpeg audio decode with moq-audio - [Linux bundle](/quest/m1/obs-moq-video/linux-bundle.md) - attach a portable Linux x86_64 tarball to every obs-moq release once FFmpeg is gone diff --git a/quest/m1/obs-moq-video/source.md b/quest/m1/obs-moq-video/source.md index 1e6d4be0f8..36161bb16d 100644 --- a/quest/m1/obs-moq-video/source.md +++ b/quest/m1/obs-moq-video/source.md @@ -17,7 +17,7 @@ The MoQ source loads and plays supported video without FFmpeg's video libraries ## Required - [OBS migration](/quest/m1/cpp/obs.md) - the plugin is on the generated C++ before decode changes -- [dev's decoded-frame surface reaches main](/quest/m1/obs-moq-video/decoded-surface.md) - the surface this decodes into +- [dev's decoded-frame surface reaches main](/quest/m1/obs-decoded-surface.md) - the surface this decodes into ## Related diff --git a/quest/m1/quic/README.md b/quest/m1/quic/README.md index d0e6c4ee20..2cab9c3e8c 100644 --- a/quest/m1/quic/README.md +++ b/quest/m1/quic/README.md @@ -9,9 +9,10 @@ quinn and not noq). One core serves the tokio backend, the thread-per-core BBR correctness, reliable stream resets, hierarchical stream scheduling with per-broadcast fairness, wider limits for relay peers, and endpoint sharding. Per-stream acknowledgment progress, per-stream deadlines, qmux on the shared -stream state machine, and the experiments (GCC, receive timestamps, the egress -profile, media probing, L4S, careful resume, deadline keep-alive) live in -[m2](/quest/m2/README.md) and do not gate this line. +stream state machine, and the experiments (the egress profile, media probing, +L4S, careful resume, deadline keep-alive) live in [m2](/quest/m2/README.md); +GCC with receive timestamps lives in [m3](/quest/m3/README.md). None of them +gate this line. ## Plan diff --git a/quest/m3/video-hardware-access.md b/quest/m3/video-hardware-access.md index e3d1b9d059..ee99144ac5 100644 --- a/quest/m3/video-hardware-access.md +++ b/quest/m3/video-hardware-access.md @@ -13,6 +13,9 @@ this quest and every `Required` entry that links it. ## Plan +As of 2026-09-30 none of it is on hand. Check by asking the maintainer which +machines are available. + The validation can start with whatever subset is available; split the rest out of [Video hardware validation](/quest/m3/video-hardware.md) when that happens.