Skip to content

moq-lite-05: replace SUBSCRIBE_OK/FETCH_OK with on-demand Track Stream#25

Open
kixelated wants to merge 3 commits into
mainfrom
claude/gallant-hertz-102168
Open

moq-lite-05: replace SUBSCRIBE_OK/FETCH_OK with on-demand Track Stream#25
kixelated wants to merge 3 commits into
mainfrom
claude/gallant-hertz-102168

Conversation

@kixelated
Copy link
Copy Markdown
Collaborator

What

Replace the per-response publisher metadata in draft-lcurley-moq-lite.md with a dedicated, on-demand Track Stream, and remove SUBSCRIBE_OK and FETCH_OK.

Why

A track's publisher-chosen properties — Priority, Ordered, Cache, Timescale, Compression — were being echoed on every SUBSCRIBE_OK (and, as recently drafted, every FETCH_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

  • New Track Stream (0x6): TRACK request (broadcast path + track name) → single TRACK_INFO reply → FIN (or reset on error / missing track). TRACK_INFO carries the immutable publisher properties. Fetched once and cached; reused across every SUBSCRIBE and FETCH.
  • Removed SUBSCRIBE_OK: a subscription is now accepted implicitly (rejection = stream reset). The resolved group range moved into dedicated SUBSCRIBE_START / SUBSCRIBE_END messages. SUBSCRIBE_START resolves the absolute start (>= requested; a larger value implicitly drops the leading range); SUBSCRIBE_END signals no group follows a given sequence (stragglers may still be dropped before FIN). Subtypes renumbered: START=0x0, END=0x1, DROP=0x2.
  • Removed FETCH_OK: a FETCH returns bare FRAME messages directly on the stream.
  • Prioritization example reworked: since publisher priority can no longer be bumped mid-subscription, active-speaker adaptation is now driven by subscriber priority.
  • Repointed cross-references, updated the Subscribe/Fetch stream overviews, and refreshed the moq-lite-05 changelog.

Reviewer notes / open questions

  • No explicit subscription ack. Removing SUBSCRIBE_OK means acceptance is inferred from the absence of a reset (and from SUBSCRIBE_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_INFO is 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.
  • Cache invalidation is currently tied to broadcast re-announcement; if there's a stronger notion of track identity, the cache should key off that instead.

Validation

  • Cross-reference checker reports zero dangling anchors. Fixed a real #track anchor collision (data-model ## Track, overview ### Track, message ## TRACK) by giving the overview an explicit {#track-stream} anchor.
  • Not built: kramdown-rfc / xml2rfc are unavailable in this environment and the lib/ submodule is unpopulated, so make was not run. Structure is sound but the rendered build is unverified.

🤖 Generated with Claude Code

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>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 3, 2026

Review Change Stack

Warning

Review limit reached

@kixelated, we couldn't start this review because you've reached your PR review rate limit.

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 @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1d304313-6ad5-4294-9dc0-0bf12ab6d61e

📥 Commits

Reviewing files that changed from the base of the PR and between 1f0225a and a31c367.

📒 Files selected for processing (1)
  • draft-lcurley-moq-lite.md

Walkthrough

This pull request updates the moq-lite specification to introduce a new Track Stream (0x6) with TRACK/TRACK_INFO message exchange, shifting per-track media configuration (timescale, compression, priority, cache settings) from SUBSCRIBE_OK to immutable TRACK_INFO fields. The Subscribe Stream behavior is rewritten to model implicit acceptance with explicit SUBSCRIBE_START/SUBSCRIBE_END/SUBSCRIBE_DROP response messages. Frame and datagram field presence conditions are updated to reference the new TRACK_INFO source. Priority semantics are clarified, expiration and cache references are updated, FETCH response semantics are simplified (no response header, stream reset on error), and the changelog reflects these moq-lite-05 wire-level and semantic changes.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the primary change: replacing SUBSCRIBE_OK/FETCH_OK with an on-demand Track Stream in moq-lite-05.
Description check ✅ Passed The description comprehensively relates to the changeset, detailing what was changed, why, and how, with validation notes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch claude/gallant-hertz-102168

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

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (1)
draft-lcurley-moq-lite.md (1)

371-384: 💤 Low value

Consider 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.md around lines 371 - 384, Update the two fenced code
blocks showing priority examples so they include a language hint (e.g., change
the triple backticks to text) 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 use text 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 to
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 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

📥 Commits

Reviewing files that changed from the base of the PR and between 746f3ce and 1f0225a.

📒 Files selected for processing (1)
  • draft-lcurley-moq-lite.md

Comment thread draft-lcurley-moq-lite.md
Comment thread draft-lcurley-moq-lite.md
Comment thread draft-lcurley-moq-lite.md Outdated
Comment thread draft-lcurley-moq-lite.md Outdated
kixelated and others added 2 commits June 2, 2026 20:09
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>
tobbee added a commit to tobbee/moq-llm-wiki that referenced this pull request Jun 3, 2026
… 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>
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