draft-ietf-moq-transport-22 | published 2026-10-01 | Datatracker — the current revision (165 pages; tag 21:33 UTC, datatracker 21:36 UTC). Named the Seattle interop target, alongside draft-18, at interim-2026-moq-24 (Sep-21). It makes one wire change to the draft-20/21 format: LOCATION_FILTER now carries an explicit Location Filter Type (#1953). So Duke’s Sep-21 “-22 is functionally identical to -20 except the ALPN” holds everywhere except that one parameter.
draft-ietf-moq-transport-21 | published 2026-09-08 | Datatracker — 159 pages; a pure restructuring cut the day of interim-2026-moq-23, “100% wire and semantically equivalent to draft-20” per the editors (15 sentences removed, 31 added, 20 modified, almost all navigational)
draft-ietf-moq-transport-20 | published 2026-08-31 | Datatracker — 158 pages; carries the full July 6 → Aug 31 delta, incl. the Joining-FETCH removal (not purely editorial)
draft-ietf-moq-transport-19 | published 2026-07-06 | Datatracker
draft-ietf-moq-transport-18 | published 2026-05-12
Authors
- alan-frindell (Meta)
- ian-swett (Google)
- suhas-nandakumar (Cisco)
- victor-vasiliev (Google)
Abstract
MOQT is a publish/subscribe protocol that runs over QUIC and WebTransport. It leverages transport capabilities including streams, datagrams, priorities, and partial reliability. MOQT enables content delivery both directly between endpoints and through intermediate relays, achieving scalable low-latency distribution. Despite its name referencing media, the specification emphasizes that MOQT remains content-agnostic and applicable across various use cases (abstract reframing in draft-18 — see discussions-2026-05 for Will Law’s parallel May 12 recharter proposal).
Key Concepts
- publish-subscribe: Core messaging pattern - PUBLISH, SUBSCRIBE, FETCH, REQUEST_OK/REQUEST_ERROR, PUBLISH_DONE
- subgroups-and-objects: Data hierarchy: Track > Group > Subgroup > Object
- relays: First-class relay support for CDN-style distribution
- track-properties: Metadata attached to tracks and objects via Key-Value Pairs
- fill fetch: Fetch-formatted delivery of past Groups when joining a live Track, requested via the
FILL_PARAMETERSsubscription parameter. Replaced Joining FETCH in draft-20 (#1673) — the Joining variant of FETCH and the “standalone” moniker no longer exist. - qmux: TCP fallback via QUIC multiplexing over TLS+TCP
- URI Scheme:
moqt://URI scheme with fragment identifier support (PR #1571)
Version history
draft-22 (published 2026-10-01) — the Seattle interop target
Published Oct-1 (afrind pushed the draft-ietf-moq-transport-22 tag at 21:33 UTC; the datatracker posted it at 21:36 UTC; 165 pages; expires 2027-04-04). Release notes are PR #1965 (afrind, +28/−0, approved by Suhas). It came ten days after interim-24 named it a target and eleven days before Seattle interop opens (Oct-12). Raw text: sources/ietf-drafts/draft-ietf-moq-transport-22.txt.
Why there was a gap. draft-21 was built on a draft-21-retro branch that replayed only the structural moves from the draft-20 tag. Everything non-structural that merged to main in early September (Sep-6 → Sep-11) was therefore held back and lands in -22 instead.
The one wire change: Location Filter Type
LOCATION_FILTER (parameter 0x21) used to carry a Length, and the receiver inferred which optional fields were present from it. In -22 it carries a Location Filter Type (vi64) instead (#1913 + #1953, Swett, closes #1937):
| Type | Fields that follow | Meaning |
|---|---|---|
| 0x00 | none | no filter (e.g. to remove one in REQUEST_UPDATE) |
| 0x01 | StartGroup | relative start (groups before the Next Group) |
| 0x02 | StartGroup, StartObject | absolute start |
| 0x03 | + EndGroupDelta | absolute start with a group end |
| 0x04 | + EndGroupDelta, EndObject | absolute range |
| 0x05 | none | Next Object |
| other | — | PROTOCOL_VIOLATION |
A draft-20/21 decoder will misparse a -22 filter, so moving 20/21 → 22 is a small but real wire change on top of the ALPN bump (moqt-22). Swett explained the timing on the list (Oct-2, permalink): -22 “contains only editorial changes, similar to draft 21, except for changing the Location Filter wire format … Given many implementations haven’t implemented the new Location Filters yet, the editors and authors felt it was better to make the wire format change now.” Mo Zanaty noted on Oct-1 (#899) that multi-range location filters, if the WG ever wants them, would mean bringing the Length field back.
Editorial changes (Appendix A.1)
- Publisher and Namespace Discovery restructured (#1946, afrind, +243/−190, closes #841). It adds a Namespace Prefix Matching section, moves
SUBSCRIBE_TRACKSunder Publishing and Receiving Tracks, and adds a publisher → relay → subscriber ladder diagram. Per the PR, 2,343 of 2,379 sentences are unchanged from -21. - A Fetch semantics section (#1895); Forwarding Preference → Delivery Mode, established by the Original Publisher (#1886, #1891, #1914); the Forward State described as a paused subscription (#1940).
- Definitions of Subscription and Fetch (#1884, #1925); per-request shorthand names such as
SUBSCRIBE_ERROR(#1912); allowed parameters listed per message (#1916). - Largest Object clarifications (#1911, #1918); FETCH_OK’s End Location is inclusive (#1910); extension declaration in SETUP (#1921); the auth-token cache overflow rule (#1927); relay-to-relay out of scope (#1931).
Not in -22: Zero-length Track Names (#1954, approved), INCLUDE_PAYLOAD (#1955), DEFAULT PUBLISHER PRIORITY as a Message Parameter (#1957, approved), the FETCH relative-filter ban (#1960) and Filter Sets (#1894).
How -22 became the target. interim-21 (Aug-14) first named -22 “the next official interop target”. interim-23 (Sep-8) switched to draft-20, and interim-24 (Sep-21) switched back to draft-18 + draft-22, with Duke’s “functionally identical to -20 except the ALPN”. The interim-24 minutes (posted Sep-28) record Swett’s framing that -22 “is planned to resolve minor normative inconsistencies … while remaining functionally wire-compatible with Draft 20”. The Location Filter Type change is the exception. moq shipped a moqt-22 ALPN on the decision day (#3858). See interim-meetings and interop-runner.
draft-21 (published 2026-09-08) — editorial restructuring
draft-21 was cut Sep-8, the day of interim-2026-moq-23 — the “editorial meeting’s output” the interim-2026-moq-21 minutes forecast (draft-20 editorial cut → draft-21 restructuring → draft-22 next interop target). The editors (afrind + ianswett) built it as a pure reorganization and proved it mechanically (from their “[Moq] Draft-21” list post): a draft-21-retro branch from the draft-20 tag replaying only the “exclusively or largely structural moves” (reverting anything non-structural), plus a custom tool that reduces two draft versions to sorted, normalized sentences and diffs them. Result: -21 is “100% wire and semantically equivalent to draft-20” — 15 sentences removed (“obsolete and contradictory to the current consensus”), 31 added, 20 modified (“almost all … navigational pointers or updated section references”). Implementers on draft-20 have no wire work for -21. The interim-2026-moq-23 minutes (posted Sep-9) reframe the pipeline: at Cullen Jennings’s request, the editors will publish draft-21 as the “pure move” (only reordering — done) and draft-22 immediately after with the editorial cleanups/clarifications, so reviewers get clean diffs. So draft-22 is now the editorial-cleanup revision, not the interop target — the earlier “draft-22 = next interop target” framing is superseded, and interim-23 instead set the Seattle Oct interop target to draft-20 (draft-21/22 being wire-identical doc reorganizations of the draft-20 wire; see interop-runner). The restructuring PRs that compose -21 (opened from Sep-1 on, all editorial, no new wire mechanisms):
- “Draft Restructuring Phase I: move-only edits” (#1877, vasilvv, +3138/−3110) — a large section-reordering pass that moves text without changing it, so subsequent substantive diffs read cleanly.
- Rename “Forwarding Preference” → “Delivery Mode” (#1886, ianswett; old mentions removed in #1891) — a terminology change to one of MoQT’s core concepts (how a track’s objects map onto streams vs. datagrams). Implementers and this wiki should begin using Delivery Mode.
- Section restructuring: reorder “Publishing and Receiving Tracks” (#1885/#1893); split out the Range Filter (#1892), Location Filter (#1888) and Track Namespace (#1887) wire formats; add an Authorization Token Compression section (#1882); define “subscription” (#1884) and a Canonical Object Properties section (#1883); error-code/section moves (#1878–#1881) and the carried-over datagram/object-header refactor (#1874, suhasHere). Sep-2 added “Promote Setup Options to their own sections” (#1896); Sep-3 added the error-handling/grease reorder (#1899); Sep-4 added a Document Structure section (§1.1) (#1903) and marked Track Properties mandatory-to-understand (#1900); Sep-5 deleted an incorrect word (#1905, martinduke); Sep-6 hoisted the non-wire FETCH concepts into a new §3.2 Fetch (with Fetch Object Delivery / Gaps in a Fetch Stream / Relay Fetch Handling subsections, a descending-fetch-gap paragraph, and a stale relay-MUST removed) via #1895 “Add FETCH semantics section” and clarified that FETCH_OK’s End Location is inclusive (distinct from the FETCH request’s exclusive “plus 1” field) via #1910 (merged Sep-7, fixes #1748).
- OPEN as of Sep-1: Filter Sets subsection (#1894), Namespace Discovery refactor (#1890), Track-Alias-as-SUBSCRIBE_OK-parameter (#1876, see open questions), and the two structural diagrams carried from draft-20 (#1865/#1866).
- Sep-6 FETCH / error-handling / forwarding clarification wave (afrind; several close long-open issues and several trace back to the Sep 2–4 hackathon relay sweep). Beyond the pure section moves, these touch normative handling: #1915 “Preserve the SUBGROUP_HEADER PROPERTIES bit when forwarding” (fixes #1073, still OPEN as of Sep-12 — the one clarification not yet merged) — a relay carries the upstream PROPERTIES bit over rather than clearing it (clearing it, then receiving an Object with Properties, leaves no legal encoding); the spec answer to the Nokia/imquic relays that were zeroing that bit in interop. #1913 “Add LOCATION_FILTER forms table and error handling” (fixes #1347, merged Sep-10) — a six-form summary table plus new rules: a field past the parameter end or >4 fields is a session error, and an inverted single-group range is rejected with
INVALID_RANGE. #1912 “Add REQUEST_ERROR shorthand names and apply them” (fixes #1722, merged Sep-10). Merged Sep-7: #1914 “Clarify the Original Publisher establishes Delivery Mode” and #1911 “Use Largest Object consistently.” See discussions-2026-09. - Sep-7 pre-interim refactor peak (afrind, ahead of the interim-2026-moq-23 “review the document refactor” slot). One more substantive merge — #1917 “Acknowledge WebTransport over HTTP/2” (+10/−4, fixes #864/#973): scopes the mandatory QUIC DATAGRAM requirement to QUIC/HTTP-3, states what changes when WebTransport runs over HTTP/2 (TCP+TLS), and says MoQT is not defined to run directly over other transports. Alongside it ~15 editorial/clarification PRs opened (#1918–#1932) — e.g. how extensions declare support in SETUP (#1921), how a non-Normal Object encodes Properties in a Subgroup (#1922), defining “Subscription” in Terms (#1925), Client/Server as transport roles only (#1926), renaming the PUBLISH_NAMESPACE field a Track Namespace Prefix (#1930), and relay-to-relay is out of scope (#1931). Most of this batch merged Sep-9–10 (the “draft-22 editorial cleanup” the interim-23 minutes named — 1927 landed Sep-9; 1932 landed Sep-10), leaving only a few OPEN. New open questions: #1934 “Largest Object and the end of group” (vasilvv), #1933 “Option to SUBSCRIBE / SUBSCRIBE_TRACKS with metadata only” (afrind — an interim agenda item), and #1928 “PUBLISH_NAMESPACE and NAMESPACE operate on prefixes” (kixelated). See discussions-2026-09.
- Sep-8 cut + post-interim cleanups (the day of interim-23). draft-21 published 21:08 UTC; release notes are PR #1935 (afrind, +17/−0). Two editorial merges landed on
mainthe same evening — #1926 “Note that Client and Server are transport roles only” (fixes #1217) and #1927 “Scope the auth token cache overflow rule to non-SETUP registrations” — plus Martin Duke’s new issue #1936 “Hidden Malformed tracks.” See discussions-2026-09. - Interim-23 design dispositions (from the minutes posted Sep-9 — recorded by topic; the AI minutes’ PR numbers are unreliable and are omitted): (1) Forward parameter → split — the editorial/terminology change renaming the states to “paused”/“resumed” proceeds, while replacing
forwardwith an unsatisfiable location filter (end < start) and its relay state-tracking go back for more design. The rename half is now merged: #1940 “Call the forwarding state paused” (afrind, merged Sep-11, fixes #1694) — leaves FORWARD itself unchanged and adds a new “Pausing Subscriptions” section; theforward-removal-via-empty-filter part (wording carried from #1825) is explicitly deferred to #1352. (2) Default publisher priority → hop-by-hop message parameter — move it off the immutable object property, remove the “malformed track” error, and investigate restricting priority changes to group boundaries (per-object priority is too costly for audio; mid-subgroup changes break immutability). Related: #1936 (Hidden Malformed tracks) + #1938 “Process REQUEST_UPDATE in order” (ianswett), and a new Mandatory-Track-Properties sub-thread — #1939 (how a publisher learns a peer lacks a Mandatory Track property) + #1941 (do relays propagate unknown Mandatory Track Properties in TRACK_STATUS_OK?), both Duke, Sep-10. (3) FETCH_OK / Fill Fetch alignment → parked until after the Seattle interop (FETCH_OK’send location/end of trackoverlap Fill Fetch’slargest object; Mo Zanaty floatedfirst/last objectstatic track properties for VOD). (4) Overlapping subscriptions → no consensus (bidirectional streams make cancellation races unavoidable; afrind + Luke Curley to work offline). (5) URI scheme relocation — move themoqtURI-scheme definition out of transport into [[moq-discovery|draft-jennings-moq-discovery]] (PR #1901, the one minutes PR number that verifies): mandatory SVCB client support, TLS validation restricted to SAN (ignore CN), and a ban on wildcard certs. See discussions-2026-09, interim-meetings. - Sep-11 editorial follow-ons to the refactor. Two new clarification issues chase corners the Sep-9–10 merges opened: #1942 (Mathis Engelbart) — the Track Namespace Prefix field renamed by #1930 uses the §8.7 Track Namespace encoding, which isn’t one of §9.20’s four defined control-parameter value encodings; should it be added? — and #1943 (Martin Duke) — undefined behaviour for a reserved namespace appearing in a NAMESPACE / NAMESPACE_DONE message (reachable only via a
SUBSCRIBE_NAMESPACEfor the empty namespace), and whether a reserved-namespace PUBLISH/PUBLISH_NAMESPACE should be answeredUNINTERESTEDvsDOES_NOT_EXIST. See discussions-2026-09.
draft-20 (published 2026-08-31)
Submitted to the datatracker Aug-31 at 20:11 UTC; 158 pages. Itemised below from the draft’s own Appendix A.1 (Since draft-ietf-moq-transport-19) — raw text in sources/ietf-drafts/draft-ietf-moq-transport-20.txt.
This is not a purely-editorial revision. The interim-2026-moq-21 minutes forecast draft-20 as “an editorial cut just before the editorial meeting” (draft-20 → draft-21 = the editorial meeting’s output → draft-22 = the next official interop target), and the ~11 PRs that merged on cut day were indeed cleanup. But the revision carries the entire July 6 → Aug 31 window, including several substantial wire changes — above all the removal of Joining FETCH. Implementations moving 19 → 20 have real work to do.
Session and control plane
- Joining FETCH replaced by fill fetch streams (#1673) — the Joining variant of FETCH is removed, along with the “standalone” moniker. A fill is now requested by the new
FILL_PARAMETERSparameter on a subscription, which itself carries a sequence of Parameters (#1868). See joining-fetch. - Location Filter restructured to match the other filter parameters, and the FETCH range now travels in
LOCATION_FILTERinstead of message fields (#1809, Mo Zanaty). PUBLISH_STATE_NOTIFYadded (#1820, afrind) — the strictly-informative subscription-state message.INCLUDE_PROPERTIESparameter added (#1813, #1847).PUBLISHcan carry Subscription Parameters, and AUTHORIZATION TOKEN is never copied fromSUBSCRIBE_TRACKS(#1834, ianswett, closes #1803).- Subscription parameters appear in
REQUEST_UPDATE, notPUBLISH_OK(#1790);FORWARDallowed on aREQUEST_UPDATEforSUBSCRIBE_TRACKS(#1812). SUBSCRIBE_TRACKSParameters are the publisher’s initial Subscription parameters, explicitly communicated in the resultingPUBLISH(#1815, #1869).PUBLISH_DONE: status codeSUBSCRIPTION_ENDEDremoved — a subscription does not end because Largest Object passes the end of the Location Filter (#1833); maximum Stream Count raised to 2^64 − 1 (#1831).- Dead wire elements removed: the
VERSION_NEGOTIATION_FAILEDsession error (#1867, vasilvv), the leftoverUNSUBSCRIBE(#1864, vasilvv), and the requirement for a publisher to retain Largest Location (#1872, vasilvv). - Relays: a relay MUST send an upstream FETCH to at least one publisher (#1804); the draft now discusses the tradeoffs of aggregating downstream filters onto a single upstream subscription (#1735).
moqt://URI: host resolution defined (#1817); REDIRECT ambiguity with an empty Track Namespace and Track Name resolved (#1824); Retry Interval of 0 clarified (#1785); the query component excluded from the MOQT scope (#1855) — see the note at the end of this section.
Data plane wire format and handling
OBJECT_DATAGRAMandSUBGROUP_HEADERtypes are now described asType Flagsbitfields (#1774) — a parser-affecting change for every implementation. ForOBJECT_DATAGRAM, any set bit whose meaning is not specified is aPROTOCOL_VIOLATION, and bit 4 (0x10) is reserved and MUST be zero. ForSUBGROUP_HEADER, bit 4 MUST be 1,SUBGROUP_ID_MODE = 0b11is reserved, and any value ≥ 128 (i.e. needing more than a one-byte varint) is invalid.OBJECT_DELIVERY_TIMEOUTnow starts at the last header byte rather than the first payload byte (#1844, sharmafb, closes #1841).- End of Timed-Out Range added for Objects abandoned when Fill Timeout expires (#1822, afrind).
- Scheduling defined between fill-delivered and subscription-delivered Objects (#1673).
- Beware re-using a Track Alias for concurrent subscriptions (#1856, ianswett, +16/−0, fixes #1795) — afrind asked whether re-use for the same track should also require the previous subscription to be done; Swett revised twice on Aug-21, concluding “I don’t think a subscriber can enforce that MUST”, so the text advises receivers to treat stray objects as an unknown Track Alias instead.
Security considerations
- Preventing Impersonation section added (#1737, #1789).
- Mutual-TLS and authorization guidance expanded (#1786);
moqtURI-scheme security considerations added (#1772). - Security consideration for logging untrusted string fields (#1823, afrind).
- End-to-end object encryption recommended for confidentiality from relays (#1755, afrind, closes #1711) — points implementers at moq-secure-objects.
Notable editorial changes
- Range Filters section clarified for readability (#1851, Suhas).
- The recommended track-name encoding is noted as not guaranteed filename-safe (#1863).
- LOC and Secure Objects entries fixed in the provisional Property registry (#1807, #1818, #1848).
- Typo / word-choice / punctuation pass (#1862, afrind, +59/−59), plus the release-notes PR (#1873, afrind).
Left OPEN at the cut and carried into the draft-21 restructuring: the two structural diagrams (Groups/Subgroups/Objects #1866; MOQT scope #1865, vasilvv) and the §11 datagram/object-header editorial refactor (#1874, suhasHere).
Note on #1855 and the word “scope”: this excludes the URI query component from the MOQT scope, which is the draft’s cache-key term — “two connection URIs that differ only in their query components identify the same scope.” The query component is still part of the URI grammar (moqt-URI = "moqt" "://" authority path-abempty [ "?" query ]) and is explicitly visible to the relay that terminates the client’s connection. It is not “outside MoQT’s purview”.
draft-19 (published 2026-07-06)
Cut at the interim-2026-moq-18 (approved by Ian Swett). Itemised below from Appendix A.2 (Since draft-ietf-moq-transport-18). Not merely an editorial pass — draft-19 is the revision where Range Filters landed:
Session and control plane
- Range Filters added — can filter Objects out of Subscriptions and
SUBSCRIBE_TRACKS(#1765, Mo Zanaty). This is the contested feature the IETF-126 consensus call later moved toward a separate draft. MAX_REQUEST_UPDATESSetup Option plus theTOO_MANY_REQUEST_UPDATESerror (#1613).- Multiple concurrent subscriptions per Track allowed (#1775) — closes the draft-18 gap Luke Curley raised in May, where SUBSCRIBE-same-track-twice-with-different-filters was illegal and therefore structurally blocked subscriber-controlled per-layer SVC priority.
GROUP_ORDERmoved fromPUBLISH_OKtoSUBSCRIBE_TRACKS(#1777).PUBLISH_BLOCKEDrenamed toPUBLISH_SKIPPED(#1779).- Request ID removed from
GOAWAY(#1623) — reversing #1559, which had added it one revision earlier in draft-18. Session vs. per-request GOAWAY migration clarified (#1787). - FIN vs. RST/STOP_SENDING semantics defined on request streams (#1698).
- An unexpected
REQUEST_UPDATEis a session error (#1784). - Forward State handling updated for relays (#1782); authorization trust model clarified for namespace subscriptions (#1656); namespace discovery and NAMESPACE sending clarified (#1710).
Data plane wire format and handling
- Delivery timeouts are both Track and Object Properties (#1476).
- Object Status payload rule made extensible via an IANA registry (#1760).
- Datagrams take precedence in cross-forwarding-preference scheduling ties (#1780).
- Relay exception for reordering or dropping Objects removed (#1762).
- Relay processing rules specified for known Track Properties (#1771); Immutable Properties recommended for relay-visible, unmodifiable data (#1759).
Notable editorial changes
- Control-message
Payloadfield renamedMessage Body(#1756). - Group and Subgroup terminology and the object model clarified (#1708).
draft-18 (published 2026-05-12)
Key wire/spec changes from draft-17 (full list in Appendix A.3 of the -20 text):
- Remove Required Request ID (PR #1615, materialises the Apr 27 interim consensus) — Required Request IDs are removed; Request IDs remain for individual requests — at the time, Joining FETCH and GOAWAY. Both of those uses are since gone: draft-19 removed the Request ID from GOAWAY (#1623) and draft-20 removed Joining FETCH (#1673).
- Add FIRST_OBJECT bit to SUBGROUP_HEADER type (PR #1618) — bit 6 (0x40) signals the subgroup contains the first object published by the original publisher; type byte expands
0b00X1XXXX→0b0XX1XXXX(still 1-byte varint). - Forbid relays from lying about LARGEST_OBJECT (PR #1621).
- Split DELIVERY_TIMEOUT into two timeouts (PR #1605) —
OBJECT_DELIVERY_TIMEOUT(a more precise replacement forDELIVERY_TIMEOUT) plus a newSUBGROUP_DELIVERY_TIMEOUT(covers subgroups fully queued but not fully delivered). Closes the “DELIVERY_TIMEOUT is unimplementable” issue. - Improve Startup Latency and 0-RTT (PR #1544) — new sections on reducing startup latency / 0-RTT flow with WebTransport.
- Per-request GOAWAY (PR #1617) — GOAWAY on request streams migrates individual requests; a zero-length URI causes the endpoint to re-issue the request on the specified URI session.
- Improve Security Considerations (PR #1625) — rebases and extends magnus-westerlund’s long-parked PR #1455.
- Clarify definition of scope (PR #1629).
- Unified
moqt://URI scheme for both QUIC and WebTransport (PR #1486), with fragment-identifier support (PR #1571). SUBSCRIBE_NAMESPACEsplit intoSUBSCRIBE_NAMESPACE+SUBSCRIBE_TRACKS(PR #1542) — the origin of theSUBSCRIBE_TRACKSmessage that later revisions keep reshaping (it appears 46 times in the -18 text and not at all in -17).REDIRECTadded for request errors and established subscriptions (PR #1534).PUBLISH_OKdemoted — the message type is removed and becomes aREQUEST_OKalias (PR #1611); textual aliases forREQUEST_OKdefined per request type (PR #1610).FILL_TIMEOUTparameter (PR #1490) and Track Properties onREQUEST_OK(PR #1576); mandatory-to-understand track extensions (PR #1509).- Session-Level Tracks reserved namespace (PR #1562); own tracks excluded from
SUBSCRIBE_NAMESPACE(PR #1596). - Data-plane encoding: Object ID and Group ID delta-encoded in FETCH responses (PR #1586), 7-byte varints and non-minimal encodings allowed (PR #1595), padding streams and datagrams (PR #1475), and the session closes when delta encoding wraps (PR #1560).
- Stream reset codes generalised to all request streams and aligned with
PUBLISH_DONE(PR #1606); the session is no longer closed for unknown errors (PR #1561). - Abstract and introduction rewritten (PR #1556), reframing MOQT as content-agnostic despite the “media” name.
draft-17 (published 2026-03-02)
Significant changes from draft-16:
- Unidirectional control streams for 0-RTT subscribe capability
- SUBSCRIBE_NAMESPACE split into two messages: SUBSCRIBE_NAMESPACE (namespace info) and SUBSCRIBE_TRACKS (PUBLISH notifications)
- Subscription filters moved to be a Param (PR #1590)
- Track Properties added to REQUEST_OK (PR #1576)
- Allow 7-byte varint and non-minimal encodings (PR #1595)
- Editorial: consistent use of “MOQT” for protocol references (PR #1597); “message” instead of “frame” (PR #1587)
Recent Highlights
Day-by-day WG/PR activity lives in the wiki log; this section keeps only durable milestones.
- Fast first-impl turnaround for draft-18: within ~6 days of the May 12 publication, three distinct codebases had shipped it (moq, imquic, mondain/moqxr) — the fastest spec → first-impl turnaround the wiki has tracked.
- London interim (June 11–12,
interim-08/interim-10) confirmed several directions: keep the object-ID filter; fill-fetch replaces joining-fetch;SWITCH_FROMhard mode; remove Request ID from GOAWAY; PUBLISH_DONE precedes FIN on response streams; track properties stay immutable (priority updates via the data plane); draft-18 is the Vienna interop target. - DTS/SWITCH consensus (June 11): base-spec integration lacked rough consensus, so Dynamic Track Switching is adopted as a separate WG extension,
draft-ietf-moq-dts4moq(Will Law), with the door left open to later merge into MOQT. See switch-abr. - June 22 interim (
interim-17) renamed DTS → Sender-Side Track Switching (SSTS), made the switching algorithm an extensible IANA-registered numeric ID with a mandatory “Algorithm Zero”, and removed the per-set DDoS-protection negotiation properties (rely on auth tokens + existing relay protections). See interim-meetings. - draft-19 published (2026-07-06): an editorial clarification pass following Cullen Jennings’s ~59-issue read-through of draft-18 (June 15); issues were converted into PRs under a phased review, with “Design” PRs needing two weeks open + four-editor stamps to make the July-6 cut.
- IANA early review of draft-19 (2026-07-16): IANA (Amanda Baber, ticket #1456083) reviewed the draft ahead of IETF 126 and returned a pre-Last-Call punch-list — the IANA Considerations section is incomplete; the new registries need a named group (“Media over QUIC Transport”), RFC 8126 designated-expert guidance, protocol-differentiated names, and explicit numeric bounds; and the allocations must be reconciled against inconsistent/duplicate registry values requested by loc, secure-objects, and msf. This was one of five reviews Baber filed the same morning — companion early reviews landed for loc-03 (#1456079), msf-01 (#1456080), privacy-pass-auth-03 (#1456081), and secure-objects-01 (#1456082), all flagging the same defect class (registry name/reference mismatches vs the registries transport-19 establishes + missing RFC 8126 boilerplate) — i.e. IANA’s cross-document verdict on the whole MoQ set. Tracked in issue #1814 (afrind); the msf side is msf #191 (Will Law), with Will Law’s cleanup PRs msf #192–#195 opened July 17. Reframes the “Path to WGLC” work as enumerated registry/IANA items rather than open protocol design.
- WGLC-prep security/editorial cluster (2026-07-21): during IETF 126 week the editors merged a six-PR hardening pass on the editor’s copy — no new published revision (transport-19 stands) — closing security-considerations and registry-hygiene gaps: impersonation-prevention detail (#1789, Suhas),
moqt://URI-scheme security per RFC 7595 §3.7 (#1772), a hex-enumeration→bitfield code-point syntax rewrite (#1774), expanded mutual-TLS security considerations (#1786, afrind), a REDIRECT retry-interval-0 clarification (#1785), and FORWARD on a REQUEST_UPDATE for SUBSCRIBE_TRACKS (#1812, sharmafb). - IETF-126 Monday session — chairs shape the Path to WGLC by trimming the core (2026-07-20; minutes posted 2026-07-22, revised to -01 and formally circulated for WG review by Magnus Westerlund on 2026-07-29 with corrections due ~Aug 12): this Monday-slot document is the only IETF-126 MOQ minutes doc — the Thursday (July 23) and Friday (July 24) sessions ran but were never separately minuted. The WG’s headline decisions were about scope reduction to reach Last Call, not new design. (1) Chairs called consensus to move range filters and Sender-Side Track Switching (SSTS) into separate drafts, out of the core transport document — Cullen Jennings formally objected, citing a roughly 50/50 room split, and the Area Director affirmed the chairs’ right to call consensus (a contested but standing determination). (2) Management, metrics, and diagnostics considerations spun off into a new applicability/manageability document in its own repo — Alperen Temel volunteered to write the initial diagnostics/relay-management draft. (3) The chairs framed transport stabilization as the critical blocker — “if transport does not ship, none of the other WG drafts can progress” — with secure-objects queued for WGLC once the shared IANA registries settle. Editorial WGLC-prep also continued on the editor’s copy: afrind opened #1824 (REDIRECT empty-namespace/name ambiguity), #1823 (security consideration for logging untrusted string fields), and #1822 (Timed-Out gap status for expired Fill Timeout) on July 22, and Suhas opened #1825 (replace the FORWARD parameter with Range-Filter-based pausing). afrind’s 1822 all merged July 30 — the most editor’s-copy content movement since the pre-Vienna push — alongside a new #1817 (define host resolution for
moqt://URIs, tightening the URI semantics michalhosna’s issue #1835 reopened) and Mathis Engelbart’s one-line #1836 (CLIENT_SETUP→SETUP naming fix); Suhas’s #1825 stays OPEN. transport-19 stands. - First draft-20-bound merges land (2026-08-13): after the Aug-10 virtual interim (interim-2026-moq-21) walked the core-transport PR set discussion-only, the editors landed the first batch toward draft-20 on the editor’s copy — the Location Filter redesigned to match the design of the other filters (#1809, Mo Zanaty), the new PUBLISH_STATE_NOTIFY strictly-informative control message (#1820, afrind), a “recommend Secure Objects for confidentiality from relays” security note (#1755, afrind — closes issue #1711), and a “first byte of object” fix for payload-less objects (#1844, sharmafb — closes issue #1841). No new revision published — transport-19 still stands on the datatracker; PR #1834 “PUBLISH can contain Subscription Parameters” (Ian Swett, +22/−13) then merged 2026-08-21 — the second draft-20-bound batch — letting
PUBLISHcarry Subscription Parameters and closing issue #1803 (“How do you know what Parameters a PUBLISH has?”); it adds no normative MUST, so a subscriber falls back to defaults. Of the remaining filter/fetch/switch redesign PRs, #1673 (fill fetch) and Suhas’s #1851 (Range Filters readability) both landed in the draft-20 cut — both appear in the published Appendix A.1; #1674, #1825, #1852 and #1853 are absent from it and stay OPEN. The interim-2026-moq-21 minutes (posted 2026-08-14) frame this as the start of an editorial cadence: draft-20 = a purely-editorial cut just before the editorial meeting; draft-21 = the editorial meeting’s output; draft-22 = the next official interop target. (The “purely-editorial” part did not hold — the published draft-20 also carries the fill-fetch replacement of Joining FETCH and several other wire changes; see the draft-20 section above.) The minutes also recorded a lean toward rejecting the updatable-default-publisher-priority PR #1770 (“error-prone … probably not needed”) and consensus that the URI query component does not contribute to the MoQT scope (the draft’s cache-key term — not “out of MoQT’s purview”; the query stays in the URI grammar and stays visible to the terminating relay) — producing afrind’s PR #1855 (“Exclude URI query component from MOQT scope,” Fixes #1835), while Will Law’s FETCH-pacing proposal (fetch_pacing_supported+ logarithmicpacing_rate) continues as an external extension. - Consensus call on the draft-18 → draft-19 diff opened (2026-09-04, concerns due 2026-09-18): co-chair Martin Duke opened a formal consensus call on the draft-18 → draft-19 diff on the MOQ list (Sep-4 20:58 UTC, permalink) — “This begins the consensus call for the diff between draft-18 and draft-19. Please file issues in github on any concerns on or before 18 September 2026.” Note the consensus process runs behind the editors’ cut cadence: draft-19 was published Jul-6, draft-20 shipped Aug-31, and the draft-21 restructuring is already underway, so this call retroactively settles the -19 delta (Range Filters #1765,
MAX_REQUEST_UPDATES#1613, multiple concurrent subscriptions per Track #1775 — see the draft-19 section above) rather than gating a new revision. (Verified real via a raw archive fetch — HTTP 200, valid gmail DKIM,From: Martin Duke— against a fabricated-message-id control returning 404; the wiki has twice before had a subagent hallucinate a “Martin Duke consensus call” thread.) CONCLUDED 2026-09-23 (Duke, 16:23 PDT, permalink): “This concludes the consensus call on draft-19 changes.” One sentence, no objections recorded in the closing message — so the -19 delta, Range Filters included, is now formally settled even as the WG separately plans to move filters into their own draft. - Consensus call on the draft-18 content closed (opened 2026-07-06, concluded 2026-07-24): co-chair Martin Duke ran a formal consensus call on the draft-17 → draft-18 diff, asking the WG to file any resulting issues “no later than 20 July” with “subsequent objections [facing] a higher bar.” He closed it out on-list July 24 14:14 UTC — “This concludes the consensus call on draft-18. Any issues with the -17/-18 diff should be in Github by now.” — formally settling the -18 baseline as the WG works the Path to WGLC. (This on-list thread was mistakenly dismissed as a fetch artifact in two prior wiki updates; it is verifiably real — message, corrected here.)
- MOQT-over-QMux ruled out of the WG’s current charter (chairs + AD, June 17): the TLS+TCP fallback proceeds as an individual draft until a recharter, scoping the QMux-framing work out of the transport draft. See qmux.
- AUTH design team (formed June 12) produced the WG’s first new draft since transport-18 — [[moq-c4m|
draft-ietf-moq-c4m-01]] (Common Access Token authorization).
Open design questions
Substantive topics still being worked as this page is written:
-
Fill-fetch vs Joining FETCH (RESOLVED in draft-20): PR #1673 (revising Subscription-Fill #1642) merged into the draft-20 cut — Joining FETCH and the “standalone” moniker are gone, replaced by
FILL_PARAMETERSon a subscription plus fill fetch streams. Cullen Jennings had argued for keeping Joining FETCH pending operational experience and flagged error-delivery, duplicate-object and nested-FILL_PARAMETERSconcerns; those implementation concerns are now live questions against shipped text rather than objections to a proposal. See joining-fetch. -
SSTS (Sender-Side Track Switching): the “Algorithm Zero + IANA registry” extension design (PR #1638), meant to be validated by more than one algorithm before draft-19. At IETF 126 (July 20) the chairs called consensus to move SSTS into a separate draft, out of core transport (contested by Cullen Jennings; AD affirmed the chairs) — so it is now slated to leave the transport document. Re-opened as a formal question (2026-09-28): the chairs’ “Draftification” message (permalink) announces a coming consensus call on whether SSTS and top-N (#1830) belong in a separate expansion draft or in core MOQT. The message takes three things as given: the WG “already has rough consensus that it will complete the work in some form”, both features are optional (each sits behind a Setup option that can be zero), and the question is “one RFC or … multiple RFCs”. The chairs ask three things: does being in core get a feature implemented, does splitting help or hurt comprehension, and is a feature easier to revise as a smaller RFC? List discussion runs to Oct-13, and the call follows “soon afterwards”. This is effectively the second poll Law asked for on Sep-21. See switch-abr.
-
Range filters: re-adding location-based subscription filters (Mo Zanaty’s PR #1765). Slated to move into a separate draft per the contested IETF-126 consensus call — the least-wanted part of the draft-18→19 delta (Luke Curley won’t implement them; imquic ignores the property filters). In the interim, Mo Zanaty’s Location-Filter redesign to match the other filters’ shape merged Aug-13 (#1809, toward draft-20), while Suhas’s #1825 (July 22) — replacing the FORWARD parameter with Range-Filter-based pausing — stays OPEN.
-
Top Tracks Filter × SSTS/ABR interaction: how the Top-Tracks-Filter (PR #1830) actually combines with SSTS (or any ABR algorithm) is unresolved. Ian Swett’s July-27 list thread “Top Tracks and SSTS (or ABR in general)” (permalink) argues ABR is essential for the video-conferencing use case and asks four concrete mechanism questions the current design doesn’t answer: how to send the initial
SUBSCRIBE_TRACKS(a Track-Property-Filter for the ideal resolution combined with Top Tracks?), how the focal viewport gets higher priority when deciding which feed to downswitch, how a client-pinned non-default feed is prioritized, and whether any demo (even simulated) shows the two working together. He notes Google Meet’s production solution is “sufficiently complex I can’t summarize it” and doubts MoQ will match it soon. Two implementers replied July 28 with a converging “discovery then selection” model: Yu You (Nokia) framed it as a two-step pipeline — the Top-N filter answers “what” (evaluate a namespace’s tracks by property value, promote the N highest, publisher subscribes upstream to all N) and SSTS answers “how” (apply the switching algorithm, e.g. a bandwidth threshold, to forward exactly one; the relay holds upstream to all N alternatives but sets downstream forwarding to 0 for the unselected, giving “Top-1 delivery” without overdelivery/congestion, and a demoted track leaves the switching set). Will Law (Akamai) cast Top Tracks as a discovery mechanism likeSUBSCRIBE_NAMESPACE(clients assign the resulting tracks to switching sets via aSWITCHING_SET_ASSIGNMENTparameter onPUBLISH_OK), argued SSTS entry will lean onSUBSCRIBE_NAMESPACE+ plainSUBSCRIBEmore than dynamic Top-Tracks selection, and floated unifying the two as one filter framework — rename Top Tracks toTRACK-FILTERS, make SSTS parameters (rank, weight, throughput threshold) reserved track properties, and add a flag to “apply SSTS to the filtered tracks.” Still open; Swett’s demo-existence question (does any Top-Tracks + SSTS demo exist?) is unanswered. Top-N’s own placement (core vs. expansion draft) is now part of the chairs’ Sep-28 “Draftification” call, alongside SSTS — see the SSTS entry above. -
Subgroup-start signalling: draft-18 shipped the FIRST_OBJECT bit (PR #1618), but the list debated alternatives (Subgroup ID == first Object ID; Luke Curley’s per-subgroup counter for cache-gap detection).
-
Compression layering: whether compression belongs at the transport, MSF/streaming-format, or Full-Track-Name layer, and hop-by-hop vs end-to-end semantics. See moq-dev.
-
7-byte varint / non-minimal encodings: allowed since draft-17 (PR #1595), but flagged as a footgun in the draft-19 read-through.
-
PUBLISH_STATE_NOTIFY (formerly proposed as SUBSCRIPTION_STATE_UPDATE / PUBLISH_NOTIFY): afrind’s new strictly-informative control message to notify subscription state — PR #1820 MERGED 2026-08-13 into the editor’s copy (toward draft-20). Still open is the related question issue #1821 (Otto Hermann): what a subscriber is entitled to observe after an Object becomes unavailable — both touch draft-19’s clarified subscription-state destruction timing.
-
FETCH and REQUEST_ERROR encoding: Mathis Engelbart’s issue #1837 (July 31) raises an encoding question on FETCH and REQUEST_ERROR. Reactivated Aug-20/21: afrind posted a “reminder to chime in if you want this change,” and Martin Duke staked out a third position (Aug-21) — “I would prefer three message types to the status quo, but moving joining fetch to a SUBSCRIBE parameter is superior to both.” That ties this encoding question directly to the fill-fetch redesign in #1673 — which has since merged in draft-20, so Duke’s preferred “joining fetch as a SUBSCRIBE parameter” is now essentially what the draft does. Still no PR on the encoding question itself.
-
Track Alias re-use (RESOLVED in draft-20): Ian Swett’s PR #1856 (opened Aug-20, +16/−0, fixes #1795) adds guidance on re-using a Track Alias for a different Track. afrind asked whether re-use for the same track should also require the previous subscription to be done; Swett revised twice on Aug-21, concluding “I don’t think a subscriber can enforce that MUST” and instead advising receivers to treat stray objects as an unknown Track Alias. Merged Aug-31 in the draft-20 cleanup cut. Follow-on (Sep-1): Swett’s issue #1875 “Forcing SUBSCRIBE to always use Track Alias is becoming complex” reopens the tension — the always-Track-Alias model is accreting edge cases — with OPEN PR #1876 proposing Track Alias be returned as a SUBSCRIBE_OK parameter instead of mandated on every SUBSCRIBE. Unresolved as the draft-21 restructuring settles.
-
Should
NAMESPACEcarry parameters likePUBLISH_NAMESPACE?: Luke Curley’s issue #1800, discussed at the Aug-24 virtual interim (interim-2026-moq-22). Outcome: the direction is to extendNAMESPACE, not to add a separatePUBLISH_NAMESPACEmessage — Ian Swett opened PR #1858 “Add Parameters back to NAMESPACE” (+7/−0, Aug-24, Fixes #1800) minutes after the session; it is OPEN, not yet merged. The adjacent issue #1854 (“to PUBLISH_NAMESPACE or to not PUBLISH_NAMESPACE”, also Curley) remains BLOCKED. The interim-22 minutes (posted Aug-31 / announced Sep-1) confirm the decision: add Parameters toSUBSCRIBE_NAMESPACE, restricted to unilateral signaling — noREQUEST_UPDATE. See interim-meetings. -
Metadata scope between Track and Object: michalhosna’s issue #1857 (opened during the Aug-24 interim) observes that MoQT has Track-scoped metadata (Track properties) and Object-scoped metadata (object parameters) but nothing scoped to a Subgroup or Group — and that emulating a group/subgroup scope via object parameters (e.g.
SUBGROUP_DELIVERY_TIMEOUT/OBJECT_DELIVERY_TIMEOUT,PRIOR_GROUP_ID_GAP) is awkward and error-prone. No PR yet, but two concrete inputs arrived in late September: Swett (Sep-25) floated a “Default Properties” block in the subgroup header, and Steven Riedl (Pluto TV, Sep-29) supplied a use case. A mid-group joiner needs ad-break state (break id, remaining duration, resume group, creative id and offset) before it renders its first frame. Pluto TV carries that in a side track today, “because object 0 is the only other place for it, and a mid-group joiner or a subscriber with a location filter never sees object 0.” He added that FETCH would need the same block. michalhosna (Sep-30) widened the problem: relays routinely subscribe mid-group and never see object 0, soSUBGROUP_DELIVERY_TIMEOUTandOBJECT_DELIVERY_TIMEOUTare effectively broken, because a mid-group relay silently falls back to the Track value. He wants subgroup-level metadata in the data plane and says a Default Properties block would not solve it. -
Updatable PUBLISHER_PRIORITY (PR #1770) — now with a rival (PR #1957): Swett’s PR #1957 (Sep-25, +24/−16) makes
DEFAULT PUBLISHER PRIORITYa Message Parameter rather than a Track Property, fixing issue #1270 and offered explicitly as an alternative to #1770. PR #1770 would let a publisher change its priority mid-stream. Both the Aug-10 interim and the Aug-24 interim leaned toward rejecting it — few in the WG (zero in the Aug-10 room) found the savings worth the machinery. The list debate then reopened it: Cullen Jennings (Aug-24) split the PR into allowing priority changes — which he supports (e.g. a conferencing bridge raising the active-speaker video track above the other feeds) — and eliminating race conditions, which he agrees need not be solved because relay priorities are imprecise anyway. afrind replied Aug-26 (permalink) clarifying the savings are at most one byte per datagram/subgroup (not the “2-3 bytes” Cullen cited) and proposing to gate the priority-change feature behind a SETUP opt-in or move it to an extension document — while insisting the PR’s two base-draft changes (moving Default Publisher Priority back from a property to a parameter, and relaxing the malformed-track rules around priority) must land in the base draft regardless. The thread continued Aug-27, shifting from whether to how: Suhas Nandakumar (permalink, 03:45 UTC) backed both allowing priority changes and relays using them for compression, agreed the interim sentiment was not to chase a perfect race-avoidance solution, and floated a NOTIFY to inform subscribers of a change; afrind (permalink, 15:06 UTC) argued REQUEST_UPDATE beats PUBLISH_STATE_NOTIFY here — the REQUEST_OK tells the publisher exactly when it is safe to drop explicit per-object priority and resume compressing — and that including LARGEST_OBJECT when changingDEFAULT_PUBLISHER_PRIORITYlets a receiver reconstruct priority cheaply; and Victor Vasiliev (permalink, 15:31 UTC) stayed skeptical of the whole scheme, framing three mutually-exclusive costs (one byte per datagram [the status quo] vs a consistent shared view vs QPACK-style update complexity), defending the status quo as “the sweet spot,” and warning that parties lacking a consistent priority view will cause rare, hard-to-debug active-speaker-detection failures. Still OPEN, no merge. -
PUBLISH_DONEStream Count vs. fill fetch streams (Slack, Sep-26): afrind asked in#moq— “Does PUBLISH_DONE’s Stream Count include fill fetch streams?” — and answered himself the same day: “I tried ‘no’ but now I’m trying ‘yes’ and I think that’s going to be better.” A real gap in draft-20’s text:PUBLISH_DONE’s Stream Count predates the fill fetch streams that #1673 introduced, and the draft does not say whether they count. RESOLVED — the text already exists (Sep-28): Steven Riedl pointed out that draft-21 §3.4 already defines Stream Count as the number of data streams opened for the subscription “including any fill fetch streams”. He added that moq-dev’smoq-relaycounts that way too, including a fill stream it opens and then resets because it can’t serve the range. afrind: “lol I wrote that text and didn’t remember that I did.” No spec change needed. -
Location Filter as an enum (PR #1953, RESOLVED in draft-22): Swett’s Sep-24 PR (+22/−26) fixing issue #1937 — the Location-Filter Length field becomes an enum, the outcome Jennings and afrind converged on around interim-24 (“a no brainer”). Approved by vasilvv, afrind and Suhas; merged Oct-1 and shipped the same evening as the one wire change in draft-22 (see the draft-22 section above).
-
INCLUDE_PAYLOAD— subscribe to headers without payloads (PR #1955, OPEN): Swett’s Sep-25 PR (+21/−5) fixing issue #1933. Adds anINCLUDE_PAYLOADparameter (0x36) toSUBSCRIBE/FETCH/SUBSCRIBE_TRACKSso a subscriber can request object headers and metadata without payloads, plus anObject Payload Omitted(0x1) Object Status for publishers to signal the omission explicitly. The wire realisation of the “HTTP HEAD” analogy from the Sep-20/21 triage; the motivating use case was top-N fan-in. afrind prefers a different shape (Sep-28): “leave the original Payload Length but signal in the data plane that the payloads are not present. This more clearly matches HEAD (Content-Length is present).” No approvals yet. -
Zero-length Track Names (PR #1954, OPEN): Swett’s Sep-25 PR (+4/−2) fixing issue #1636 — a Track Name MUST have length > 0, mirroring the Track Namespace Tuple rule, with a
PROTOCOL_VIOLATIONotherwise except where a namespace-scoped request (e.g.REDIRECT) says otherwise. It has two approvals (Jennings Sep-25, afrind Sep-28) but also an open objection from Suhas, who is “not sure what is it buying” (Sep-26) and asks “why to force that to implementors” (Sep-28). afrind’s answer is “clarity for reading logs and a reduction of edge cases”, and he asks for a use case that a_track name can’t satisfy. Still open on Oct-2 and not in draft-22. -
Relays can report a stale Largest Object (issue #1958, Sep-27): kidq330 found this by model-checking draft-21 in Quint, the first formal-methods finding the wiki has recorded against MOQT. A relay’s upstream subscription is paused at (0,0) while the origin publishes (1,0). A new downstream SUBSCRIBE then gets
SUBSCRIBE_OKcarrying the stale (0,0), so the subscriber never learns it has to FETCH (1,0). A fill does not help either, because its range is bounded by the same stale value. The bug reproduces in a moxygen relay unit test. afrind wants text that forbids the stale value, notes that “the relay could benefit from being able to subscribe upstream to metadata only” (which ties it toINCLUDE_PAYLOADabove), and expects the same problem with range/property filters and upstream delivery timeouts. Swett (Sep-29): “need new text that says you can’t send a Largest Object that might be stale.” afrind (Oct-1): “I think we know what to write, let’s make a PR to have something to discuss with the wg in Seattle.” No PR yet. -
No relative Location filter on a standalone FETCH (issue #1959 → PR #1960, OPEN): afrind, Sep-29: “in a standalone fetch there’s no subscription to anchor to, so what does it even mean to say FETCH -4?” A subscriber wanting “the last N groups” should use
REQUEST_UPDATE+FILL_PARAMETERSor compute an absolute range. The PR (+3/−0) makes a relative filter on FETCH aREQUEST_ERRORwithINVALID_RANGE. The premise is now in doubt (Oct-1): “Ian points out that the End of a fetch might also need a live Largest Object. If that’s true, maybe it is ok that the beginning also does?” The PR has no reviews and is not in draft-22. -
PUBLISH_SKIPPEDwording, and the namespace-discovery restructure (PR #1946, merged Oct-1 into draft-22; issue #1961 open): afrind’s restructure of Publisher and Namespace Discovery (+243/−190, fixes #841) givesSUBSCRIBE_TRACKSits own section. Suhas reviewed it on Sep-28, afrind revised it on Sep-29, and Swett re-approved (“Still LG”). The review pinned down whatSUBSCRIBE_TRACKSis for: the subscriber doesn’t know the exact track names, doesn’t know when publishers or tracks will arrive, or wants only tracks with certain Track Properties. It also settled that joining from a resultingPUBLISHgoes throughREQUEST_UPDATE, becausePUBLISH_OKno longer carriesLOCATION_FILTERorFILL_PARAMETERS. The one loose end became #1961: thePUBLISH_SKIPPED-on-reconnect sentence, which afrind keeps because otherwise “Martin is going to file an issue that relays need infinite state”. Swett misread it at first and says it would read more clearly as “Original Publisher.” vasilvv approved #1946 on Oct-1 and afrind merged it minutes later. On #1961 afrind is “inclined to close with no action”, since the text already says a publisher MAY send a newPUBLISHafter reconnecting. -
FILL_PARAMETERSwithSUBSCRIBE_TRACKS(issue #1962, Sep-30): Miniero hit this while implementing draft-20/21 in imquic. It is unclear how a fill works when tracks arrive viaSUBSCRIBE_TRACKS. afrind (Oct-1): the publisher should act as if aSUBSCRIBEhad carried the fill parameters. It sendsPUBLISHechoing them and opens a fill fetch stream. He agrees the text is unclear and is “not sure if it actually will work.” -
Which parameters are valid where (issue #1963, issue #1964, Oct-1): Duke points out two gaps.
SUBGROUP_/OBJECT_DELIVERY_TIMEOUThave no restriction on whichREQUEST_UPDATEtargets they apply to, and “any SUBSCRIBE parameter is valid in SUBSCRIBE_TRACKS” admits nonsense such asRENDEZVOUS_TIMEOUT. He proposes three parameter/message tables. He also notes that every request can carry AUTH but most_OKmessages can’t carryEXPIRES. afrind agreesEXPIRESshould be legal in all_OKmessages, but he finds a full table large and of low value. Both issues are labelled Needs PR. -
Pre-Seattle triage (Oct-1): afrind labelled three issues BLOCKED with a “discuss in Seattle?” prompt:
- NEW_GROUP_REQUEST with a far-future Group ID (#1948).
- Interaction of the pause mechanisms (#1889). He asks whether it belongs in core or in the Top-N/SSTS extension documents.
- Payload-compression properties (#1850). Suhas suggests MSF registers them in the MOQT registry while the definition stays in MSF.
He also recorded several directions in comments:
- On a duplicate cached object (#1703): discard the new object and don’t update the cache.
- On request IDs (#1952): replacing them with QUIC stream IDs “ship sailed many years ago”, and he would soften the duplicate-detection requirement.
- He floated splitting UNKNOWN into transient and permanent (#1704).
- On multiple ranges in one FETCH (#899), Zanaty argues range filters plus fill fetch already cover the need. afrind replies that the closest available is
SUBSCRIBE+ n×REQUEST_UPDATE+FILL_PARAMETERS.
-
Signalling equal-priority data — interleave vs serial (issue #1859, CLOSED 2026-09-25): issue #1859 (sharmafb, Aug-26) asks how a publisher indicates that two data streams of equal priority should be interleaved rather than delivered serially — MoQT’s priority scheme orders unequal priorities but leaves the equal-priority interleaving behaviour unspecified. Adjacent to the PUBLISHER_PRIORITY discussion above. Closed 2026-09-25 without a PR.
-
Atomic subscription bundles (issue #1860): issue #1860 (sharmafb, Aug-28) gauges interest in an extension for atomic subscription bundles — a way to subscribe to a set of tracks as a single unit rather than issuing independent SUBSCRIBEs. New, no PR yet; a request-for-interest issue.
-
End-of-Range indicators — §11.4.4.2 (issue #1861, CLOSED — agentic output): issue #1861 (tobbee, Aug-30) — surfaced while migrating the Eyevinn stack to draft-18 (see moqlivemock/moqtransport) — asked the WG to clarify §11.4.4.2’s End of Range indicators (that the Group/Object IDs they carry are absolute, and that an End-of-Range object carries no Object Payload Length). afrind closed it as “agentic output” on Aug-31, not on the merits: “This repo is maintained and consumed by humans and we would prefer not to digest agentic output. If you would like to use agents to help you file issues, please add the following prompt: ‘File the issue in the style of the last several issues filed by afrind or ianswett.‘” — the same AI-generated-content crackdown afrind flagged on Slack the same morning (see discussions-2026-08). Verified against the published text (Sep-2): the two gaps the issue named do persist verbatim through draft-20. §11.4.4.2 has said since draft-18 that “the Group ID and Object ID fields are present. Subgroup ID, Priority and Properties are not present,” and defines how a following Object resolves its “prior Object” fields — but it never states whether those Group/Object IDs are absolute or delta-encoded (the surrounding FETCH format does delta-encode them, #1586), and it says nothing about Object Payload Length either way. draft-20 did touch the section, but only to add a third flavour —
0x20CEnd of Timed-Out Range (#1822), joining0x8CEnd of Non-Existent Range and0x10CEnd of Unknown Range. So the clarity question stands unresolved on the merits; re-filing in the WG’s preferred human style would be the path forward. -
Cache hit/miss signalling for FETCH —
CACHE_DISTANCE(Slack idea): afrind floated (Slack#moq, Aug-29) an extension property to convey cache hit/miss depth in fetch responses across chains of caches — a sticky varint (0/absent = original publisher or unknown,1= served from the relay’s cache,>1= received from an upstream fetch, each relay bumping the value when proxying), sent only when the value changes and castable to a hit/miss bool. Early musing, no PR/issue yet. (He separately asked whether setting the header EOG bit and an Object Status = EOG together is allowed — “not entirely wrong, just wasteful.“) -
Interaction of subscription-pausing mechanisms (issue #1889): vasilvv’s issue #1889 (Sep-1) asks the draft to document how the multiple mechanisms that can pause a subscription interact — Range/Location filters, FORWARD-based pausing, and subscription state now coexist, and their combined behaviour is unspecified. New, opened during the draft-21 restructuring; no PR yet.
-
FETCH range — is End Location / End of Track needed? (issue #1897): Aman Sharma’s issue #1897 (Sep-2) argues FETCH does not need an End Location or End of Track — the range’s end signalling is redundant given how a FETCH terminates. A simplification question surfaced by the Sep-2 hackathon’s FETCH conformance testing (see discussions-2026-09); no PR yet.
-
Object Status/Properties on Subgroup streams (issue #1908): Martin Duke’s issue #1908 (Sep-4) asks whether an Object carried on a Subgroup stream may have Status and Properties — a wire-semantics clarification. New, no PR yet.
-
Cache-availability / cache-status extension (issue #1907): issue #1907 (sharmafb, Sep-4) gauges interest in an extension for cache availability and cache status — closely related to afrind’s Aug-29
CACHE_DISTANCESlack musing (conveying cache hit/miss depth across relay chains) above. New, request-for-interest. -
0-RTT session establishment (issue #1906): Martin Duke’s issue #1906 (Sep-4) opens the question of 0-RTT for MoQT session setup. New, no PR yet.
-
URI resolution + TLS cert matching → a separate draft (issue #1839, Sep-5): the transport draft says how a
moqt://session works once connected but leaves DNS resolution of the URI and how the TLS certificate matches the URI undefined. After discussion on issue #1839, the WG’s direction (per Cullen Jennings’s Sep-5 list thread “URI Resolution for MOQT and TLS cert matching,” permalink) is that a separate spec is the best home — it needs review from the DNS and certificate communities, which a standalone document eases. Jennings and Suhas Nandakumar offer [[moq-discovery|draft-jennings-moq-discovery]] (revised to -02 on Sep-5) as that spec. Transport-side, OPEN PR #1909 “Move URI resolution to a separate draft” (Jennings, Sep-5) and its precursor PR #1901 “start design questions for URI resolution and cert matching” (Sep-3) track pulling this content out. Related to the URI-query-scope work (#1855, #1835).
ALPN Negotiation
MOQT negotiates the draft revision entirely via the QUIC ALPN ([RFC7301]) and WebTransport’s WT-Available-Protocols. Draft ALPNs are formed by appending the draft number to moqt-; the final RFC will use the bare moqt token.
From draft-15 onward there is no numeric wire version at all — draft-20 §3.1 makes ALPN the sole version-negotiation mechanism, and drafts 16–20 contain no Supported Versions / Selected Version SETUP fields. The 0xff0000NN version codes belong to draft-14 and earlier, which used a single moq-00 ALPN followed by numeric version negotiation inside the SETUP messages (draft-14 §9.3 defined draft versions as 0xff000000 + draft number, so draft-14 = 0xff00000E). Implementation pages that quote a 0xff0000NN constant for a draft ≥ 15 are quoting an implementation’s internal enum, not a spec-defined wire value.
The QUIC-multiplexed (qmux) transport prefixes the same token as qmux-00.moqt-NN; that composition is defined in the qmux draft, not in moq-transport.
moqt-20— draft-20, the current published revisionmoqt-19— draft-19moqt-18— draft-18; the Vienna interop target and the current automated interop-runner targetmoqt-17— draft-17moqt-16— draft-16moq-00— draft-14 and earlier (legacy, numeric SETUP version negotiation); the bareqmux-00token (no suffix) likewise implies draft-14
Related Drafts
- moq-msf - Streaming format built on MOQT
- moq-loc - Low overhead container for MOQT objects
- moq-secure-objects - E2E encryption for MOQT
- moq-privacy-pass - Authentication for MOQT