Repository navigation
quest: plan HLS listing of catalog contributions - #7645
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- New quest
quest/m0/hls-contributions.md— plans moq-hls listing each root-catalogcontributionsentry's renditions in the master playlist, reading a contribution's catalog forBANDWIDTHwhile subscribing no media, with lazy per-rendition subscription and RFC 8216 6.3.4 idle release. quest/m0/README.mdindex bullet — adds the quest to the m0 Required list.
I verified the plan's load-bearing claims and cross-links against the head tree:
moq-dev/moq#7312matches the cited "list whole contribution broadcasts in the catalog" work (merged 2026-11-01, adds lazyBroadcast.contribution), andrs/moq-hlshas no contribution handling today.moq_mux::Sourcebinding is real:rs/moq-mux/src/source.rs:336(bind) is whatrs/moq-hls/src/export/rendition.rs:148uses, matching the "resolve like a rendition's reference" plan.- The hang draft's
## Contributionssection exists (drafts/draft-lcurley-moq-hang.md:213) and already says a consumer opens a contribution's catalog only on selection, so the planned draft addition is a genuine rule, not a restatement. moq-transcodeonly encodes on rung demand (rs/moq-transcode/src/rung.rs:3), supporting the on-demand-publisher claim.- RFC 8216 §6.3.4 is "Reloading the Media Playlist File", so the idle-release citation is correct.
- Cross-links resolve:
quest/m0/hls-media-grid.md,quest/m2/hls-follow-once.md, anddoc/bin/hls.mdall exist, and no other quest plans HLS contribution listing.
deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: d5785f7
- P2 — Reconcile contribution following with pinned bindings (
quest/m0/hls-contributions.md:25–31). The plan mandatesSource::bindand its pinning while promising restarted contributions follow the new instance.rs/moq-mux/src/source.rs:206–235,321–341keeps the first resolved broadcast, including after replacement. A contribution restarting while its parent remains live would remain attached to the ended publisher. Use the existingSource::followlifecycle for contributions intended to follow, while keeping rendition reads pinned to their selected instance. Explicitly instance-bound contributions must not switch streams.
Catalog-only discovery and demand-driven media are a sensible way to expose on-demand ladders without starting every encode; reuse the existing follower rather than adding another resolver.
Verification: static review of the plan, grid prerequisite, source resolution, HLS routes/master, contribution semantics and tests, and transcoder catalog construction. No builds, tests, or playback checks run.
WalkthroughThe change adds an HLS contribution-listing requirement and a proposal. The proposal covers catalog-based listing, reference resolution, rendition compatibility, demand-based media subscriptions, idle release, URL and naming rules, and test and documentation updates. DASH listing and recorder behavior remain out of scope. Merge Risk:
|
Records the maintainer's 2026-11-02 decision that the master reads each contribution's catalog. Replaces Source::bind, which never follows a restart, with Source::follow and a per-instance Source. Keeps a rendition's demand while a request is still in progress. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed commit: 5fe085a
The previous bind-versus-follow finding is fixed: contributions now use Source::follow, with per-instance sources pinning catalog and media reads; explicitly named instances cannot switch streams. The idle-release change preserves demand throughout in-progress requests and measures inactivity after completion, addressing the independent slow-response finding.
No new actionable bugs found. Reusing the existing follower keeps the approach appropriately scoped.
Verification: static incremental comparison and inspection of the existing follower implementation and tests. This changes the plan only; no builds, tests, or playback checks run.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
Since the last Pullfrog review (d5785f7), the quest was revised on 5fe085a:
- Catalog read recorded as a maintainer decision — the plan now states the 2026-11-02 decision that the master reads each contribution's catalog when served while only the media waits, and notes the draft rule that an on-demand publisher answers the catalog without starting media.
Source::bind→Source::follow— replaces the previous "resolve like a rendition's reference" approach. Each contribution entry is followed withSource::follow(moq_mux::follow::Instances) and amoq_mux::Sourceis built per handed-out instance, so catalog and media reads stay pinned; a new instance replaces the renditions and an ended one drops them.- Idle-release refinement — release now requires no request in progress and none finished within the window; a slow response (a first media playlist waiting on an on-demand encode) keeps the subscription.
- Test plan additions — a request in progress past the idle window keeps demand, a restarted contribution follows onto its new instance, and one naming an
instancedoes not.
I verified the new technical claims against the head tree:
Source::bindpins the path's first answer and never re-resolves after a replacement (rs/moq-mux/src/source.rs:326), and a sibling-boundMediaends when the bound broadcast closes (rs/moq-hls/src/export/rendition.rs:179), which is the premise for switching tofollow.Source::followreturnscrate::follow::Instances(source.rs:380), public viapub mod follow(lib.rs:38);follow.rs:39-41documents the exact planned pattern (follow the broadcast, build aSourceper instance).Instanceswith a namedinstanceskips another-instance broadcasts and reportsEndrather than substituting (follow.rs:82-88), matching the draft'sinstancerules (draft-lcurley-moq-hang.md:717).
This delta directly addresses the prior automated review (kixelated/OpenAI P2) asking for Source::follow over Source::bind, plus the CodeRabbit idle-release fix. The plan is coherent with the code and the hang draft; no actionable issues.
(Written by deepseek-v4.1-flash)
deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏

Problem
A catalog can list whole contribution broadcasts in its root
contributionsmap (moq-dev/moq#7312), and@moq/watchopens one lazily. moq-hls ignores them, so an HLS-only viewer cannot reach a contribution's renditions, such as an on-demand transcode ladder, from the broadcast's master playlist. No quest owns this.Approach
Plans HLS lists contributions in m0, after HLS export on a declared grid, which it requires: the master reads each contribution's catalog and lists its renditions, while each contribution rendition's media is subscribed only once a player requests it and released once players stop fetching.
Choices made while planning, for review:
moq-transcodealready does.Source::bindnever re-resolves a path after a replacement (rs/moq-mux/src/source.rs:326-327). So each contribution is followed withSource::follow, and each instance gets its ownmoq_mux::Source, pinning that instance's reads. An entry that names aninstancefollows only that stream.media.join.intervalis left out, since players switch variants by segment number.Impact
None; quest files only. The planned work is additive in moq-hls and adds a rule to the hang draft.
Alternatives
BANDWIDTHper variant.Follow-ups
None.
Review
quest review --base origin/main, round 1 of session01a19f17-58f3-70e3-9a7b-97469d71b0fc)Source::bindnever follows a restart. Fixed: the plan now usesSource::follow, with aSourcefor each instance.(Written by Claude Opus 5.5)
🤖 Generated with Claude Code