From 17d01ec469a186feef287327e2d4542f4840e130 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 9 Oct 2026 20:00:16 -0700 Subject: [PATCH 1/3] quest: plan check base, JS restart parity, and WebGPU on Safari Co-Authored-By: Claude Opus 5.5 --- quest/m0/README.md | 1 + quest/m0/check-base.md | 27 +++++++++++++++++++++++ quest/m1/README.md | 2 ++ quest/m1/js-restart-keeps-request.md | 25 ++++++++++++++++++++++ quest/m1/webgpu-safari.md | 32 ++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 quest/m0/check-base.md create mode 100644 quest/m1/js-restart-keeps-request.md create mode 100644 quest/m1/webgpu-safari.md diff --git a/quest/m0/README.md b/quest/m0/README.md index 6ce09ef4ea..09f37dba68 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -63,6 +63,7 @@ remain and no release waits on them. - [Draft-22 media on 0.17](/quest/m0/release-22/README.md) - a 0.17.x with the LOCATION_FILTER and FIRST_OBJECT fixes and moq-noq 1.3.4, before Seattle - [FFI publisher stall](/quest/m0/ffi-publisher-stall.md) - every Go, Python, and C++ publisher cell passes reliably with the serve budgets, and a cell fails when a connection idles out +- [Check base](/quest/m0/check-base.md) - `just check` diffs against the PR's base whatever the local branch tracks, so scoped checks stay scoped - [web-transport releases the qmux fixes](/quest/m0/qmux-credit-upstream.md) - waiting on moq-dev/web-transport#412 and #413 to merge and ship, which qmux credit bumps to - [qmux credit](/quest/m0/qmux-credit.md) - qmux returns connection credit for dropped and stopped streams and delivers its close frame, on both lines - [JS track takeover](/quest/m0/js-track-takeover.md) - JS `createTrack` answers a queued request and continues its sequences, as Rust does, so a re-announced `@moq/publish` catalog never restarts its groups diff --git a/quest/m0/check-base.md b/quest/m0/check-base.md new file mode 100644 index 0000000000..9c291c8c3c --- /dev/null +++ b/quest/m0/check-base.md @@ -0,0 +1,27 @@ +# [XS] just check diffs against the PR base + +## Goal + +`just check` and `just fix` diff against the branch's real base (the PR's +base, `origin/main` by default), whatever the local branch is called and +whatever it tracks, so a scoped check never turns into a workspace-wide run. + +## Plan + +Found in #5141 (2026-10-10): an agent iterating a PR on a local branch named +differently from the PR branch ran `just check`, which diffed against +`origin/quest/m1/held-group-wakes` and started a workspace-wide test on the +shared machine. `sh/changed.sh` takes `@{upstream}` as the base and only falls +back to `origin/main` when the upstream has the local branch's own name, so a +branch tracking any other branch (for example a PR head under another local +name) is diffed against that branch. + +Decided 2026-10-10, in m0 because every agent's check on this shared machine +pays for it: pick the base from what the branch merges into, not from what it +tracks. For example, prefer the open PR's base when `gh` finds one, then an +upstream named `main` or `release`, then `origin/main`. `GITHUB_BASE_REF` in CI +and an explicit `BASE` argument keep winning. Print the chosen base, as today. +If the change contradicts AGENTS.md's "set the upstream to the base branch", +fix that line in the same PR. + +Public API: none. Wire: none. diff --git a/quest/m1/README.md b/quest/m1/README.md index cd8e8a09d7..e977ed1bf4 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -198,3 +198,5 @@ ladders. - [Catalog colour](/quest/m1/color-catalog.md) - the catalog describes a rendition's colour and HDR properties, which the WebGPU HDR renderer reads - [WebGPU HDR](/quest/m1/webgpu-hdr.md) - HDR renditions play as HDR where the browser and display can show it, and tone-map to SDR elsewhere - [Request ID order](/quest/m1/request-id-order.md) - drafts 14 to 16 refuse a reused or lower Request ID in both languages +- [JS restart keeps the request](/quest/m1/js-restart-keeps-request.md) - a resolved `@moq/net` request survives a Restart, as in Rust +- [WebGPU on Safari](/quest/m1/webgpu-safari.md) - the WebGPU renderer is verified on Safari 26 for macOS and iOS diff --git a/quest/m1/js-restart-keeps-request.md b/quest/m1/js-restart-keeps-request.md new file mode 100644 index 0000000000..cad3d4af0b --- /dev/null +++ b/quest/m1/js-restart-keeps-request.md @@ -0,0 +1,25 @@ +# [S] A resolved JS request survives a Restart, as in Rust + +## Goal + +When a dynamic claim's epoch changes (a `Restart` downstream), an +already-resolved `@moq/net` request keeps its resolved broadcast, as Rust's +does, instead of ending as unroutable. Subscriptions on the old broadcast stay +until the application drops them, per the broadcast-epoch line; new requests +resolve under the new epoch. + +## Plan + +Found in #5141 (2026-10-10): on an epoch change JS ends a resolved request +handle (it reports unroutable), while Rust keeps the resolved broadcast. Open +track subscriptions survive in both. Decided 2026-10-10: align JS to Rust, +since the broadcast-epoch README keeps subscriptions on the old broadcast +until the application drops them. Rejected: ending resolved requests in both, +and documenting the difference. + +Find where `js/net/src/origin.ts` ends the resolved handle on a server reset +and keep it, without letting it serve anything new under the old epoch +(never-stitch still holds). Mirror Rust's test in `js/net/src/origin.test.ts`, +failing before the fix. + +Public API: behavior only. Wire: none. diff --git a/quest/m1/webgpu-safari.md b/quest/m1/webgpu-safari.md new file mode 100644 index 0000000000..5ebaf8df10 --- /dev/null +++ b/quest/m1/webgpu-safari.md @@ -0,0 +1,32 @@ +# [S] The WebGPU renderer is verified on Safari 26 + +## Goal + +`@moq/video`'s WebGPU path is verified on Safari 26, on macOS and iOS: H.264 +and biplanar frames import through `importExternalTexture`, orientation is +right, and a frame that fails to import is handled as decided below, with +evidence. + +## Plan + +Planned 2026-10-10 as a follow-up of #5138, which shipped the renderer +untested on Safari. Known Safari 26 issues with `importExternalTexture`: H.264 +frames, biplanar formats, and iOS orientation. + +- Run `` and the `` preview with `backend` set to + `auto` and `webgpu` on real Apple hardware or a hosted Safari session, over + H.264 and the other catalog codecs, in each orientation. +- #5138 decided an unimportable frame stays loud (it throws and that frame is + skipped). Revisit with what Safari actually does: keep it, or add a + `RendererError` value for it. +- Fix what breaks at its source. If the probe passes but frames fail, consider + extending the probe rather than a runtime fallback, which #5138 rejected. + +Needs a human-run or hosted Safari session; a background agent reports +instead of guessing. + +Public API: possibly a new `RendererError` value. Wire: none. + +## Related + +- [WebGPU HDR](/quest/m1/webgpu-hdr.md) - builds on the same renderer From 584b7693e56c80acecb3c01240c0630e3ec87fa0 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 9 Oct 2026 20:12:25 -0700 Subject: [PATCH 2/3] quest: gate Safari on the renderer, name the Rust test, bound the gh lookup Co-Authored-By: Claude Opus 5.5 --- quest/m0/check-base.md | 3 +++ quest/m1/js-restart-keeps-request.md | 5 +++-- quest/m1/webgpu-safari.md | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/quest/m0/check-base.md b/quest/m0/check-base.md index 9c291c8c3c..834f6a2d5b 100644 --- a/quest/m0/check-base.md +++ b/quest/m0/check-base.md @@ -21,6 +21,9 @@ pays for it: pick the base from what the branch merges into, not from what it tracks. For example, prefer the open PR's base when `gh` finds one, then an upstream named `main` or `release`, then `origin/main`. `GITHUB_BASE_REF` in CI and an explicit `BASE` argument keep winning. Print the chosen base, as today. +A stacked PR diffs against its base PR's branch. A missing, offline, or +unauthenticated `gh` falls through quickly and silently, so a local check +never hangs or fails on the lookup. If the change contradicts AGENTS.md's "set the upstream to the base branch", fix that line in the same PR. diff --git a/quest/m1/js-restart-keeps-request.md b/quest/m1/js-restart-keeps-request.md index cad3d4af0b..fefacbf7d6 100644 --- a/quest/m1/js-restart-keeps-request.md +++ b/quest/m1/js-restart-keeps-request.md @@ -19,7 +19,8 @@ and documenting the difference. Find where `js/net/src/origin.ts` ends the resolved handle on a server reset and keep it, without letting it serve anything new under the old epoch -(never-stitch still holds). Mirror Rust's test in `js/net/src/origin.test.ts`, -failing before the fix. +(never-stitch still holds). Mirror Rust's +`a_newer_epoch_leaves_the_broadcast_in_flight` (`rs/moq-net/src/model/origin.rs`) +in `js/net/src/origin.test.ts`, failing before the fix. Public API: behavior only. Wire: none. diff --git a/quest/m1/webgpu-safari.md b/quest/m1/webgpu-safari.md index 5ebaf8df10..a37c812c4c 100644 --- a/quest/m1/webgpu-safari.md +++ b/quest/m1/webgpu-safari.md @@ -9,7 +9,7 @@ evidence. ## Plan -Planned 2026-10-10 as a follow-up of #5138, which shipped the renderer +Planned 2026-10-10 as a follow-up of #5138, which ships the renderer untested on Safari. Known Safari 26 issues with `importExternalTexture`: H.264 frames, biplanar formats, and iOS orientation. @@ -27,6 +27,10 @@ instead of guessing. Public API: possibly a new `RendererError` value. Wire: none. +## Required + +- [WebGPU renderer](/quest/m1/webgpu-renderer.md) - the renderer and `@moq/video` package (#5138) this verifies + ## Related - [WebGPU HDR](/quest/m1/webgpu-hdr.md) - builds on the same renderer From d703f94485c7fba89fbd88ef2f2b5416e4223246 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 9 Oct 2026 20:23:53 -0700 Subject: [PATCH 3/3] quest: reproduce JS restart through Dynamic.update, after #5141 Co-Authored-By: Claude Opus 5.5 --- quest/m1/js-restart-keeps-request.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/quest/m1/js-restart-keeps-request.md b/quest/m1/js-restart-keeps-request.md index fefacbf7d6..2587b3a409 100644 --- a/quest/m1/js-restart-keeps-request.md +++ b/quest/m1/js-restart-keeps-request.md @@ -19,8 +19,14 @@ and documenting the difference. Find where `js/net/src/origin.ts` ends the resolved handle on a server reset and keep it, without letting it serve anything new under the old epoch -(never-stitch still holds). Mirror Rust's -`a_newer_epoch_leaves_the_broadcast_in_flight` (`rs/moq-net/src/model/origin.rs`) -in `js/net/src/origin.test.ts`, failing before the fix. +(never-stitch still holds). Reproduce with `Dynamic.update` changing the +epoch in place, the case #5141's `Dynamic::update` doc and `dynamic_epoch_*` +relay tests pin down; a second publish at the path is a different case that +both languages already cover (`a_newer_epoch_leaves_the_broadcast_in_flight`). +Add the test to `js/net/src/origin.test.ts`, failing before the fix. Public API: behavior only. Wire: none. + +## Required + +- [Dynamic epoch](/quest/m0/broadcast-epoch/dynamic-epoch.md) - #5141, which corrects the Rust `Dynamic::update` doc this quest aligns JS to