moq-lite-05: REANNOUNCE, timestamps, and datagrams#23
Conversation
- Adds `restart` ANNOUNCE status (2) for atomic UNANNOUNCE+ANNOUNCE when origin or hop path changes without interrupting the broadcast. - Adds `Publisher Timescale` to SUBSCRIBE_OK and per-frame `Timestamp Delta` (zigzag varint) to FRAME, enabling timestamp-based expiration instead of wall-clock arrival time. - Adds QUIC datagram delivery for single-frame groups, routed via existing Subscribe IDs (no separate control stream). Datagram bodies are capped at 1200 bytes to fit within the minimum QUIC path MTU. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Warning Review limit reached
More reviews will be available in 55 minutes and 26 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 draft updates moq-lite's protocol semantics and wire format by introducing explicit per-frame timestamp support with Timescale-based expiration, adding datagram delivery as an alternative to stream-based group transport, and extending ANNOUNCE messaging with an atomic 🚥 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
🤖 Prompt for all review comments with AI agents
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`:
- Line 730: Replace the phrase "An application specific payload." with the
hyphenated compound adjective "An application-specific payload." — locate the
exact sentence in draft-lcurley-moq-lite.md (the line containing "An application
specific payload.") and update it to use the hyphenated form for consistency and
readability.
- Around line 390-393: The spec currently treats datagram field Timestamp=0 as
“unspecified,” which prevents representing a true absolute timestamp of value 0
for Tracks with non‑zero Timescale; update the Timestamp definition (the
datagram/field named "Timestamp" in the Track description) so that “unspecified”
is not conflated with the numeric zero—either make unspecified conditional on
Timescale=0 (i.e., if Timescale==0 then Timestamp MUST be 0 to mean unspecified)
or add an explicit validity flag/parameter (e.g., a TimestampValid bit)
alongside Timestamp to indicate whether the numeric value is meaningful; change
the prose and any examples to reflect the new rule and ensure all references to
Timestamp and Timescale in the document use the new semantics.
- Around line 472-476: Update the ANNOUNCE state-machine alternation rule so it
explicitly allows the `restart` status alongside `active` and `ended`: modify
the sentence that currently requires publishers to “MUST ONLY alternate ...
active to ended or vice versa” to mention `restart` (e.g., allow transitions
between `active`, `ended`, and `restart` or state that `restart` may replace an
`active` announcement atomically). Ensure references to `restart`, `active`, and
`ended` in the ANNOUNCE section and any normative MUST language are updated so
the rules are consistent with the `restart` definition in the `restart` (2)
paragraph.
- Around line 332-336: The expiration definition is ambiguous for Groups that
contain zero FRAME messages; update the text around the Group/Frame/Max Latency
explanation so that when a Group has no FRAMEs its “first frame” timestamp is
treated as the group arrival/queue time (subscriber arrival or publisher queue
time) for the purpose of computing the delta used by Track (respecting Track
negotiation of Timescale), i.e., if Timescale is non-zero but the group is
empty, fall back to arrival/queue time; ensure the new normative sentence
references Group, Frame, Max Latency, Track and Timescale and clarifies this
fallback rather than leaving it undefined or exempting empty groups.
🪄 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: 15a5e7d0-a2bf-456f-9add-608867a569c8
📒 Files selected for processing (1)
draft-lcurley-moq-lite.md
- Define expiration fallback for zero-frame groups (use wall-clock arrival/queue time regardless of Timescale, so empty keep-alive or gap-marker groups don't stall expiration). - Datagram Timestamp field: clarify that 0 is only "unspecified" when the Track's Timescale is 0; otherwise 0 is a legitimate absolute timestamp. - Resolve ANNOUNCE alternation-rule contradiction: the rule now allows `restart` alongside `active`, matching the `restart` (2) definition. - Hyphenate "application-specific" in FRAME payload description. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…st includes moq-rtc WebRTC bridge + lite-05 deflate + REANNOUNCE; quiche moqt prep for "requests on bidi streams"; MSF -01 publishes today; interop 49/127 11-day cadence
Yu You (Nokia) May 29 05:59:04 UTC reports Nokia implemented SWITCH PR #1378 with measured positive results ("first object arrival time significantly reduced compared to naive track re-subscription, catch-up objects using fetch headers over separate unistreams functioned as intended"); YES/YES on both SWITCH and DTS adoption + integration into MOQT draft = Nokia is 5th independent SWITCH implementer (after Gwendal's May 27 count of 4) and first on-list public implementation report with measured benefit numbers, 6 days before June 4 consensus call close. Gwendal Simon May 28 14:08:56 UTC YES/YES on SWITCH but YES-with-scope-reservations on DTS (DTS lacks normative bandwidth-measurement guidance, requires relays to fetch all renditions while forwarding one which "moves away from the lightweight, stateless, horizontally scalable model needed for CDN deployment"; advocates focused proportionate PR not full chapter). Combined vote tally heading into June 4 close: Gwendal YES/YES + Will Law Yes/Yes/Yes/Yes + Yu You/Nokia YES/YES on SWITCH adoption + integration = public on-list vote substantively favors SWITCH adoption with integration into MOQT draft; June 4 close substantively decided ahead of formal deadline; WG consensus-call pattern now supplemented by public implementation evidence on-list before close. moq-dev/moq kixelated ~25-PR single-day burst May 28 14:00 UTC → May 29 05:00 UTC = largest single-day push by single contributor wiki has tracked across any MoQ implementation (exceeds afrind 13-event May 27 openmoq/moqx burst): PR #1528 moq-rtc OPEN (+2590/-17, 30 files) first WebRTC↔MoQ bridge with 2x2 matrix (server/client × publish/subscribe) Opus/H.264/VP8/VP9 via str0m 0.19 unlocks OBS/camera-vendor ingest + last-mile WHEP distribution; PR #1531 lite-05 negotiate per-frame compression via SUBSCRIBE_OK MERGED (+790/-113) first concrete moq-lite-05 wire feature opt-in raw DEFLATE hop-by-hop with 16 MiB cap demonstrates PR #1518 Lite05Wip unadvertised variant works as intended; PR #1530 REANNOUNCE OPEN (+716/-252) atomic broadcast replacement per moq-dev/drafts#23 ANNOUNCE status 2; PR #1529 moq-ffi streaming media import + cross-language interop smoke test MERGED 2x2 rust↔python H.264 + negative control all PASS; plus 20+ more merges/opens including #1487 catalog filter/Annex-B exporters (+1766/-109), #1514 linger upstream subscriptions, #1517 gzipped stats broadcast (+1092/-718), #1521 16 MiB frame cap, #1523 stop downgrading WS clients to lite-02, #1526 swift+kt FFI, #1434 OriginConsumer split (opened May 21 finally merged), #1495 thiserror, #1473 runtime Timescale, #1533 libmoq catalog producer + raw moq-net track API (+721/-0), #1535 moq-relay mTLS path scoping, #1538 nixfmt. Combined with May 22-28 packaging story (Homebrew + .deb + .rpm) + cluster discovery + preferred_address + qmux version mapping + mTLS path scoping, moq-dev/moq has structurally completed "single-tree polyglot full-stack production-grade MoQ deployment" story 11 days before London; narrows Luke Curley May 9 HN "MoQ replaces WebRTC" framing to "MoQ ingests-from + serves-to WebRTC peers". openmoq/moqx afrind multi-thread sprint Day 2 = 6 MERGED + 3 OPEN (#348 res→reply coroutine, #349 TSan, #350 cBPF reuseport steering, #351 IOThreadPoolExecutor isolation, #337 mvfst recvmmsg + batch 64, #353 moxygen sync; OPEN: #352 CrossExecFilter, #346 PublishOk NGR tests, #331 relay_thread config = last PR-merge before threads>1 production-usable); 2-day cumulative 19 events May 27-28 = largest two-day push by any contributor across any MoQ implementation tracked. google/quiche moqt breaks 8-day silence with martinduke 2 commits May 28: c4503a21 19:59:40 UTC "Move IncomingDataStream to moqt_uni_stream.h. Other preparatory changes for requests on bidi streams" + 997d6543 21:52:27 UTC "Move Incoming Subscribe tests out of MoqtSessionTest" — "requests on bidi streams" signals post-draft-18 direction moving SUBSCRIBE-class messages from single control stream onto per-request bidi streams (H/3-style vs H/2-multiplex), resolves control-stream head-of-line-blocking; chair-led C++ implementation preceding formal spec proposal = same pattern as wilaw's MSF-spec-and-PRs editorial control and afrind's openmoq/moqx multi-thread sprint preceding London Day-1 MOQT Issues slot; draft-19 (or later) likely to surface this as major redesign topic at London June 11-12 or June 22 interim. Will Law announces MSF -01 publishes today Friday May 29 ahead of London in Slack May 27 10:30 UTC reply to Lorenzo "Is moq-mi still relevant?" thread ("LOC is just a packaging format... use MSF... I plan to release a new draft this Friday ahead of the London interop") = first MSF revision since -00 Jan 19 2026 (130-day gap, slower than moq-transport 49-day draft-17→draft-18 cadence but consistent with MSF higher relative editorial stability as packaging-format spec); converts wilaw's 16-events-in-4-days editorial sprint May 24-27 into normative artifact; expected cuts in -01: PR #166 typed-object initDataList + PR #167 targetBuffer + PR #168 catalog object numbering + PR #173 normative refs update. Mike English Slack reply asks for streaming-format-level automated interop (interop-runner Issue #32) currently matrix tests wire-protocol only not MSF/CMSF/LOC. Alan Frindell self-fetch thread continues with 3-of-3 contributor consensus (Lorenzo "content is content" + afrind "if we allow [self-subscribe], allowing the other seems right... you can cheat to prime the cache?" + implicit Suhas) that self-fetch should be allowed by symmetry; "prime the cache" use case = publisher fetches own past objects to populate relay egress cache before subscriber arrival useful for relay-cache testing scaffolding. cloudflare/moq-rs PR #169 AuthHook design still OPEN no new comments since May 28 03:58 UTC. video-dev/moq-js PR #72 Manish refactor still OPEN no commits Day +3. moqtail/moqtail, mondain/moqxr, birneee/quiche_moq, t-gazzy/Moqintosh, Eyevinn/moqlivemock, Eyevinn/warp-player, Eyevinn/moqtransport, englishm/moq-interop-runner all quiet. No new IETF drafts published yet (transport-18 Day +17, msf-00 awaiting MSF -01 publication today, loc-02, secure-objects-00, privacy-pass-02, cmsf-00; gregoire-moq-msfts-00 Day +23). MoQ Monthly Day +29 since #1. No open issues on tobbee/moq-llm-wiki. Interop runner 177/49/127/0 at 2026-05-29 00:47:39 UTC: +3 pass vs May 28 (46→49, 26.0%→27.7%, +1.7pp), pass rate above 27% for first time since cadence recovery; 11 consecutive days of daily reports (May 19-29) = longest cadence streak wiki has tracked extending May 28 first-double-digit streak; rolling 5-day band 46-49, trajectory 48→46→49 = matrix rebounds past May 27 peak to new May high; +3 plausibly attributable to moq-dev/moq's massive ~25-PR refactor wave shaking some test combinations stable (PR #1487 +1766/-109 + PR #1514 + PR #1473 + PR #1517 +1092/-718 touch a lot of code). Target still draft-16 (PR #68 OPEN since May 18 no commits since May 19, three impls on draft-18 main). Version breakdown: 97 at target · 8 ahead · 72 behind. London hackathon 11 days away. PR #68 draft-18 target bump remains only outstanding matrix-shape lever before London.
Automatically generated by the MOQ wiki auto-update script.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Three additions for moq-lite-05:
1. REANNOUNCE (atomic re-announcement)
A new
restart(2) value forAnnounce Statuson the existing ANNOUNCE message. Semantically equivalent toendedimmediately followed byactivefor the same path, but signals that the broadcast was never actually unavailable — useful when only the origin or hop path changes (relay failover, upstream restart). The Hop ID list may differ from the prior announcement.Alternation rules updated: a broadcast cycles
ended↔ (active|restart). Arestartwithout a prioractiveis a protocol violation.2. Timestamps and per-track timescale
Based on moq-dev/moq#1439.
Publisher Timescale (i)added to SUBSCRIBE_OK. Units per second;0means unspecified. Fixed for the lifetime of the subscription.Timestamp Delta (i)prepended to every FRAME — zigzag-encoded signed delta from the previous frame's timestamp (first frame deltas from0).3. QUIC datagram delivery
Based on moq-dev/moq#1374, but with a different shape per discussion: no separate DATAGRAMS control stream. A publisher MAY send any group as one QUIC datagram routed via the existing Subscribe ID, so datagrams and streams coexist on a single subscription.
Datagram body:
Subscribe ID (i) | Group Sequence (i) | Timestamp (i) | Payload (b). Each datagram is a complete group with exactly one frame; not cached, not retransmitted. Total body capped at 1200 bytes to fit within the minimum QUIC path MTU without IP fragmentation — oversize payloads must be sent as a Group Stream instead. Subscribers must deduplicate by group sequence when receiving both delivery paths.Open design choices worth a second look
restartvsreannounce— happy to rename.Timestamp(PR 1374 omits it) so timestamp-based expiration also works for datagram-only groups.Test plan
make draft-lcurley-moq-lite.txtbuilds cleanly.restartnaming and the datagram-MTU cap.🤖 Generated with Claude Code