moq-lite-05: replace SUBSCRIBE_OK/FETCH_OK with on-demand Track Stream#25
moq-lite-05: replace SUBSCRIBE_OK/FETCH_OK with on-demand Track Stream#25kixelated wants to merge 3 commits into
Conversation
Publisher track properties (priority, ordered, cache, timescale, compression) were echoed on every SUBSCRIBE_OK and (newly) FETCH_OK, repeating the same immutable data on every response — wasteful for group-by-group fetches in particular. Make those properties immutable for the lifetime of a track and move them to a dedicated Track Stream (0x6): TRACK request -> single TRACK_INFO reply -> FIN. The subscriber fetches it once and caches it, reusing it across every SUBSCRIBE and FETCH. As a result: - Remove SUBSCRIBE_OK: a subscription is now accepted implicitly (rejection is a stream reset). The resolved group range moves into dedicated SUBSCRIBE_START / SUBSCRIBE_END messages; subtypes renumbered START=0x0, END=0x1, DROP=0x2. - Remove FETCH_OK: a FETCH returns bare FRAME messages again. - Immutability rationale: publisher-side changes would fan *out* to every downstream of a relay; subscriber properties fan *in* and may still change via SUBSCRIBE_UPDATE. - Rework the Prioritization example so active-speaker adaptation is driven by subscriber priority (publisher priority can no longer be bumped mid-subscription). The subscriber MUST have TRACK_INFO before parsing frames (timescale and compression determine the frame wire format); it MAY open the Track and Subscribe/Fetch streams concurrently and buffer until it arrives. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Warning Review limit reached
More reviews will be available in 49 minutes and 28 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
WalkthroughThis pull request updates the moq-lite specification to introduce a new Track Stream ( 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches✨ Simplify code
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
draft-lcurley-moq-lite.md (1)
371-384: 💤 Low valueConsider adding language identifiers to code blocks in the Priority example.
Lines 371-384 contain code blocks demonstrating priority values, but they lack language identifiers (triggering markdownlint MD040). While these are illustrative pseudo-code rather than executable code, adding a language hint (e.g., ```text) would satisfy linters and improve rendering consistency.
✨ Optional improvement for code block formatting
-``` +```text ali/audio + bob/audio: subscriber_priority=2 publisher_priority=2 ali/video + bob/video: subscriber_priority=1 publisher_priority=1-
+text
bob/audio: subscriber_priority=4 publisher_priority=2
bob/video: subscriber_priority=3 publisher_priority=1</details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.In
@draft-lcurley-moq-lite.mdaround lines 371 - 384, Update the two fenced code
blocks showing priority examples so they include a language hint (e.g., change
the triple backticks totext) to satisfy markdownlint MD040 and ensure consistent rendering; specifically modify the blocks containing "ali/audio + bob/audio: subscriber_priority=2 publisher_priority=2" and the subsequent block starting with "bob/audio: subscriber_priority=4 publisher_priority=2" to usetext fences instead of plain ``` fences.</details> </blockquote></details> </blockquote></details> <details> <summary>🤖 Prompt for all review comments with AI agents</summary>Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.Inline comments:
In@draft-lcurley-moq-lite.md:
- Around line 288-298: Augment the Subscribe Stream section to remove ambiguity
by specifying timing rules for SUBSCRIBE_START and stream resets: state that
when a subscription cannot be fulfilled because the track does not exist or is
invalid the publisher MUST promptly reset the Subscribe stream (ideally within
one RTT or a configurable fixed timeout) rather than leaving it pending; when
the track exists but currently has no groups, allow the publisher to delay
sending SUBSCRIBE_START until the first group is produced for live tracks, but
REQUIRE the publisher to send SUBSCRIBE_END immediately for an ended track that
has no matching groups (or reset if it cannot accept the subscription);
reference SUBSCRIBE_START, SUBSCRIBE_END, SUBSCRIBE_DROP and the Subscribe
Stream in the new guidance so implementers know where to apply these timing
expectations.- Line 357: Update the sentence describing "Publisher Priority" so it refers to
the lifetime of the Track rather than the subscription: find the line that reads
"Publisher Priority is fixed for the lifetime of the subscription (see
TRACK_INFO)" and change its wording to state that Publisher Priority is fixed
for the lifetime of the Track (or: "fixed for the lifetime of the Track (see
TRACK_INFO)"); ensure the phrasing matches TRACK_INFO's guarantee that fields
are immutable for the Track and keep the parenthetical TRACK_INFO reference
intact.- Line 754: Clarify the ambiguous phrase "any such stream" by specifying that
when a subscriber receives TRACK_INFO with an unrecognized compression value it
MUST NOT open Subscribe (0x3) or Fetch (0x4) streams for that track, and if
there are already open Subscribe/Fetch streams for that track they MUST be reset
with a protocol violation; note that the Track Stream (0x6) from the publisher
will already be FIN'd and does not need resetting. Update the sentence to
reference TRACK_INFO, Subscribe (0x3), Fetch (0x4), and Track Stream (0x6)
explicitly so readers know which streams to avoid opening and which existing
streams to reset.- Around line 311-318: The text currently says subscribers "SHOULD" discard
cached TRACK_INFO after a duplicate active ANNOUNCE, which is unsafe; change
this to a mandatory requirement and specify failure behavior: require that upon
receipt of a new active ANNOUNCE the subscriber MUST discard any cached
TRACK_INFO for that track and MUST re-request TRACK_INFO before parsing further
FRAMEs, and if FRAMEs arrive that cannot be decoded due to stale Publisher
Timescale or Publisher Compression, the subscriber MUST reset the stream (send
RST) and re-fetch TRACK_INFO; alternatively (or additionally) introduce a stable
version/epoch field in TRACK_INFO tied to the active ANNOUNCE so subscribers can
detect staleness on-wire (reference: TRACK_INFO, ANNOUNCE, FRAME, Publisher
Timescale, Publisher Compression).
Nitpick comments:
In@draft-lcurley-moq-lite.md:
- Around line 371-384: Update the two fenced code blocks showing priority
examples so they include a language hint (e.g., change the triple backticks tospecifically modify the blocks containing "ali/audio + bob/audio: subscriber_priority=2 publisher_priority=2" and the subsequent block starting with "bob/audio: subscriber_priority=4 publisher_priority=2" to use ```text fences instead of plain ``` fences.🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID:
a9437e4d-719b-4377-8d17-125e69458796📒 Files selected for processing (1)
draft-lcurley-moq-lite.md
Address review feedback on the Track Stream: - Publisher SHOULD send TRACK_INFO ahead of group data. The concurrent flighting that keeps a cold subscribe/fetch to one RTT only holds if TRACK_INFO isn't starved behind group frames the subscriber can't yet parse (timescale/compression define the FRAME wire format). - Clarify cache invalidation for tracks reached without an ANNOUNCE: there's no re-announcement signal, so such a subscriber SHOULD NOT cache TRACK_INFO beyond a single connection and MAY re-request it to confirm freshness. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Subscribe: specify that a publisher MUST reset a subscription it cannot serve (promptly, ~1 RTT) rather than leave it pending, and that an accepted-but-empty subscription is signaled via SUBSCRIBE_START (deferred for live) or SUBSCRIBE_END (ended track), not a timeout. - TRACK_INFO cache: strengthen re-announce invalidation from SHOULD to MUST (discard + re-request before parsing further frames), and require a stream reset + re-fetch if frames can't be decoded against the cache. - Fix lifetime wording: Publisher Priority is fixed for the lifetime of the Track, not the subscription (matches TRACK_INFO). - Clarify unrecognized-compression handling: don't open Subscribe/Fetch streams; reset an already-open one; the Track Stream is already FIN'd. - Add `text` language hint to the prioritization example code fences. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… PR opens Two Datatracker submissions June 2 end a long-running drought: draft-ietf-moq-msf-01 finally published by Will Law + Suhas Nandakumar (134 days since -00, ends 5-day slippage saga of wilaw's May 27 Slack "Friday" pledge) with final pre-submit clean-up via moq-wg/msf PR #176 (RFC refs + SCTE35 removal) and companion moq-wg/cmsf PR #21 bumping CMSF's MSF reference from -00 to -01. New individual draft draft-einarsson-moq-locmaf-00 "Low Overhead CMAF for Media over QUIC" by Torbjorn Einarsson (Eyevinn) + Hugo Bjors (KTH) - first IETF artifact from the wiki maintainer; compact wire format carrying CMAF chunk metadata as tagged fields with sample data unchanged so receiver reconstructs MSE/EME-compatible CMAF chunks; slots between LOC (lean container, no MSE/EME) and CMSF (full CMAF chunks). afrind opens moq-transport PR #1642 "Replace Joining Fetch with Subscription Fill, add Current Group" (+188/-148) - structural redesign removing Joining Fetch entirely, adding new subscription filter types AbsoluteStartFill/AbsoluteRangeFill/CurrentGroup/ RelativeStartFill + FillDescending group order + Current Group Delivery + Fill Semantics sections; publisher opens single fill fetch stream reusing subscription Request ID for past objects while delivering current/future via subscribe subgroups/datagrams. Replaces ianswett's PR #1627 (auto-CLOSED June 3 after 30 days OPEN). Plus 2 new draft-18 design issues: #1641 by Tim Evens (Cisco) on PUBLISH_DONE control-stream-vs-request-stream wording (afrind reply "we can probably crisp this up"), #1643 by afrind on bidi-stream FIN semantics. London Day-1 MOQT Issues 180-min slot now has 3 normative- text deliverables + 4 design-issue threads. moq-dev/moq another ~14-merge cycle (all kixelated): PR #1604 moq-relay /health load-shedding endpoint (905 LOC, sysinfo-based CPU/RAM/RX/TX thresholds, 200 ok / 503 overloaded), first explicit production-CDN feature; moq-lite-05 wire-feature triple (PR #1595 Frame Start in FETCH MERGED, PR #1601 OPEN TrackConsumer::fetch first-class single-group FETCH +1027/-63, PR #1609 OPEN move immutable track props to TRACK_INFO Track Stream 0x6 implementing moq-dev/drafts#25); MPEG-TS fMP4 export close-out (PR #1590 out-of- band avc1/hvc1 + PR #1593 AAC esds synthesize via mp4_atom::Mp4a); API ergonomics (PR #1606 ergonomic subscribe(None) drops subscribe_default); release + dependency wave (PR #1607 moq-relay 0.12.7 + PR #1596/#1598/#1599/#1602/#1603 dependabot batches with code fixes for rand/rubato/rcgen). moq-lite-05 now has 5 wire features in 7 days (deflate + AnnounceOk + Frame Start + TrackConsumer::fetch + TRACK_INFO Track Stream) - most active wire- protocol evolution venue in the ecosystem. openmoq/moqx: Tim Evens (Cisco) emerges as new external contributor with PR #376 Debian bookworm builds + CPM (+92/-31) and PR #377 Apple Clang 21 fmt 10.2.1 consteval workaround (+21/-6) - same TimEvens filing transport Issue #1641, cross-repo emergence in ~18h. 3rd Cisco contributor reaching mainline moq-wg artifacts alongside Suhas Nandakumar + Mo Zanaty. cloudflare/moq-rs PR #167 minor refresh; PR #169/170/171 untouched. moqtail/moqtail, video-dev/moq-js (PR #72 OPEN), meetecho/imquic (PR #27 OPEN), mondain/moqxr + mondain/moq2ts, google/quiche moqt, birneee/quiche_moq, t-gazzy/Moqintosh, Eyevinn/moqlivemock, Eyevinn/warp-player, Eyevinn/moqtransport all quiet. Interop runner 177/57/119/1 at 2026-06-03 00:56:06 UTC: +6 pass vs June 2 (51 -> 57, 28.8% -> 32.2%, +3.4pp), largest single-day pass- count jump since May 19 cadence recovery; first 32%+ pass rate since cadence recovery; 16-day cadence (new longest streak). Version breakdown still 0 at target / 0 ahead / 177 behind - impl-registration drift unchanged, +6 jump comes from better cross-version compatibility behavior not registration closure. Mailing list: I-D Action announcements for MSF -01 + LOCMAF -00 June 2; afrind "Joining FETCH Replacement Proposal" thread linking PR #1642 with Magnus Westerlund replies; "London Agenda requests" replies from Mo Zanaty + Martin Duke; "Support for Track Filters and Top-N" thread continues. Slack #moq quiet since June 2. MoQ Monthly no new issue since #2 May 31. No open issues on tobbee/moq- llm-wiki. London hackathon 6 days away. Automatically generated by the MOQ wiki auto-update script. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
What
Replace the per-response publisher metadata in
draft-lcurley-moq-lite.mdwith a dedicated, on-demand Track Stream, and removeSUBSCRIBE_OKandFETCH_OK.Why
A track's publisher-chosen properties —
Priority,Ordered,Cache,Timescale,Compression— were being echoed on everySUBSCRIBE_OK(and, as recently drafted, everyFETCH_OK). These values are immutable for the life of a track, so repeating them on every response is redundant — especially when fetching a track group-by-group.Making them immutable also avoids a relay fan-out problem: a publisher-side change to one upstream subscription would have to propagate out to every downstream subscriber (and invalidate cached groups). Subscriber properties are the opposite — they fan in at a relay, which already merges them, so those remain mutable via
SUBSCRIBE_UPDATE.What changed
TRACKrequest (broadcast path + track name) → singleTRACK_INFOreply → FIN (or reset on error / missing track).TRACK_INFOcarries the immutable publisher properties. Fetched once and cached; reused across everySUBSCRIBEandFETCH.SUBSCRIBE_OK: a subscription is now accepted implicitly (rejection = stream reset). The resolved group range moved into dedicatedSUBSCRIBE_START/SUBSCRIBE_ENDmessages.SUBSCRIBE_STARTresolves the absolute start (>=requested; a larger value implicitly drops the leading range);SUBSCRIBE_ENDsignals no group follows a given sequence (stragglers may still be dropped before FIN). Subtypes renumbered:START=0x0,END=0x1,DROP=0x2.FETCH_OK: aFETCHreturns bareFRAMEmessages directly on the stream.moq-lite-05changelog.Reviewer notes / open questions
SUBSCRIBE_OKmeans acceptance is inferred from the absence of a reset (and fromSUBSCRIBE_START, which may be deferred for "latest" subscriptions). If a positive "subscribed" signal is desired, it would need a minimal ack — which partly reintroduces what this removes.TRACK_INFOis a parse prerequisite. Frames are unparseable without it (timescale gates the per-frame delta fields). The subscriber MUST obtain it first; it MAY open the Track and Subscribe/Fetch streams concurrently and buffer frames until it arrives. This trades a potential first-access round-trip for eliminating per-response repetition.Validation
#trackanchor collision (data-model## Track, overview### Track, message## TRACK) by giving the overview an explicit{#track-stream}anchor.kramdown-rfc/xml2rfcare unavailable in this environment and thelib/submodule is unpopulated, somakewas not run. Structure is sound but the rendered build is unverified.🤖 Generated with Claude Code