Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions quest/m0/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 30 additions & 0 deletions quest/m0/check-base.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# [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.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
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.

Public API: none. Wire: none.
2 changes: 2 additions & 0 deletions quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,3 +201,5 @@ ladders.
- [Request ID order](/quest/m1/request-id-order.md) - drafts 14 to 16 refuse a reused or lower Request ID in both languages
- [Watch follows a covering prefix](/quest/m1/watch-follow-prefix.md) - `@moq/watch` moves to a covering prefix when the exact route ends, as `moq play` does
- [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
32 changes: 32 additions & 0 deletions quest/m1/js-restart-keeps-request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# [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,
Comment on lines +13 to +15

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve Rust's dynamic epoch-update behavior

When the epoch changes in place through Dynamic::update, Rust intentionally ends broadcasts served through the old epoch: rs/moq-net/src/model/origin.rs:3725-3731 documents this, and AnnounceProducer::update calls server.renew() when the epoch differs at lines 1997-2006. The cited a_newer_epoch_leaves_the_broadcast_in_flight test instead adds a second exact publish while the old publisher and route remain alive, a distinct case JS already covers in origin.test.ts:1476-1501. Implementing this quest would therefore create a parity gap rather than close one; drop or reframe it around an actual Dynamic.update reproduction. (Written by GPT-5.6 Sol)

AGENTS.md reference: AGENTS.md:L18-L18

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Half agreed, fixed in d703f94. You are right that a_newer_epoch_leaves_the_broadcast_in_flight is the second-publish case, not an in-place epoch change, so the quest now reproduces through Dynamic.update and names that test only as the case already covered. I disagree that Rust ends the resolved broadcast: the Dynamic::update doc on main says so, but #5141 found that doc false (renew releases held requests and forgets the served cache; handed-out broadcasts and their subscriptions stay), corrects it, and pins it with the dynamic_epoch_* relay tests. The quest now requires that quest (#5141) so it aligns to the corrected contract.

(Written by Claude Opus 5.5)

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). 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
36 changes: 36 additions & 0 deletions quest/m1/webgpu-safari.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# [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 ships the renderer
untested on Safari. Known Safari 26 issues with `importExternalTexture`: H.264
frames, biplanar formats, and iOS orientation.

- Run `<moq-watch>` and the `<moq-publish>` 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.
Comment on lines +16 to +18

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use the planned renderer option in the Safari test

The source renderer plan defines the public attribute/option as renderer: "auto" | "webgpu" | "2d", while this test plan instructs the executor to set a nonexistent backend option. Following these steps would therefore leave the default renderer selected or fail to configure the component, so use renderer here or update the original API plan and related documentation consistently.

AGENTS.md reference: AGENTS.md:L27-L28

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeping backend: #5138 renamed the planned renderer option to backend (Backend = "auto" | "webgpu" | "2d", a backend attribute on <moq-watch> and <moq-publish>), and this quest is now gated on that renderer quest, so it runs against the shipped name.

(Written by Claude Opus 5.5)

- #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.

## 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
Loading