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>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
WalkthroughThis draft adds Qmux transport bindings and treats moq-lite as running on ordered, multiplexed, bidirectional stream-capable transports. Groups may be delivered over dedicated streams or as single unreliable datagrams; frames gain per-frame Timestamp and Duration tied to the Track Timescale (Timescale=0 falls back to wall-clock). Expiration uses timestamp deltas when Timescale is non-zero, otherwise uses wall-clock; empty groups always use wall-clock. A Datagrams section defines routing, datagram body encoding, deduplication, and a 1200-byte body limit. ANNOUNCE semantics and SUBSCRIBE_OK gain new fields and encoding rules. 🚥 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>
- Omit FRAME `Timestamp Delta`/`Duration Delta` and datagram `Timestamp`/`Duration` from the wire entirely when the Track's `Publisher Timescale` is 0 (instead of encoding placeholder zeros). Saves 2 bytes per frame / per datagram on timescale-less tracks. - Add `Publisher Cache` to SUBSCRIBE_OK: max retention (milliseconds) the publisher guarantees for late/reconnecting subscribers. Modeled on HTTP `Cache-Control: max-age`. Note: the prior comment about removing `restart` from the wire is already addressed; the enum was dropped in an earlier commit, and a duplicate `active` now atomically replaces the prior announcement. 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