Skip to content

quest: program first; viewer-side composition moves to m1 - #30

Merged
kixelated merged 5 commits into
mainfrom
plan/program-first
Nov 4, 2026
Merged

kixelated merged 5 commits into
mainfrom
plan/program-first

Conversation

@kixelated

@kixelated kixelated commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Summary

The program becomes the default way a studio broadcast reaches viewers, and viewer-side composition moves to a new m1 milestone.

Decisions

  • ✅ Program first, defer the composition epic (maintainer, 2026-11-04). On feat(studio)!: a two-size program that follows the bandwidth grant, and local source tracks #21 the maintainer decided that sources are not published to the relay by default, since every encoding costs an encoder session and consumer GPUs have few. That reverses the epic's 2026-10-26 premise that viewers compose from per-source tracks and the program is the fallback. Rejected: keeping the epic in m0 at low priority, and dropping viewer composition.
  • ✅ A source on program is armed for replay (maintainer, 2026-11-04): every source visible in the program scene encodes its own local track while shown, so a replay finds its past. Rejected: a per-source arm checkbox, and program-only replay.

Changes

  • Move quest/m0/compose/ (layout, browser, server, controls) to quest/m1/compose/ under a new quest/m1/README.md, and index m1 in quest/README.md.
  • Keep audio source tracks in m0 as quest/m0/audio-source-tracks.md, since isolated recording and replay of audio sources need them. Rewrite its encode rule for feat(studio)!: a two-size program that follows the bandwidth grant, and local source tracks #21's decision: a source's track encodes only while something in the studio uses it, replacing the 2026-11-01 always-on decision.
  • Add quest/m0/publish-independently.md [S], low priority: a per-source option, off by default, that publishes the source's track and leaves it out of the program.
  • Layout (m1) records two decided follow-ups: the browser-source "viewers load this page" option from feat(scene): browser sources through a CEF helper process #8, and replay sources saying when they are hidden or ended from feat(studio): instant replay and clips from the tracks' held groups #20.
  • Overlays and animation render into the program in m0, and travel in the layout track only in m1.
  • Fix links into the moved files (effects.md, the m0 README).

Review

  • Reviewer: Codex, gpt-6.1-sol, medium effort (quest review).
  • Round 1 on 2d450b2: no findings.
  • pullfrog: two findings (the epic's Required entry still stated the always-on rule; a missing paragraph break), fixed in 7d1f7c1.
  • Round 2 on 7d1f7c1: no findings.
  • OpenAI review of 2d450b2: two P2s (m1 parity under independent publishing; source replay history under encode-on-use). Fixed in f2ad6fe: parity is deferred with the epic, and a source on program counts as used (maintainer decision below).
  • Round 3 on f2ad6fe: no findings.
  • OpenAI P2 (audio sources have no picture to be visible) and pullfrog (an independent source was not counted as used) on f2ad6fe: fixed in 6b9c94e.
  • Round 4 on 6b9c94e: no findings. This is the fourth-round design checkpoint; the plan holds.
  • quest check passes (46 documents).

🤖 Generated with Claude Code

The program is how a studio broadcast reaches viewers. Sources are not
published to the relay by default (decided on #21), so the composition
epic moves to a new m1 milestone. Audio source tracks stay in m0 for
isolated recording and replay, overlays and animation render into the
program, and a low-priority Published independently quest covers
sources a service places itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated
kixelated marked this pull request as ready for review November 4, 2026 06:14
@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 16 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 1432c2c9-f638-4edf-bdb3-8261fa335454
Commits

Reviewing files that changed from the base of the PR and between 2702c7c and 6b9c94e.

Files selected for processing: 14
  • quest/README.md
  • quest/m0/README.md
  • quest/m0/animation.md
  • quest/m0/audio-source-tracks.md
  • quest/m0/compose/sources.md
  • quest/m0/effects.md
  • quest/m0/overlays.md
  • quest/m0/publish-independently.md
  • quest/m1/README.md
  • quest/m1/compose/README.md
  • quest/m1/compose/browser.md
  • quest/m1/compose/controls.md
  • quest/m1/compose/layout.md
  • quest/m1/compose/server.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Important

The milestone move and the new encode rule are sound, but several current-tense summaries in the moved tree still state the rule this PR reverses. A reader of the m1 epic would implement the old default.

Reviewed changes

  • Milestone move — quest/m0/compose/ moves to quest/m1/compose/ under a new quest/m1/README.md, indexed from quest/README.md.
  • Audio source tracks stay in m0 — compose/sources.md becomes quest/m0/audio-source-tracks.md, with the encode rule rewritten to encode only while used and reach the relay only when independently published.
  • New publish-independently quest — a per-source opt-out of the program that publishes its own track, off by default and low priority.
  • m1 layout follow-ups — records the browser-source "viewers load this page" option and replay hidden/ended signalling.
  • Overlays and animation render into the program in m0 — layout-track travel deferred to m1.

⚠️ The moved epic still states the reversed default in its Goal and Delivery bullet

quest/m1/compose/README.md still opens by saying a broadcast "carries each source as its own track", and its Delivery bullet still says "The program is the fallback, not the default". Both are the premise this PR reverses, and the new note then says the Delivery bullet "stands", which cannot be true for that claim.

Technical details
# Reversed default left in the m1 epic

## Affected sites
- quest/m1/compose/README.md:5-9 — Goal says every source is carried as its own track.
- quest/m1/compose/README.md:19-20 — Delivery bullet says the program is the fallback, not the default.
- quest/m1/compose/README.md:45-54 — the 2026-11-04 note says the program is the default, then says the Delivery and Cost bullets "stand".

## Required outcome
- The Goal and Delivery bullet describe the new default, or are explicitly marked superseded.
- The note does not say a reversed bullet still stands.

## Suggested approach
- Rewrite the Goal to "sources the creator publishes independently", mirroring the rewritten Goals in `audio-source-tracks.md` and `overlays.md`.
- Either rewrite the Delivery bullet or replace "stand only for sources published that way" with a statement that both bullets are superseded.

⚠️ Index summaries still advertise deferred or reversed behavior

The scope changes are not reflected in the summaries that point at the moved quests. quest/m0/README.md:98 still promises "the DOM in the browser", but overlays.md now defers browser DOM rendering to m1, and quest/m1/README.md:20 still describes sources as their own tracks without the independently-published condition.

Technical details
# Stale index summaries

## Affected sites
- quest/m0/README.md:98 — "through Blitz natively and the DOM in the browser"; quest/m0/overlays.md:39-43 defers DOM rendering to m1.
- quest/m1/README.md:20 — "sources as their own tracks plus a layout track"; sources publish tracks only when independently published.

## Required outcome
- Each index line matches the scope of the quest it links to.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using big-pickle (free) | 𝕏

Comment thread quest/m1/compose/README.md Resolved
Comment thread quest/m0/audio-source-tracks.md Resolved

@kixelated kixelated left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Automated review by review (OpenAI)

Reviewed head 2d450b2.

  • [P2] Reconcile composition parity with the new source policy (quest/m1/compose/layout.md:48-50, quest/m0/publish-independently.md:5-9). Only independently published sources are fetchable, and those are excluded from the studio program. For a normal display plus an independent webcam, a source-only viewer can fetch the webcam but not the display, while the program contains the display but not the webcam. The current m1 goal still requires the browser and server pictures to match the studio program. Define the intended hybrid/reference picture and layering, or explicitly defer that parity goal along with the old Delivery and Cost bullets. This preserves the recorded program-first decision rather than restoring default source publication.
  • [P2] Give source replay history before it is requested (quest/m0/audio-source-tracks.md:28-32). Encoding only when a replay uses a source cannot populate the seconds before the replay click: Take::new copies the already-retained interval ending at that click. A newly selected, otherwise unused audio source therefore has no past to replay. Specify how the creator arms or buffers that source ahead of time and how unavailable history is reported, or narrow the replay goal to already-buffered sources. The same issue applies to picture-source replay under the new on-demand rule.

Verification: GitHub-only static review of the changed quests, recorded maintainer decisions and current replay path. I could not run quest context, the quest checker, or replay tests.

(Written by review (OpenAI))

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ No new issues found.

Reviewed changes

Only the two documentation edits in 7d1f7c1 since the previous pullfrog review (2d450b2) were reviewed here; both prior inline findings are now fixed and the new wording matches the quest it links to.

  • Audio encode rule restated in the m1 epic — the Required entry for audio source tracks now says tracks encode only while the studio uses them and reach the relay only when published independently, and marks the quest as m0 work.
  • Paragraph break restored — a blank line now separates the 2026-11-03 encode-rule decision from the "Track names stay stable" paragraph in quest/m0/audio-source-tracks.md, so the two render as distinct paragraphs.

Pullfrog  | View workflow run | Using big-pickle (free) | 𝕏

@kixelated

Copy link
Copy Markdown
Contributor Author

On the OpenAI review of 2d450b2: both P2s are fixed in f2ad6fe. The m1 epic now defers its parity goal along with the Delivery and Cost bullets. Source replay history follows a maintainer decision: a source visible in the program scene counts as used, so it holds history from when it appeared, and replaying a source with no history is refused with the reason.

(Written by Claude Opus 5.5)

@kixelated kixelated left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Automated review by review (OpenAI)

Reviewed head f2ad6fe.

  • [P2] Arm audio-only sources without picture visibility (quest/m0/audio-source-tracks.md:30–34). The new rule retains history while a source is visible in the program scene, but microphones and system audio have no picture and the UI does not place them in scenes (rs/moq-scene/src/collection.rs:868–871, rs/moq-studio/src/ui.rs:2373–2395). They can be audible in the program for minutes and still never satisfy this condition, so an otherwise unrecorded microphone has no isolated history when replay is requested. Count audio routed into the program as used, or specify another way to arm audio-only sources in advance, while retaining the no-history refusal.

The earlier parity finding is addressed by explicitly deferring the goal and requiring a reference picture. The replay change also arms visible picture sources and defines the no-history outcome; the audio-only case above remains. Verification: GitHub-only static review of the plan and current source/scene behavior. I did not run replay or UI tests.

(Written by review (OpenAI))

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Important

The new "used" list does not cover the independently published source this PR adds, so as written the plan publishes a track that nothing encodes. One inline comment with the cross-file consequences.

Reviewed changes

Only the two documentation edits in f2ad6fe since the previous pullfrog review (7d1f7c1) were reviewed here; both address the OpenAI review's P2s.

  • Program sources armed for replay (quest/m0/audio-source-tracks.md) — a source visible in the program scene counts as used, so its track has past for a replay to read, and a replay of a source with no history is refused with the reason.
  • m1 parity deferred (quest/m1/compose/README.md) — the Delivery and Cost bullets and the epic's parity goal are deferred until the reference picture is defined, since a source published independently is left out of the program.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using big-pickle (free) | 𝕏

Comment thread quest/m0/audio-source-tracks.md Resolved
…e counts as used

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated

Copy link
Copy Markdown
Contributor Author

On the OpenAI review of f2ad6fe: fixed in 6b9c94e. An audio source counts as on program while it feeds the program mix.

(Written by Claude Opus 5.5)

@kixelated kixelated left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Automated review by review (OpenAI)

Reviewed head 6b9c94e. The audio-only replay finding is addressed: audio feeding the program mix now counts as used independently of picture visibility, so microphones and system audio can retain history. Independently published sources are also explicitly kept encoding, and the no-history refusal remains specified. The earlier parity goal remains explicitly deferred. No additional actionable issue found in this update.

Verification: GitHub-only static review of the updated quests and current scene/audio behavior. I did not run replay or UI tests.

(Written by review (OpenAI))

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ No new issues found.

Reviewed changes

Only the two documentation edits in 6b9c94e since the previous pullfrog review (f2ad6fe) were reviewed here; together they close the remaining encode-trigger gap and the OpenAI P2 about audio-only sources.

  • Audio sources count as used while they feed the program mix — the "used" list now splits the case by source kind: a picture source while the program scene shows it, and an audio source while it feeds the program mix, so an audio-only source that never appears as a scene item still accumulates replay history.
  • Independently published sources count as used — quest/m0/audio-source-tracks.md and quest/m0/publish-independently.md both add this, so the track an independent source publishes has an encode trigger and layout.md's fetchable-track assumption holds.
  • Encode lifetime stated for independent sources — publish-independently.md records that such a source encodes for as long as it is published, and points back at the audio rule.

Pullfrog  | View workflow run | Using big-pickle (free) | 𝕏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant