Skip to content

chore(moq): pin moq ffcb7cd for the presentation timeline - #35

Merged
kixelated merged 2 commits into
mainfrom
quest/m0/pin-presentation-timeline
Nov 4, 2026
Merged

kixelated merged 2 commits into
mainfrom
quest/m0/pin-presentation-timeline

Conversation

@kixelated

@kixelated kixelated commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Finishes quest/m0/pin-presentation-timeline.md.

Problem

Broadcast sync needs moq-mux's shared presentation timeline (moq_mux::timeline). Its moq quest is gone from moq main, now moq-dev/moq@ffcb7cd, so the pin can move.

Approach

just upgrade-moq from fd07f5b to ffcb7cd (53 moq commits). bun.lock needed no change; Cargo.lock drops what moq no longer uses. The studio is ported to what broke, keeping current behavior and not adopting the timeline yet (broadcast sync does that):

  • moq-dev/moq#7652: HLS records are gone. Reserved::with_hls_hint is with_interval, the with_hls(None) calls on source listings and replay takes go, and the catalog clock moved from the root to media.clock.
  • Source listings mirrored under dev.moq.studio.sources used to drop their root clock. Now they drop the whole media section: the clock plus the join interval each source's own catalog would declare. The listing's wire shape stays as it was, and an emptied source catalog still counts as default, so it is still removed.
  • moq-dev/moq#7729: authored tracks now default to a zero max age. I checked each track the studio authors:
    • Program, source, and recording media tracks are minted by moq-mux catalogs whose unset Config still uses hang::container::MAX_AGE (30 s) (moq/rs/moq-mux/src/catalog/producer.rs:405). That is the window replay::MAX_LENGTH names, so replay still finds its held groups.
    • Replay takes already set with_max_age(None) explicitly.
    • The catalog track now advertises a zero max age. A reader still gets the newest snapshot, which never goes stale.
    • The guest renewal token track and the uplink probe track take the zero default. The join page (js/join/src/renew.ts) and the probe reader only want the newest group, and the newest group never goes stale.
    • So the studio relies on no publisher max age it does not already get, and none is added.
  • The quest file is deleted. Its links in quest/m0/broadcast-sync.md and quest/m0/README.md are removed, and broadcast-sync's plan now names the pinned timeline module.

Impact

  • Catalog wire: the program catalog's clock moves from the root clock to media.clock, and the program catalog gains media.join.interval (its longest GOP). This is moq's own catalog break: a reader on an older hang no longer finds the root clock. The join page builds from the submodule's JS, so it moves with this PR. Source listings are unchanged.
  • No flags, panels, or scene-file changes.
  • Public API: none in moq-scene.

Alternatives

  • Keep each source listing's own media.join. That would add a per-source join interval to the wire that nothing reads, because HLS exports only the program, and it would keep a source catalog with no renditions from being removed.
  • Set with_max_age(hang::container::MAX_AGE) explicitly on the program and source catalogs. That restates what moq-mux's default Config already guarantees.

Choices made without asking

  • Strip the whole media section from mirrored source listings, as described above.
  • Leave the token and probe tracks on moq-net's zero max-age default.

Validation

  • just ci: passed. That covers just check, including clippy with capture,openh264,cef, plus bun test and cargo nextest: 163 passed.

  • GPU tests on this Mac (Metal, openh264), all passed:

    • engine::tests::the_program_reaches_a_relay
    • engine::tests::the_program_records_without_a_relay
    • setup::tests::times_every_canvas
    • all 19 compositor::tests
  • Replay's held-group tests (moq-scene replay::tests, moq-studio replay::tests) and the recording tests run in the nextest suite above.

  • GitHub Check failed on b2924c2 (run 41833507639), and the failure is not from this PR. bun install's postinstall builds moq-libav from source, because neither nix.moq.dev nor cache.nixos.org holds it. That build fetches ffmpeg-9.0.tar.xz from ffmpeg.org, which refused connections from the runner (curl: (28) Failed to connect to ffmpeg.org:443).

    • The same derivation (wm8sffhm05...-moq-libav-0.1.0.drv) failed the same way on the old pin fd07f5b, in #33's run 41828792976.
    • The same derivation built fine at 11:41Z in #21's run 41822572362.
    • So the bump leaves this derivation unchanged and the failure is an outside outage. ffmpeg.org answers again from here, so I re-ran the failed job.
    • The root-cause fix, pushing moq-libav and its sources to nix.moq.dev, is moq's CI never downloads libav's sources quest.

Porting notes for open PRs

I trial-merged each open PR onto this head locally:

  • #21 (encode-control): conflicts in rs/moq-scene/src/publish.rs and rs/moq-studio/src/engine.rs. Port these:
    • drop .with_hls(None)
    • change catalog.clock = None to catalog.media = Default::default()
    • rename the ladder's .with_hls_hint(...) to .with_interval(...)
    • check its local catalog's Config
    • its new ladder.rs tests create tracks with None/Info::default(), which now means a zero max age
  • #29, #31, #32, #33: merge cleanly. Clippy with all features and nextest pass on the merge, so nothing to port. feat(studio): audio mixes, routing, meters, listening, and sync delay #32's broadcast-sync.md edit auto-merges.
  • #34 (overlays): Cargo.lock conflicts only. Take this side and re-resolve with cargo metadata, which adds Blitz's crates. Clippy and nextest then pass.

Follow-ups

  • Once moq's libav-sources quest lands, check that the studio's Check substitutes moq-libav from nix.moq.dev too. The studio flake's nixConfig names that cache, so a later moq bump should pick it up.

Review

Codex (quest review), gpt-6.1-sol, medium effort, round 1 on head b2924c28d0868fabb14a441c8fd9bf3c10f5c28d against origin/main dba63e5. No findings.

(Written by Claude Opus 5.5)

kixelated and others added 2 commits November 4, 2026 04:39
Bump the moq gitlink to ffcb7cd, which carries moq-mux's shared
presentation timeline, and port the studio to the API it breaks:
with_hls_hint is with_interval, HLS records are gone, and the clock moved
under the catalog's media section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kixelated kixelated changed the title moq-mux's presentation timeline is pinned chore(moq): pin moq ffcb7cd for the presentation timeline Nov 4, 2026
@kixelated
kixelated marked this pull request as ready for review November 4, 2026 12:55
@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 27 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: 269c84de-f0c0-4b21-a7df-3d33c334337c
Commits

Reviewing files that changed from the base of the PR and between dba63e5 and b2924c2.

Files ignored due to path filters: 1
  • Cargo.lock is excluded by !**/*.lock
Files selected for processing: 10
  • moq
  • quest/m0/README.md
  • quest/m0/broadcast-sync.md
  • quest/m0/pin-presentation-timeline.md
  • rs/moq-scene/src/publish.rs
  • rs/moq-scene/src/replay.rs
  • rs/moq-scene/src/source.rs
  • rs/moq-studio/src/engine.rs
  • rs/moq-studio/src/record.rs
  • rs/moq-studio/src/replay.rs
  • 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

@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: b2924c2

No actionable findings in the pin integration. The catalog-authored media tracks retain their 30-second default, replay copies explicitly retain history, and the source-listing media reset preserves empty-listing removal. The catalog clock wire change is disclosed in the PR.

Verification: GitHub-only static inspection of the changed integration and relevant upstream paths; not an exhaustive review of all 53 upstream commits. I did not run tests, GPU/browser checks, or quest context.

(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

Reviewed the moq pin bump from fd07f5b to ffcb7cd (identical to moq main) and the studio port across 53 upstream commits.

  • moq pin — advances to the commit carrying moq_mux::timeline; Cargo.lock only drops dependencies moq no longer uses.
  • Catalog clock move — source listings now clear the whole media section (clock plus join interval) instead of the old root clock, preserving the mirrored wire shape and empty-listing removal.
  • HLS removal — .with_hls_hint(...) becomes .with_interval(...) and the .with_hls(None) calls go, so the program catalog advertises media.join.interval.
  • Zero max-age default — no production change needed: media tracks still get moq-mux's 30 s default, replay takes keep with_max_age(None) (unlimited in Rust), and the catalog, token, and probe tracks take the zero default where only the newest group is ever read.
  • Quest bookkeeping — deletes the completed pin quest and updates quest/m0/README.md and broadcast-sync.md.

I verified the upstream claims at the pinned SHA: timeline is exported, Config::default() sets max_age = MAX_AGE (30 s), Info::default() uses Some(Duration::ZERO) while with_max_age(None) is unlimited, the catalog track stays on the zero default with snapshot mode, and broadcast sources never publish the nested listing whose media is cleared. The Check workflow was still running when this review was submitted; the author reports just ci and the local GPU tests passing.

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

@kixelated
kixelated merged commit c3038c2 into main Nov 4, 2026
5 of 6 checks passed
@kixelated
kixelated deleted the quest/m0/pin-presentation-timeline branch November 4, 2026 14:40
kixelated added a commit that referenced this pull request Nov 4, 2026
Ports to moq ffcb7cd (#35): no catalog opts out of HLS, a nested catalog
clears its media timing, and a reservation names its join interval.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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