IETF 126 MoQ Recap: The Filter Convergence, a Diagnostics Spin-Off, and an Honest Interop Report

By moqtap team

IETF 126 MoQ Recap

The MoQ working group met three times during IETF 126 in Vienna (18–24 July 2026) — a Monday session, then two more later in the week. Between them the group worked through the transport draft’s remaining issue list, heard status on six adopted drafts, and sat through an interop report that did not flatter anybody.

Two things stood out. First, the working group is converging on a single filter syntax for subscribe, fetch, and fill, and is deciding right now whether the two biggest new filters belong in the base transport draft or in extensions. Second, the interop numbers are a useful cold shower: implementations are still chasing draft-18 while the editors ship draft-19, and the pass rate against the full matrix sits well under half.

This post walks the sessions from the published minutes and session materials. Where the minutes record a decision, we say so; where something is still open, we say that too.

The transport draft is the critical path

Alan Frindell opened the transport update with a number: 72 pull requests merged since IETF 125, concentrated on range filters, URL schemes, roles, and media types. Most of those landed in draft-19, which we covered separately.

His framing of the situation is the single most important line in the minutes:

if transport does not ship, none of the other WG drafts can progress

That is not rhetoric. The working group now has seven adopted drafts, and five of them — MSF, CMSF, LOC, C4M, Secure Objects — depend on registries and extension points that the transport draft has not finished defining. Everything queues behind it.

The filter convergence

Draft-19 shipped Range Filters. IETF 126 was about what happens next, and three separate proposals all landed on the same surface.

Location Filters unify the syntax (PR 1809)

Mo Zanaty presented a reworked Location Filter that eliminates the filter type enum entirely. Instead of naming a filter type (Largest Object, Next Group Start, AbsoluteStart, AbsoluteRange), a location is expressed as optional start and end coordinates, with the omissions carrying meaning:

EncodingMeaning
End object omittedall objects in the group
End group omittedopen-ended subscription
Length set to zeroremove the active filter

The payoff is that the same syntax then replaces the enums in the fill-fetch work (PR 1673), so live subscribe, fetch, and fill share one location grammar. The minutes record the decision plainly: merge PR 1809 after editorial review.

If you maintain a decoder, this is the change to watch. It does not add a feature so much as delete a concept — and deleting the filter-type enum touches every code path that currently switches on it.

Top N Tracks moves toward the base draft (PR 1518 → 1830)

Mo Zanaty also presented the Top N Tracks Filter, which lets a subscriber say “give me the N most active tracks” and lets relays evaluate publisher-provided object metrics to decide which those are. The motivating use cases are all fan-in problems: active-speaker selection in conferencing, security camera grids, esports multi-view, and high-volume feedback aggregation.

The bandwidth argument is the interesting part. Relays propagate the filter upstream, pruning near the publisher, so the saving shows up on relay-to-relay links rather than only on the last mile. That is a genuinely different shape from ordinary subscription aggregation.

Recent changes: the maximum number of selected tracks is capped at 255 so it fits in one byte, and the relay state machine was simplified. Magnus Westerlund confirmed working group consensus to work on the feature at all. What remains open is packaging — base transport draft, or extension? Will Law and Rohan Mahy argued for making it a core feature. The chairs’ action item is to run a mailing list consensus call once Mo produces a clean, dedicated PR separated from the other range filter work. That PR is now 1830.

Sender-Side Track Switching, and a procedural objection

Will Law presented Sender-Side Track Switching (SSTS), renamed from Dynamic Track Selection. The design is now split into a core framework plus extensible algorithms, with Algorithm 0 as the baseline every implementation gets.

One substantive change: per-session DDoS limits were removed, on the reasoning that they are trivially bypassed by opening multiple sessions. Relays are instead expected to monitor their own internal resource usage.

The packaging question here got procedurally sharp. Cullen Jennings formally objected to separating the top-end filter and SSTS into distinct drafts, citing a roughly 50/50 split in the room. Mike Bishop, as Area Director, clarified that chairs determine consensus and that dissenters may appeal through formal channels. A virtual interim was scheduled specifically to settle SSTS packaging.

For anyone tracking MoQT for ABR purposes: SSTS plus Top N Tracks is the working group’s answer to adaptive bitrate, and its shape is being decided over the next few weeks — not next year.

Management and diagnostics get their own document

This one matters disproportionately if you build tooling.

During the issues walkthrough, the working group agreed to separate management, metrics, and diagnostics into a new standalone document. Alperen Temel volunteered as co-author, working with Alan Frindell and Ian Swett, with an action item to produce an initial -00 draft in a new repository.

The accompanying design principle is worth quoting in spirit: only timeouts that require application-layer remediation should be signalled on the wire. Everything diagnostic — the counters, the metrics, the relay-management surface — moves out of the transport draft and into the applicability document.

That is the right call for the transport spec’s page count, and it creates a natural home for the observability work that currently lives in scattered individual drafts (qlog event definitions, relay DoS considerations, relay benchmarking). We will be reading that -00 closely when it appears.

Security: Secure Objects heads for last call

Cullen Jennings presented Secure Objects, the end-to-end object encryption draft, with a refined threat model around relay amplification attacks against downstream subscribers.

Three concrete changes:

  • Security fields are now fixed-width 64-bit integers, rather than variable-length.
  • Publisher priority was removed from the end-to-end authenticated fields. The reasoning is honest: relays can override priority anyway, so authenticating it end-to-end promises a property the architecture cannot deliver.
  • Object IDs are restricted to 32 bits to prevent AEAD nonce reuse under AES-GCM. This is a real constraint to design around, not a formality — it caps the object space within a single key epoch.

Cullen proposed taking the draft to working group last call immediately, then parking it until the transport registry stabilizes. Suhas Nandakumar supported the approach. If that holds, Secure Objects becomes the first MoQ WG draft to reach last call — though it will sit in the parking lot waiting on transport, which brings us back to Frindell’s point.

Authorization: three topologies, one privacy warning

Mike English gave the Auth Design Team update. The team is evaluating three authentication topologies:

  1. Hop-by-hop delegated auth
  2. Direct client-to-publisher validation with subscriber sampling
  3. Policy delegation

Ted Hardie raised the objection that shapes this work: designs that require relays to hold subscriber databases carry serious privacy risk. A relay that must know who its subscribers are is a relay that can be compelled to say who its subscribers were.

On signalling, the open question is whether the challenge-response rides inline on the subscription or gets a dedicated session-level stream. Suhas Nandakumar and Chris Lemons favored a DPoP-style challenge-response flow. The design team is due to present progress at an October interim.

A related transport issue got handed to the same team: when a request carries multiple tokens and fails, the client currently cannot tell which token caused the error. Cullen noted this becomes necessary during v1→v2 credential migrations.

The container layer: LOC, MSF, and a registry collision

Mo Zanaty covered LOC revisions -03 and -04, which introduce a clean split: public properties in headers, private properties in payloads. A new audio config property (type 0x0f) carries WebCodecs decoder configurations.

Two open problems surfaced:

  • Registry collision between LOC and Secure Objects. Two adopted drafts are reaching for the same codepoint space.
  • Frame duration has no property, which breaks non-constant-frame-rate video. Still unresolved.

Will Law questioned the use of application-defined ranges for things that are in fact standardized; Rohan Mahy noted that relays benefit specifically from properties being standardized rather than private. That thread continued into the MSF session, where Cullen Jennings and Rohan Mahy argued that standardized elements should not squat in the application-specific range. The decision: Will Law and Mo Zanaty will collaborate on moving track and object configuration properties from private to standardized codepoints, and the terminology will be clarified so that “application-specific use” unambiguously means private use.

Other MSF/CMSF outcomes:

  • A delta update mechanism was merged, allowing dynamic track field updates by override instead of delete-and-recreate.
  • A proposal to use a null or empty track name for the default catalog, simplifying URLs. Suhas and Mo flagged potential prefix-matching ambiguity.
  • PR 169 proposes that all MSF objects map to subgroup zero. Mo Zanaty and Gwendal Simon objected that this inhibits temporal scalability. Will Law took the follow-up.

Performance feedback, from a deployment at scale

Yanmei Liu presented Alibaba’s experimental results comparing MoQ against WebRTC at 100,000 to 1,000,000 connections: faster session setup via 0-RTT, better QoS through multi-stream prioritization, and improved time to first frame.

The proposal that came out of it is a two-tier feedback system — an L1 tier consumed locally at the last mile, and original feedback forwarded upstream to the publisher — with relays aggregating over 5-second windows to prevent feedback storms. Mo Zanaty suggested aligning the aggregation work with the Top N Tracks filter, since both are fan-in problems.

This became draft-liu-moq-feedback-00, published 31 July, and it is the most active thread on the mailing list as of this writing.

Tempo and Mocha: the application layer arrives

Two presentations showed what people intend to build once transport settles.

Tempo (Suhas Nandakumar) is synchronized playout across clients — live sports, multi-room audio, emergency alerts. It adds three metadata properties: capture timestamp, playout delay, and a hop time that relays update as objects traverse the tree. Will Law and Ali C. Begen raised scalability concerns about publisher-directed feedback loops at large-event scale; the suggested alternative is local client adjustment using cumulative hop times.

Mocha (Cullen Jennings) is decentralized multi-party conferencing and chat without SFUs or dedicated media servers. It coordinates namespaces, catalogs, and encryption keys, using MLS-based end-to-end security built on Secure Objects and C4M, and pushes active-speaker selection and track switching down into relays via Top N filtering.

Mocha is the clearest illustration of why Top N Tracks is being argued about so hard. If active-speaker selection is a relay filter, conferencing needs no media server. If it is not, it does.

The interop report

Mike English (Cloudflare) presented the interop report on 24 July, and it is the most useful document to come out of the week. The moq-interop-runner executes a test matrix nightly. Here is the week of IETF 126, all runs targeting draft-18:

Run (UTC)PassFailSkipTotal
2026-07-18132187319
2026-07-19134185319
2026-07-20134204338
2026-07-21142196338
2026-07-22142196338
2026-07-2313618410330
2026-07-2413120811350

Read that carefully before concluding anything. The pass count is roughly flat while the total grew from 319 to 350 — the matrix expanded during the week as implementations and version pairings were added, and new pairings mostly fail before they pass. A flat pass count against a growing denominator is what active interop work looks like. It is still a pass rate under 40%.

The matrix covers a genuine spread of implementations — among them aiomoqt, imquic, libquicr, moq-dev-js, moq-dev-rs, moq-go, moq-rs, MOQtail, moqx, Moxygen, quiche-moq, and XQUIC, plus version-pinned variants such as moq-rs-draft-16, moq-rs-draft-18, and xquic-draft-18. Many of these are in our implementation directory.

What actually broke

The per-implementation notes are more informative than the totals.

Giovanni Marzot’s aiomoqt (Python asyncio over aioquic) ran a six-case control-plane conformance suite — setup, announce, publish-namespace-done, subscribe-error, announce-subscribe, subscribe-before-announce — plus end-to-end object delivery through each public relay, on both raw QUIC and WebTransport. Working at MOQv18: Moxygen, Nokia, Meetecho’s imquic, openmoq’s moqx, and MOQtail’s relay.

The failures are specific and reproducible:

  • Cloudflare’s draft-18 endpoint: control plane passes (publisher sends PUBLISH_NS + PUBLISH), object delivery fails. Much improved after moq-rs updates in July — single-subscriber delivery now passes — but it still fails under concurrent subscribers: with three subscribers, one never completes SUBSCRIBE (request timeout, code 2) and the receiving subscribers get a partial set, 763 of 912 complete objects. Identical on raw QUIC and WebTransport.
  • cdn.moq.pro/anon: the subscribe-error and subscribe-before-announce cases fail, with an eager SUBSCRIBE_OK observed and zero objects forwarded. Moxygen saw the same endpoint return 401 on raw QUIC, and found that the WebTransport connection requires buffering WT streams before the 200 response because of QUIC/WT/MoQ interactions.
  • Nokia’s relay holds SUBSCRIBE_OK until upstream serves — a forward-and-wait model. The report explicitly notes this as a behavioral difference, not a failure, which is exactly the kind of distinction a conformance suite has to get right.

On the success side: Moxygen against Nokia passed all 41 data-plane tests on draft-18 over both QUIC and WebTransport. Kota Yatagai’s Moqtopus verified PUBLISH_NS + SUBSCRIBE for both subgroup and datagram forwarding, plus REQUEST_UPDATE with its OK and ERROR responses, against Nokia, Meetecho, Moxygen, and Cloudflare. Jordi Cenzano’s moq-encoder-player got full audio + video through encoder → relay → player against MOQtail, Moxygen, Nokia, and Meetecho.

One detail deserves applause: compatibility tolerances are opt-in and annotated in the test output, never silently passed. When aiomoqt tolerates a truncated trailing-extensions block from a Cloudflare draft-16 fork, or libquicr’s non-spec error codes, the report says so. That is how an interop matrix stays honest.

The version problem

Every run in that table targets draft-18. The working group published draft-19 on 6 July, two weeks before the meeting, and intends implementations to be on draft-20 by the next IETF in Seattle.

Implementations are running roughly one to two drafts behind the editors, and the matrix has to carry version-pinned variants (moq-rs-draft-16 alongside moq-rs-draft-18) just to express reality. PR 95 on the runner addresses this directly with a version-pinned per-draft interop matrix, replacing single-version negotiation with full version-overlap coverage. Its preview run reports 102 results: 32 pass, 20 partial, 60 fail, 10 did-not-run — a more granular and less flattering picture than a binary pass/fail.

Mike English was granted authority to schedule a virtual interop day in early September, targeting draft-18. Jordi Cenzano proposed defining interop levels — basic control messages versus full synchronization — so implementations can be categorized by capability rather than graded pass/fail against a matrix that assumes everyone implements everything.

Transport issue dispositions

The Thursday session worked through the issue list. The dispositions, condensed:

TopicDisposition
Subscription State Update (PR 1803)Rename to “Subscription Notify”; add safety constraints against amplification. Martin Duke to explore “publish done” simplifications
Parameters in PUBLISHIan Swett to write a PR permitting appropriate parameters, excluding security tokens, plus a parameter summary table
Track alias reuseReuse stays allowed after a prior subscription ends; add cautionary text about race conditions
Subscription-level flow control (issue 869)Moved to a separate extension draft
PUBLISH_OK state updatesDisallow; require an immediate REQUEST_UPDATE instead
Token error attributionAssigned to the Authorization Design Team
Structured MoQ query spaceRestrict query strings to key=value; revisit on GitHub
Versions and extensionsLoosen the requirement that new versions list all compatible past extensions; retain the requirement that extensions list compatible versions

The versions-and-extensions change is easy to skim past and shouldn’t be. Requiring every new MoQ version to enumerate all compatible prior extensions was a combinatorial trap; inverting the obligation onto extensions is the maintainable direction.

What’s next

WhenWhat
Early SeptemberVirtual interop day, targeting draft-18
OctoberInterim — Auth Design Team presents challenge-response signalling
Soon (unscheduled)Virtual interim on SSTS packaging
Pending clean PRMailing list consensus call on Top N Tracks in the base draft
IETF 127, SeattleTarget: implementations on draft-20

What this means for implementers

If you maintain a MoQT implementation. Two structural changes are coming that will touch your filter code: the Location Filter rework (PR 1809) deletes the filter-type enum and unifies subscribe/fetch/fill under one location grammar, and Top N Tracks may land in the base draft rather than an extension. Do not build new abstractions on the current enum. Separately, PUBLISH_OK will stop carrying state updates, and track alias reuse is officially permitted — audit your alias lifecycle for the race conditions the working group declined to forbid.

If you are waiting to adopt. The signal to watch is not draft-19 or draft-20; it is whether the transport draft reaches last call. Secure Objects is queued and parked. The interop matrix is honest about a sub-40% pass rate against draft-18. Neither of those means MoQT is not ready to build on — Moxygen and Nokia pass all 41 data-plane tests against each other — but they do mean pin your peer versions and test against your actual counterparties, not against a spec revision number.

If you build tooling. The management/metrics/diagnostics spin-off is the document to track. It is where the wire-visible observability surface will be defined, and it is starting from -00 with the transport editors involved.

The interop report was the most valuable hour of the week precisely because it refused to round up. Anyone integrating MoQT today should read the runner’s results and the ad-hoc interop wiki before picking a relay to build against.

We will be covering the September interop day and the Top N consensus call as they happen — see our MoQ News series for the running summary.