From 8ea2c241193d1d233327ef6b636e8cd3ce30d2a7 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sat, 7 Nov 2026 08:34:43 -0800 Subject: [PATCH 1/3] chore(quest): claim quest/m1/compose/layout.md Quest-Claim: 3570705f9a7b3a34 From 57109f99f18874e6a3af5faef4d8b069d7ffb23d Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sat, 7 Nov 2026 08:37:26 -0800 Subject: [PATCH 2/3] quest(m1/compose/layout): wait on a replan, since no viewer can fetch a source track Co-Authored-By: Claude Opus 5.5 --- quest/m1/compose/layout.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/quest/m1/compose/layout.md b/quest/m1/compose/layout.md index e427624..7ff7ce5 100644 --- a/quest/m1/compose/layout.md +++ b/quest/m1/compose/layout.md @@ -55,3 +55,20 @@ viewer can fetch; the rest reach viewers only in the program. Decided 2026-11-05 (maintainer, /quest-plan): the layout serializes the scene model with scene sources, published scenes, and audio scenes, not the canvases and mixes they replaced. + +## Waiting + +- Maintainer: replan this quest before it is built. Since 2026-11-04 no + source's track reaches viewers unless [Published independently](/quest/m2/publish-independently.md) + (m2) ticks it, and a source so published is left out of the program, so no + host can composite the frame this Goal promises, and the browser, server, and + controls quests that read the layout have no track to fetch. The epic + README asks for this replan when the epic starts. Options: (1) move this + epic to m2 with Published independently as this quest's first Required, + and replan the layout once it lands (recommended: nothing in m1 can read a + layout, and the reference picture decides what it carries); (2) replan now + to the reference picture the epic README suggests, the program with the + independently published sources layered over it, so the layout places only + those sources over the program; (3) build it as written, a full scene whose + tracks no viewer can fetch until m2. Done when this file's Goal, Plan, and + Required reflect the pick. From b4184149722beaf0dfabd088e8f28dad072f2ea0 Mon Sep 17 00:00:00 2001 From: Luke Curley Date: Sat, 7 Nov 2026 08:53:55 -0800 Subject: [PATCH 3/3] quest: move viewer-side composition to m2 behind publish-independently Co-Authored-By: Claude Opus 5.5 --- quest/m0/README.md | 4 ++-- quest/m1/README.md | 13 +++++++------ quest/m2/README.md | 5 +++++ quest/{m1 => m2}/compose/README.md | 14 ++++++++++---- quest/{m1 => m2}/compose/browser.md | 2 +- quest/{m1 => m2}/compose/controls.md | 2 +- quest/{m1 => m2}/compose/layout.md | 27 ++++++++++++--------------- quest/{m1 => m2}/compose/server.md | 2 +- quest/m2/publish-independently.md | 2 +- 9 files changed, 40 insertions(+), 31 deletions(-) rename quest/{m1 => m2}/compose/README.md (85%) rename quest/{m1 => m2}/compose/browser.md (94%) rename quest/{m1 => m2}/compose/controls.md (93%) rename quest/{m1 => m2}/compose/layout.md (74%) rename quest/{m1 => m2}/compose/server.md (93%) diff --git a/quest/m0/README.md b/quest/m0/README.md index 357a5c9..27055b3 100644 --- a/quest/m0/README.md +++ b/quest/m0/README.md @@ -60,7 +60,7 @@ cameras, packaging, signing) that one monorepo no longer pays off. - **Pin:** moq is a `moq` git submodule whose crates are path dependencies, as in moq.pro, so the studio compiles against one moq checkout. - **moq-scene** moved here with the app, its only consumer. The - [viewer-side composition](/quest/m1/compose/README.md) epic (now m1) moved whole: + [viewer-side composition](/quest/m2/compose/README.md) epic (now m2) moved whole: browser composition ships as a package from this repository layered on `@moq/watch`, and the server composite is a headless binary here rather than a moq-cli subcommand, so moq never depends on the studio. @@ -77,7 +77,7 @@ broadcast reaches viewers, not the fallback. Sources are not published to the relay by default (decided 2026-11-03 on [moq-dev/studio#21](https://github.com/moq-dev/studio/pull/21)), because each encoding costs an encoder session and consumer GPUs have few, so the -[viewer-side composition](/quest/m1/compose/README.md) epic moved to m1. +[viewer-side composition](/quest/m2/compose/README.md) epic moved to m1. Overlays and animation render into the program here, and travel to viewers in the layout track only once that epic lands. diff --git a/quest/m1/README.md b/quest/m1/README.md index 5b4fefc..9f216d2 100644 --- a/quest/m1/README.md +++ b/quest/m1/README.md @@ -2,11 +2,8 @@ ## Goal -The work held until m0 ships. A studio broadcast can be composed by its -viewers and by a server from the sources' own tracks and a layout track, -matching the program the studio composites, so a viewer can toggle and -prioritize elements. The studio gains features m0 left out: overlay assets -and restarts, and isolated guest recordings. +The work held until m0 ships. The studio gains features m0 left out: +overlay assets and restarts, and isolated guest recordings. ## Plan @@ -17,11 +14,15 @@ default (decided 2026-11-03 on encoding every source for viewers costs more encoder sessions than a consumer GPU has. Viewer-side composition waits until m0 ships. +Viewer-side composition moved to m2 on 2026-11-07 (maintainer, on +[moq-dev/studio#97](https://github.com/moq-dev/studio/pull/97)): no viewer +can fetch a source's track until a source is published independently, which +is m2. + Broadened 2026-11-04 (maintainer, /quest-plan): m1 also holds studio features planned as follow-ups of m0 work but not needed to ship it, rather than opening an m2 for them. ## Required -- [Viewer-side composition](/quest/m1/compose/README.md) - sources as their own tracks plus a layout track, composed by viewers and by a server - [Rune UI spike](/quest/m1/rune-spike.md) - the monitors prototyped on Rune, with a verdict on moving the UI off egui diff --git a/quest/m2/README.md b/quest/m2/README.md index 88c638b..069465b 100644 --- a/quest/m2/README.md +++ b/quest/m2/README.md @@ -11,7 +11,12 @@ Opened 2026-11-05 (maintainer, /quest-plan) for publishing a source independently, which no service uses yet. A quest moves up to m0 or m1 when a consumer appears. +Viewer-side composition moved here from m1 on 2026-11-07 (maintainer, on +[moq-dev/studio#97](https://github.com/moq-dev/studio/pull/97)): it composes +from sources published independently, so it follows that quest. + ## Required - [Published independently](/quest/m2/publish-independently.md) - a source opts out of the program and publishes its own track for services that place it themselves +- [Viewer-side composition](/quest/m2/compose/README.md) - independently published sources plus a layout track, composed by viewers and by a server - [Overlays drop their Blitz panic guard](/quest/m2/overlay-blitz-release.md) - the next Blitz release lets overlay checks parse without `catch_unwind` diff --git a/quest/m1/compose/README.md b/quest/m2/compose/README.md similarity index 85% rename from quest/m1/compose/README.md rename to quest/m2/compose/README.md index a687000..f36a81a 100644 --- a/quest/m1/compose/README.md +++ b/quest/m2/compose/README.md @@ -56,9 +56,15 @@ viewer composes from fetchable tracks matches the program today. When this epic starts, define the reference picture (such as the program with the independent sources layered over it) and replan those bullets. +Moved to m2 on 2026-11-07 (maintainer, on +[moq-dev/studio#97](https://github.com/moq-dev/studio/pull/97)): nothing in m1 +can fetch a source's track, so nothing can read a layout. The layout waits on +[Published independently](/quest/m2/publish-independently.md), and the +browser, server, and controls quests wait on it through the layout. + ## Required -- [Layout track](/quest/m1/compose/layout.md) - the live scene state as a hang JSON track on the media clock, specified in the hang draft -- [Browser composition](/quest/m1/compose/browser.md) - `@moq/watch` composes a broadcast with a layout track through moq-scene's browser build -- [Server composition](/quest/m1/compose/server.md) - a headless compositor renders the program from sources and layout, headless -- [Viewer controls](/quest/m1/compose/controls.md) - viewers toggle elements and the layout's priorities steer what they fetch +- [Layout track](/quest/m2/compose/layout.md) - the live scene state as a hang JSON track on the media clock, specified in the hang draft +- [Browser composition](/quest/m2/compose/browser.md) - `@moq/watch` composes a broadcast with a layout track through moq-scene's browser build +- [Server composition](/quest/m2/compose/server.md) - a headless compositor renders the program from sources and layout, headless +- [Viewer controls](/quest/m2/compose/controls.md) - viewers toggle elements and the layout's priorities steer what they fetch diff --git a/quest/m1/compose/browser.md b/quest/m2/compose/browser.md similarity index 94% rename from quest/m1/compose/browser.md rename to quest/m2/compose/browser.md index acedf6f..f14a32a 100644 --- a/quest/m1/compose/browser.md +++ b/quest/m2/compose/browser.md @@ -23,5 +23,5 @@ studio, compared within a stated tolerance. ## Required -- [Layout track](/quest/m1/compose/layout.md) - what the browser composes +- [Layout track](/quest/m2/compose/layout.md) - what the browser composes - [moq-video's browser backends are pinned](/quest/m0/pin-browser-video.md) - browser frames into wgpu diff --git a/quest/m1/compose/controls.md b/quest/m2/compose/controls.md similarity index 93% rename from quest/m1/compose/controls.md rename to quest/m2/compose/controls.md index 2a1c8a3..a4f664a 100644 --- a/quest/m1/compose/controls.md +++ b/quest/m2/compose/controls.md @@ -20,4 +20,4 @@ of them is on, at the highest priority among them. ## Required -- [Browser composition](/quest/m1/compose/browser.md) - the viewer that exposes the toggles +- [Browser composition](/quest/m2/compose/browser.md) - the viewer that exposes the toggles diff --git a/quest/m1/compose/layout.md b/quest/m2/compose/layout.md similarity index 74% rename from quest/m1/compose/layout.md rename to quest/m2/compose/layout.md index 7ff7ce5..269204c 100644 --- a/quest/m1/compose/layout.md +++ b/quest/m2/compose/layout.md @@ -56,19 +56,16 @@ Decided 2026-11-05 (maintainer, /quest-plan): the layout serializes the scene model with scene sources, published scenes, and audio scenes, not the canvases and mixes they replaced. -## Waiting +Decided 2026-11-07 (maintainer, on +[moq-dev/studio#97](https://github.com/moq-dev/studio/pull/97)): this quest +waits on [Published independently](/quest/m2/publish-independently.md), since +until then no viewer can fetch a track the layout names, and the epic moved to +m2 with it. Once that lands, replan this quest around the epic's reference +picture, which decides what the layout carries. Rejected: replanning now +around the program with the independently published sources layered over it, +and building the full-scene layout as written above while no viewer can use +it. -- Maintainer: replan this quest before it is built. Since 2026-11-04 no - source's track reaches viewers unless [Published independently](/quest/m2/publish-independently.md) - (m2) ticks it, and a source so published is left out of the program, so no - host can composite the frame this Goal promises, and the browser, server, and - controls quests that read the layout have no track to fetch. The epic - README asks for this replan when the epic starts. Options: (1) move this - epic to m2 with Published independently as this quest's first Required, - and replan the layout once it lands (recommended: nothing in m1 can read a - layout, and the reference picture decides what it carries); (2) replan now - to the reference picture the epic README suggests, the program with the - independently published sources layered over it, so the layout places only - those sources over the program; (3) build it as written, a full scene whose - tracks no viewer can fetch until m2. Done when this file's Goal, Plan, and - Required reflect the pick. +## Required + +- [Published independently](/quest/m2/publish-independently.md) - the source tracks a viewer can fetch, which the layout names diff --git a/quest/m1/compose/server.md b/quest/m2/compose/server.md similarity index 93% rename from quest/m1/compose/server.md rename to quest/m2/compose/server.md index 4283027..296ae95 100644 --- a/quest/m1/compose/server.md +++ b/quest/m2/compose/server.md @@ -22,4 +22,4 @@ and document it in `README.md`. ## Required -- [Layout track](/quest/m1/compose/layout.md) - what the server composes +- [Layout track](/quest/m2/compose/layout.md) - what the server composes diff --git a/quest/m2/publish-independently.md b/quest/m2/publish-independently.md index fe9ea20..b8c13e2 100644 --- a/quest/m2/publish-independently.md +++ b/quest/m2/publish-independently.md @@ -37,4 +37,4 @@ user does, so `README.md` documents them. ## Related -- [Viewer-side composition](/quest/m1/compose/README.md) - the m1 epic that composes from independently published sources +- [Viewer-side composition](/quest/m2/compose/README.md) - the epic that composes from independently published sources