From e663629460fff3bd7bb8fa3d0446afc18657ad5e Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Fri, 9 Oct 2026 22:16:05 -0700 Subject: [PATCH 1/3] quest: plan the paused spinner, A/V sync across a break, and visible back-merge conflicts Co-Authored-By: Claude Opus 5.5 --- quest/m0/README.md | 1 + quest/m0/watch-paused-spinner.md | 22 ++++++++++++++++++++++ quest/m1/README.md | 2 ++ quest/m1/back-merge-conflict-visible.md | 24 ++++++++++++++++++++++++ quest/m1/watch-break-av-sync.md | 23 +++++++++++++++++++++++ 5 files changed, 72 insertions(+) create mode 100644 quest/m0/watch-paused-spinner.md create mode 100644 quest/m1/back-merge-conflict-visible.md create mode 100644 quest/m1/watch-break-av-sync.md diff --git a/quest/m0/README.md b/quest/m0/README.md index 09f37dba68..6f6a753b38 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 +- [Paused spinner](/quest/m0/watch-paused-spinner.md) - the watch buffering spinner never covers the paused play button, so Interop's resume step can click it - [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 diff --git a/quest/m0/watch-paused-spinner.md b/quest/m0/watch-paused-spinner.md new file mode 100644 index 0000000000..bd40394490 --- /dev/null +++ b/quest/m0/watch-paused-spinner.md @@ -0,0 +1,22 @@ +# [XS] The watch buffering spinner never covers the paused play button + +## Goal + +While `` is paused, its buffering indicator stays hidden, so the +centre play button is always clickable, and Interop's resume step never times +out on it. + +## Plan + +Found in #5174 (2026-10-10): in Interop run 38013145379 the `cpp -> js` cell +failed because, after pause, audio stalling raised the buffering spinner +(`js/watch/src/ui/components/buffering-indicator.ts`) over the play button, +and the harness's resume click timed out. Planned in m0, decided 2026-10-10, +because it reddens Interop on unrelated PRs. + +Buffering is not a meaningful state while paused: hide the indicator whenever +playback is paused, and show it again only once playback resumes and still +stalls. Add a browser test that pauses during an audio stall and clicks +resume. No harness workaround such as clicking elsewhere or waiting longer. + +Public API: none. Wire: none. diff --git a/quest/m1/README.md b/quest/m1/README.md index cbda5941f3..e7406a73de 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -201,3 +201,5 @@ ladders. - [Import catalog drop](/quest/m1/import-catalog-drop.md) - moq-cli import never drops a catalog producer without finishing it - [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 +- [A/V sync across a break](/quest/m1/watch-break-av-sync.md) - `@moq/watch` never plays pre-break audio out of sync with pre-break video +- [Visible back-merge conflict](/quest/m1/back-merge-conflict-visible.md) - a back-merge that cannot take a release comments on its open PR diff --git a/quest/m1/back-merge-conflict-visible.md b/quest/m1/back-merge-conflict-visible.md new file mode 100644 index 0000000000..fdcdb437db --- /dev/null +++ b/quest/m1/back-merge-conflict-visible.md @@ -0,0 +1,24 @@ +# [XS] A back-merge that can't take a release says so on its PR + +## Goal + +When the Back-merge workflow can't merge a new `release` head into the open +back-merge branch because of a conflict, the open back-merge PR gets a comment +naming the release commit it couldn't take, so a human resolves it instead of +the failure sitting unread in an Actions run. + +## Plan + +Found in #5170 (2026-10-10): two Back-merge runs (for #5130 and #5135) failed +with `gh: Merge conflict (HTTP 409)` while #5150's branch was open, so those +backports reached `main` only through the next back-merge, #5176. +`sh/gh/back-merge.sh` merges the new release into the existing branch on +purpose, to keep any hand-resolved conflict, and fails loudly on a conflict. + +Decided 2026-10-10: keep that design and keep failing, but make the failure +visible. On the 409, comment on the open back-merge PR with the release commit +and the instruction to merge `main` into the branch and resolve it, then exit +nonzero as today. Rejected: recreating the branch from `release`, which drops +hand-resolved work. + +Public API: none. Wire: none. diff --git a/quest/m1/watch-break-av-sync.md b/quest/m1/watch-break-av-sync.md new file mode 100644 index 0000000000..6b8a34934c --- /dev/null +++ b/quest/m1/watch-break-av-sync.md @@ -0,0 +1,23 @@ +# [S] A player stays in sync across a demand break + +## Goal + +After a demand break (the viewer leaves and returns, or the publisher pauses), +`@moq/watch` never plays pre-break audio out of sync with pre-break video: it +either plays them together or jumps straight to live. + +## Plan + +Found in #5173 (2026-10-10): in one reattach sample of `just test media`, +after the break the player played the old pre-break audio about 1.6 s apart +from the old video before jumping to live. Decided 2026-10-10: plan it as a +player bug. + +Reproduce in the media fixture's reattach case, measuring the audio-video +offset of the first frames presented after the break. Find whether audio and +video take different groups from the relay after the break (the relay hands +the reachable pre-gap GOP by design, per #4914 and #5158) or the player's +sync re-anchors one track and not the other. Fix it at that cause, and assert +the offset in the media check. + +Public API: none expected. Wire: none. From a63123fbf2185f701271bef00e67d39e150ef2a2 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sat, 10 Oct 2026 05:20:49 -0700 Subject: [PATCH 2/3] quest: drop the back-merge conflict quest; the workflow is being removed Co-Authored-By: Claude Opus 5.5 --- quest/m1/README.md | 1 - quest/m1/back-merge-conflict-visible.md | 24 ------------------------ 2 files changed, 25 deletions(-) delete mode 100644 quest/m1/back-merge-conflict-visible.md diff --git a/quest/m1/README.md b/quest/m1/README.md index e7406a73de..e5175e690a 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -202,4 +202,3 @@ ladders. - [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 - [A/V sync across a break](/quest/m1/watch-break-av-sync.md) - `@moq/watch` never plays pre-break audio out of sync with pre-break video -- [Visible back-merge conflict](/quest/m1/back-merge-conflict-visible.md) - a back-merge that cannot take a release comments on its open PR diff --git a/quest/m1/back-merge-conflict-visible.md b/quest/m1/back-merge-conflict-visible.md deleted file mode 100644 index fdcdb437db..0000000000 --- a/quest/m1/back-merge-conflict-visible.md +++ /dev/null @@ -1,24 +0,0 @@ -# [XS] A back-merge that can't take a release says so on its PR - -## Goal - -When the Back-merge workflow can't merge a new `release` head into the open -back-merge branch because of a conflict, the open back-merge PR gets a comment -naming the release commit it couldn't take, so a human resolves it instead of -the failure sitting unread in an Actions run. - -## Plan - -Found in #5170 (2026-10-10): two Back-merge runs (for #5130 and #5135) failed -with `gh: Merge conflict (HTTP 409)` while #5150's branch was open, so those -backports reached `main` only through the next back-merge, #5176. -`sh/gh/back-merge.sh` merges the new release into the existing branch on -purpose, to keep any hand-resolved conflict, and fails loudly on a conflict. - -Decided 2026-10-10: keep that design and keep failing, but make the failure -visible. On the 409, comment on the open back-merge PR with the release commit -and the instruction to merge `main` into the branch and resolve it, then exit -nonzero as today. Rejected: recreating the branch from `release`, which drops -hand-resolved work. - -Public API: none. Wire: none. From a786e429dc617b3250c9002b86520e17bad0b446 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sat, 10 Oct 2026 05:27:29 -0700 Subject: [PATCH 3/3] quest: a demand break is the viewer leaving, not a publisher pause Co-Authored-By: Claude Opus 5.5 --- quest/m1/watch-break-av-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quest/m1/watch-break-av-sync.md b/quest/m1/watch-break-av-sync.md index 6b8a34934c..7983500cdc 100644 --- a/quest/m1/watch-break-av-sync.md +++ b/quest/m1/watch-break-av-sync.md @@ -2,7 +2,7 @@ ## Goal -After a demand break (the viewer leaves and returns, or the publisher pauses), +After a demand break (the viewer leaves and returns), `@moq/watch` never plays pre-break audio out of sync with pre-break video: it either plays them together or jumps straight to live.