Standardized cross-implementation test framework for MOQ protocol interoperability testing.

Overview

The interop runner automates testing between MOQ implementations, publishing results as a matrix showing pass/fail status for each implementation pair.

GitHub: englishm/moq-interop-runner Results: englishm.github.io/moq-interop-runner

Registered Implementations

Roster as actually exercised by the 2026-08-22 cut — 15 client endpoints × 16 relay endpoints. Several projects register more than one endpoint (a draft-pinned variant, or separate client and relay roles), so endpoint names are not 1:1 with projects. The 2026-08-27 14:16 cut expanded to 351 cells (15 clients × 17 relays) by enrolling the new stitcher-moq relay (Pluto TV / Paramount, runner PR #112) — see Current standing.

Client endpoints (15) — aiomoqt, imquic, moq-dev-js, moq-dev-rs, moq-go, moq-rs, moq-rs-draft-14, moq-rs-draft-18, moq5, moqlivemock, moqtopus, moqx, moxygen, xquic, xquic-draft-18

Relay endpoints (16) — aiomoqt-relay, aiomoqt-relay-quic, imquic, libquicr, moq-dev-rs, moq-go, moq-rs, moq-rs-draft-14, moq-rs-draft-18, moqt-nr, moqtail, moqx, moxygen, quiche-moq, xquic, xquic-draft-18

EndpointProjectDraft (Aug-22)Notes
aiomoqt, aiomoqt-relay, aiomoqt-relay-quicaiomoqt — Python asyncio (gmarzot)18Client + two relay roles; 18/18 vs moqx, moxygen, moq-rs-draft-18 on the Aug-22 cut
imquicimquic — lorenzo-miniero’s C library18Client and relay
moq-dev-js, moq-dev-rsmoq (luke-curley)18JS/Hang player + Rust client and relay
moq-goGo implementation — not yet covered by a wiki page19Ahead of the draft-18 target; since Aug-19 pairs only with itself (6/6). Was the sole “ahead” endpoint until stitcher-moq declared draft-20 Sep-11 (see below)
moq-rs, moq-rs-draft-14, moq-rs-draft-18moq-rs16 / 14 / 18Three draft-pinned endpoints; moq-rs-draft-18 is mike-english’s single-instance relay
moq5Client — not yet covered by a wiki page18
moqlivemockEyevinn moqlivemock (mlmtest, tobbe-einarsson)—Client role
moqt-nrNokia relay (Yu You) — not yet covered by a wiki page18 → 18 / 19moqt.nokiaresearch.com:4443; registered for draft-19 Sep-3 (runner add moqt-19 commit + #124 moqt:// WT endpoint) — first draft-19 relay registration. Cleared the moxygen conformance suite Sep-7 (Yu You: “moxygen conformance test passed”) after the Sep-2–7 sweep fixed, in order: duplicate-object + FETCH-inclusive (Sep-4), then the publisher-priority mismatch (0 → 128 → correct) and the FORWARD=0-still-forwards bug. Sweep resumed Sep-8: Aman Sharma found a Joining Fetch against a Forward State 0 subscription wrongly accepted (should be REQUEST_ERROR/INVALID_RANGE per §10.12.2) — “cleared conformance” stays a moving bar as the moqtest suite deepens. Sep-9: Yu You opted not to chase that draft-18 joining-fetch fix — “we are leaving the joining fetch impl. behind and moving on to the new v20/21 as the new fill fetch is coming” — and floated hosting v18 + v20/21 at the Seattle interop
moqtailmoqtail (Zafer Gurel)16Relay
moqtopusMoqtopus — C++/MsQuic for Unreal Engine (Kota Yatagai)18Client
moqxOpenMOQ moqx18Client + relay
moxygenMeta’s C++ relay18Client + relay; interop client ALPN gap tracked in runner PR #111; announce-subscribe case publishes the wrong namespace (moq-interop-test vs the spec moq-test/interop), so it fails 5/6 as unauthorized on prefix-scoped relays (Steven Riedl/Pluto TV, Slack Aug-26; afrind: “will fix”)
quiche-moqquiche (martin-duke, victor-vasiliev)16Relay
stitcher-moqPluto TV / Paramount relay — not yet covered by a wiki page (Steven Riedl)18 → 20Relay; enrolled 2026-08-27 (runner PR #112), expanding the matrix to 351 cells. Declared draft-20 support Sep-11 (PR #126) — the first draft-20 endpoint in the runner (ahead of the draft-18 nightly target), adding 3 “ahead” cells that show as skipped on the Sep-12 cut
xquic, xquic-draft-18Alibaba XQUIC14 / 18Client + relay; draft-18 relay image reported unavailable on the Aug-22 cut
libquicrCisco14Relay

Coverage gap: moq-go, moq5, moqt-nr, and (since Aug-27) stitcher-moq are registered and running but have no wiki page yet. moq-go (draft-19) and, since Sep-11, stitcher-moq (draft-20 — the first draft-20 endpoint, Pluto TV / Paramount’s public relay) are the runner’s implementations ahead of the draft-18 target.

Registration history (PRs on englishm/moq-interop-runner): moqx relay #59 (Apr 11); then a May-13 batch — mlmtest/moqlivemock #63, moqx client #66, aiomoqt #67, and Nokia Docker RELAY_URL support #65 enabling Nokia’s in-house v17 relay. Merged Aug-27: #112 registering Pluto TV / Paramount’s stitcher-moq public relay endpoints (Steven Riedl, 14:01 UTC — this expanded the matrix to 351 cells on the 14:16 cut) and #111 documenting the moxygen/moqx draft-18 client ALPN limitation (14:02 UTC). Merged Sep-1: #116 adding a stitcher-moq test client (Steven Riedl — the Pluto TV / Paramount endpoint now runs as client and relay), #117 advertising a draft-20 (moqt-20) ALPN for moq-go, #118 (image-rebuild workflow), and #114 (moqlivemock → draft-18). Merged Sep-2 (hackathon): #119 adding moq-playa (OpenMOQ’s @moqt TypeScript draft-18 client, ghcr.io/openmoq/moq-playa-interop-client), #120 adding the mlmrel relay role (moqlivemock), #121 putting moqtail on draft-18 (the live relay18.moqtail.dev), #122 bumping the embedded moq.dev client to 0.19, and #123 spec’ing a RENDEZVOUS_TIMEOUT test. Merged Sep-3: an add moqt-19 commit registering Nokia’s moqt-nr relay for draft-19 (its implementations.json entry goes ["draft-18"] → ["draft-18","draft-19"], “Support native QUIC and WebTransport”) — the first draft-19 relay registration — plus #124 (Yu You, switching the WebTransport endpoint to a moqt:// URL). Merged Sep-5: #125 (MOQtail relay URL update). Merged Sep-11: #115 “docs: define interop reporting and test lifecycle” (the neutral data-plane contract / reporting spec) and #126 “stitcher-moq: declare draft-20 support” (Steven Riedl, 16:37 UTC) — the first draft-20 endpoint, which grew the matrix to 437 cells (ahead 19 → 22) on the Sep-12 cut. Open now: #127 “Register quic-zig (client and relay)” (endel, since Sep-12) — a pending new quic-zig implementation, not yet merged; #110 registering the kvick relay (Mattias Bergström, since Aug-15); and the conformance-test integration #103.

Current Target

The interop runner targets draft-18 for automated testing. The WG (per mike-english’s Interop Report) agreed to hold draft-18 as the interop target while expanding case coverage from a handful of cases to ~70. Each matrix cell is categorized as at-target (both endpoints on draft-18), ahead, or behind.

Alan Frindell reaffirmed on Slack (July 18) that the official interop target for moq-transport is still draft-18 — “since there’s been some confusion” — while welcoming intrepid implementers to try draft-19 because filter feedback is valuable. This came as the Vienna Hackathon began generating the first draft-19 activity (see Live interop below).

A dedicated draft-18 interop push is now scheduled: Mike English announced a Virtual Interop Hackathon on Wednesday 2026-09-02 (list, Aug-21, permalink) — an all-day drop-in/drop-out session targeting draft-18, framed explicitly as hardening draft-18 interop before draft-20 becomes the target at the Oct 12–15 Seattle hybrid interim. English flags two expected runner changes for it: broader data-plane test coverage and a possible redesign of the results presentation. Participants are asked to register implementations in the runner and refresh Docker images / relay endpoints in advance. See interim-meetings.

The Seattle interop target is draft-18 + draft-22 — the interim-2026-moq-24 decision of Sep-21, superseding the draft-20 target set two weeks earlier at interim-23. The interim-2026-moq-21 minutes (Aug-14) had named draft-22 the “next official interop target,” but interim-2026-moq-23 revised this: the chairs/editors debated draft-18 vs draft-20 for the Oct 12–13 Seattle hybrid interop, and after a session poll (“I will be able to support draft-20 in Seattle” — Yes 7 / No 5 / No opinion 4 of 21) agreed “the formal interop target will be Draft 20.” Ian Swett and afrind argued for testing Fill Fetch (which landed in draft-20) and filters; Suhas, Duke, and Zafer Gürel noted their codebases are still on draft-18, so those may interop best-effort. Crucially, no further wire-breaking design changes will be merged into the interop target — a wire-freeze. This is coherent with the draft-21/22 plan (see moq-transport): draft-21 is a pure structural move and draft-22 the editorial cleanup, both wire-identical to draft-20, so “target draft-20” means freezing the draft-20 wire while the document reorganizes around it. (Aside: the Aug-14 minutes called draft-20 “a purely-editorial cut”; the published draft-20 is not — it removes Joining FETCH and respecs the datagram/subgroup type fields.) interim-24 (Sep-21) then moved the target again — to draft-22 alongside draft-18. Duke, in Slack #moq minutes after the session: “In the meeting just now, we declared draft-22 (along with -18) to be the Interop target. -22 is functionally identical to -20 except the ALPN, so there should be no practical difference.” The wire-freeze therefore survives intact — -22 is draft-20’s wire with a new ALPN — while the named target returns to the interim-21 plan, and draft-18 implementations are explicitly kept in scope rather than relegated to best-effort. Two caveats: draft-22 is not published yet (the datatracker’s newest moq-transport revision is -21, Sep-8), and the automated nightly runner still runs draft-18 — neither the draft-20 nor the draft-22 decision has reached the nightly configuration. The interim-24 minutes, posted 2026-09-28 (minutes-interim-2026-moq-24-202609211630), confirm this record, which had been reconstructed from the meeting chatlog and Duke’s Slack post: “Draft 22 … is designated as the target for the Seattle interoperability event, alongside Draft 18.” The Seattle agenda (posted the same day) gives the interop discussion a 25-minute slot on Oct-15.

This draft-18→draft-20 pivot is already visible in implementations: on Slack (Sep-9) Nokia said it is “leaving the joining fetch impl. behind and moving on to the new v20/21 as the new fill fetch is coming” and floated hosting two versions (v18 + v20/21) at Seattle, and afrind said the conformance script “will hopefully support d20 / fill fetch by then”; moq-dev added draft-21 wire support (moqt-21) the same day the draft was cut. See discussions-2026-09.

Current standing

Latest cut: 2026-10-06 00:28:24 UTC — 477 cells / 218 pass / 257 fail / 2 timeout (45.7% pass). A partial recovery from the Oct-5 flake night: +16 pass (202 → 218), though still short of the Oct-4 high (237). The matrix is unchanged (same 477 cells, identical version spread: 364 draft-18, 48 draft-14, 43 draft-16, 16 draft-20, 4 draft-19, 2 draft-22) and no runner PR has merged since #134 (Oct-2), so this is pure flake-level reversion — the endpoints that cratered on Oct-5 largely came back: stitcher-moq relay 3 → 14 pass (+11), moqlivemock client 16 → 20 (+4) (back to its Oct-4 level), moq-rs-draft-14 relay 3 → 7 (+4), moqt-nr relay 20 → 22, moq-dev-js 12 → 14 and moq-playa 18 → 20 clients; against two small regressions (xquic-draft-18 client −1, moxygen relay −2). The two moqt-22 cells recovered to green: stitcher-moq’s self-interop pairings (remote-quic + WT), red on Oct-5, both passed again. This confirms the Oct-5 drop was a transient environmental bad night, not a code regression; the count lands between the flake floor (202) and the Oct-4 high because the imquic client (3) and moqx relay (21) dips from Oct-5 had not yet reverted.

Prior cut: 2026-10-05 00:29:57 UTC — 477 cells / 202 pass / 273 fail / 2 timeout (42.3% pass). A sharp one-night flake regression: −35 pass (237 → 202), on the same 477-cell matrix with no runner PR since #134 — every failure a normal test exit (exit code 2), not a build/registry break. The drop was concentrated on a few endpoints having a bad night: the imquic client 16 → 3 (−13), and relays moqx 34 → 21, stitcher-moq 16 → 3, moqt-nr 24 → 20, moq-rs-draft-14 8 → 3, plus a −1/−3 smear elsewhere; the two moqt-22 stitcher-moq self-interop cells also went red as ahead. The Oct-6 cut above confirmed this was transient (most of it reverted).

Earlier cut: 2026-10-04 01:06:57 UTC — 477 cells / 237 pass / 238 fail / 2 timeout (49.7% pass). The matrix was unchanged from Oct-3 (same 477 cells, same version spread), with no runner PR merged between — so the day was flake-level churn that netted +3 pass (234 → 237), a new absolute high, while fail dipped below 240 for the first time (241 → 238); the moq-dev-rs relay held its Oct-3 recovery at 39/86 pass and stitcher-moq held flat at 30/69. (This remains the pass high; the Oct-5 flake gave it back and Oct-6 clawed most of it.)

  • The nightly target stays draft-18. #134 moved stitcher-moq’s client to moq-tokio 0.19.20 (moqt-14–22 capable), so from this cut on the matrix carries two moqt-22 cells — the stitcher-moq client ↔ stitcher-moq relay self-interop pairings (remote-quic + remote-webtransport, both pass), the only pair whose highest common version is 22. Every other endpoint is still exercised at draft-18.

Oct-2 baseline: 2026-10-02 00:28:39 UTC — 463 cells / 227 pass / 235 fail / 1 skip (49.0% pass; at-target draft-18 336 · ahead 22 · behind 105, pass 188 · 14 · 25). 49.0% was the best pass rate of any cut with 50+ cells at the time (next: Sep-6 48.6%, Sep-27 48.4%).

Draft-14 starts leaving the matrix (Oct-1, −12 cells). Runner #131 “moqx: drop draft-14 support” (gmarzot) merged Sep-30 15:27 UTC. The Oct-1 00:32 cut then dropped the 12 moqx draft-14 pairings with moq-rs-draft-14, libquicr and xquic. All 12 were failing, because moqx itself had dropped d14, so no passes were lost and Oct-1 scored 223 (−1 on flake). The behind band went 117 → 105, its first change since the Sep-2 hackathon cut. The companion #132 (moxygen drops d14) is still a draft PR waiting on upstream moxygen.

Oct-2 (+4) is mostly the moqtail relay recovering. It had sat at 4 pass / 9 fail / 1 timeout every night from Sep-24 to Oct-1. On Oct-2 it scored 7 / 7: announce-subscribe and subscribe-before-announce went from timeout to ok, with no moqtail commits between the two cuts. quic-zig → imquic also passed for the first time since quic-zig enrolled. Three of Oct-1’s flips (aiomoqt and stitcher-moq ↔ moq-dev-rs) reversed, which is flake.

A persistent failure: the moq-dev-rs relay in docker — fix merged Oct-2, partly cleared Oct-3. The docker cells against the moq-dev-rs relay had failed every night since Sep-24: the relay exits at startup because moq-relay 0.15 renamed --server-bind / MOQ_SERVER_BIND to --listen / MOQ_LISTEN. The adapter fix in #134 merged Oct-2 17:13 UTC, and the Oct-3 00:25 cut is the first to carry it: moq-dev-rs went 31 → 39 pass (55 → 47 fail), so ~8 cells recovered. The relay is back up and routing, though not every pairing passes yet.

Draft-22 reaches the runner’s roster (Oct-2); the nightly target stays draft-18, and the only moqt-22 cells exercised are stitcher-moq’s two self-interop pairings. Two of the three pending PRs merged Oct-2 afternoon, putting a moqt-22-capable client in the roster. From the Oct-3 cut onward the matrix carries exactly two moqt-22 cells — the stitcher-moq client ↔ stitcher-moq relay pairings (remote-quic + remote-webtransport, both pass on Oct-3 and Oct-4), where the Paramount client and relay are the only pair whose highest common version is 22; every other endpoint still runs at draft-18:

  • #134 (riedlse, +774/−442) merged Oct-2 17:13 UTC — the first PR to declare -21/-22. It moves the stitcher-moq client to moq-tokio 0.19.20 (MoQT 14–22, no moq-lite; with the old client every moq-dev relay negotiated moq-lite-05), refreshes the registry, and folds in the moq-dev-rs adapter fix above. The Paramount relay (moq-relay 0.15.8) negotiates moqt-22/-20/-18. The PR also tightens tests 5 and 6 to require evidence that the relay actually routed the SUBSCRIBE; locally, stitcher-moq goes from 13 to 18 of 31 passing.
  • #133 bumps libquicr from draft-14 to draft-18 (RichLogan) — merged Oct-2 17:10 UTC.
  • Still open: #135 namespace-lifecycle test (sharmafb, Oct-1); #136 switching Nokia’s remote relay WT URL back to https (Oct-2); #137 pinning aiomoqt 0.12.0a1 with a single dual-transport relay adapter and newest-first draft ordering (Oct-3).

Miniero said on Slack (Oct-1) that his runner client now implements the new rendezvous-timeout case.

Conformance (Slack, Sep-30). Yu You ran moxygen’s conformance Section 8 (PUBLISH) against the Nokia relay and all tests passed. That is better than afrind’s Sep-25 matrix showed. afrind said results differ over longer RTTs (“adding some delay via qdisc”) and that the tool has known bugs to be fixed soon. Mike English’s nightly data-plane tests are meant to cover the same ground automatically.

Sep-28 → Sep-30: Sep-28 227, Sep-29 219, Sep-30 224 (475 cells), net −6 vs Sep-27 and mostly flake. The one real loss, moq-rs-draft-14 → moqx (moqx stopped accepting moqt_versions: 14), is what #131 then removed.

The Sep-27 high: 2026-09-27 00:30:44 UTC — 475 cells / 230 pass / 243 fail / 2 skip (48.4% pass; at-target draft-18 336 · ahead 22 · behind 117). 230 pass is an all-time high in absolute terms (previous: 204 on Sep-19), on a matrix that grew +38 cells mid-window.

The growth is one new implementation: quic-zig, registered via runner #127 (endel, merged Sep-22 21:41 UTC). It enrolled at the target, which is why at-target rose by exactly the matrix growth (298 → 336) while ahead (22) and behind (117) stayed byte-identical. The roster is now nineteen: aiomoqt, imquic, moq-dev-js, moq-dev-rs, moq-go, moq-playa, moq-rs, moq-rs-draft-14, moq-rs-draft-18, moq5, moqlivemock, moqtopus, moqx, moxygen, quic-zig, stitcher-moq, xquic, xquic-draft-18.

The five cuts Sep-23 → Sep-27 all ran on the 475-cell matrix: Sep-23 216, Sep-24 208 (−8), Sep-25 219 (+11), Sep-26 222 (+3), Sep-27 230 (+8). The Sep-24 dip and the recovery since look like ordinary within-band flake on a newly-widened matrix rather than a regression.

Earlier: 2026-09-22 00:26:27 UTC — 437 cells / 201 pass / 233 fail / 3 skip (46.0% pass; at-target draft-18 298 · ahead 22 · behind 117). Pass +1 (200 → 201), fail −1, split byte-identical (298 / 22 / 117) yet again. Note the timing on aiomoqt v0.11.1: it published at 00:50 UTC on Sep-22, after this cut started, so its relay-FETCH and namespace-discovery work cannot appear before the Sep-23 nightly. The runner still targets draft-18 — interim-24’s draft-22 decision (Sep-21) has not reached the nightly configuration — and quiche-moq still passes zero cells.

The three preceding cuts (Sep-19 → Sep-21) ran on the same 437-cell matrix with the same 3 skips and the same byte-identical 298 / 22 / 117 split: Sep-19 00:25:07 — 204 pass / 230 fail, +1 and a new high for the 437-cell matrix; Sep-20 00:28:21 — 201 / 233 (−3); Sep-21 00:29:04 — 200 / 234 (−1). Read together with the Sep-18 step below, the picture is that the aiomoqt v0.11.0 gain is real and has held: the matrix settled at 200–204 rather than falling back to the 192–195 band it occupied before v0.11.0, and the ±1–3 movement since is the usual within-band flake.

The prior Sep-18 nightly: 2026-09-18 00:25:31 UTC — 437 cells / 203 pass / 231 fail / 3 skip (46.5% pass; at-target draft-18 298 · ahead 22 · behind 117). Pass +8 (195 → 203), fail −8, with the at-target / ahead / behind split byte-identical (298 / 22 / 117) to the Sep-17 cut — no roster or reclassification change, so the movement is 8 cells flipping fail→pass within the draft-18 band. But this is the first nightly to pull aiomoqt v0.11.0 (shipped Sep-17 14:13 UTC, after the Sep-17 00:26 nightly) — exactly the cut Riedl flagged (“tonight’s matrix should be the first with 0.11 across the board”). The +8 is the largest single-day pass gain since the Sep-12 matrix growth and the first move outside the ±1–3 within-band range of the prior ten cuts, so it is plausibly the v0.11.0 effect, not flake (aiomoqt registers as one client + two relay endpoints, so a real conformance fix propagates to several cells at once). The nightly runner still targets draft-18, and the stitcher-moq draft-20 cells stay skipped (still the only draft-20 endpoint, so its 3 “ahead” cells produce no pass/fail — see Current Target). The Sep-19 cut then added one more cell (+1 to 204), confirming the step held.

The prior Sep-17 nightly: 2026-09-17 00:26:09 UTC — 437 cells / 195 pass / 239 fail / 3 skip (44.6% pass; at-target draft-18 298 · ahead 22 · behind 117). Pass +3 (192 → 195), fail −3, split byte-identical (298 / 22 / 117) to Sep-16 — three cells flipping fail→pass within the draft-18 band (a tenth straight within-band flake). This nightly ran at 00:26 UTC, before aiomoqt v0.11.0 shipped (14:13 UTC), so its +3 was flake — the v0.11.0 effect first appears in the Sep-18 cut above.

The prior Sep-16 nightly: 2026-09-16 00:25:16 UTC — 437 cells / 192 pass / 242 fail / 3 skip (43.9% pass; at-target draft-18 298 · ahead 22 · behind 117). Pass −2 (194 → 192), fail +2, with the at-target / ahead / behind split byte-identical (298 / 22 / 117) to the Sep-15 cut — two cells flapping pass→fail within the existing draft-18 band (a ninth straight within-band flake). (Off-matrix, moqlivemock v0.15.0 tagged its mlmrel relay Sep-16 with “all six moq-interop-runner relay test cases pass” — see moqlivemock.)

The prior Sep-15 nightly: 2026-09-15 00:27:01 UTC — 437 cells / 194 pass / 240 fail / 3 skip (44.4% pass; at-target draft-18 298 · ahead 22 · behind 117). Pass −3 (197 → 194), fail +3, with the at-target / ahead / behind split byte-identical (298 / 22 / 117) to the Sep-14 cut — three cells flapping pass→fail within the existing draft-18 band (an eighth straight within-band flake).

The prior Sep-12 nightly: 2026-09-12 00:24:46 UTC — 437 cells / 199 pass / 235 fail / 3 skip (45.5% pass; at-target draft-18 298 · ahead 22 · behind 117). The matrix grew +3 cells (434 → 437), all in the “ahead” band (ahead 19 → 22) and all skipped (skip 0 → 3) — the first roster change in weeks, driven by stitcher-moq declaring draft-20 support (Pluto TV / Paramount, runner PR #126, merged Sep-11 16:37 UTC — the first draft-20 endpoint in the runner, aligning with the Seattle draft-20 target). Within the unchanged draft-18 band, one cell flipped pass → fail (200 → 199), an ordinary within-band flake. The nightly runner itself still targets draft-18, even though interim-2026-moq-23 (Sep-8, minutes posted Sep-9) set the Seattle Oct interop target to draft-20 (see Current Target) — stitcher-moq’s draft-20 declaration is the first sign of the roster moving toward that target ahead of the nightly matrix.

The prior Sep-11 nightly: 2026-09-11 00:26:18 UTC — 434 cells / 200 pass / 234 fail / 0 skip (46.1% pass; at-target draft-18 298 · ahead 19 · behind 117). Pass +1 (199 → 200), fail −1, with the at-target / ahead / behind split byte-identical (298 / 19 / 117) to the Sep-10 cut — a small bounce back after the Sep-10 −8, cells flapping within their existing version band, no reclassification or roster change (a fifth straight within-band flake).

The prior Sep-10 nightly: 2026-09-10 00:24:34 UTC — 434 cells / 199 pass / 235 fail / 0 skip (45.9% pass; at-target draft-18 298 · ahead 19 · behind 117). Pass −8 (207 → 199), fail +8, with the at-target / ahead / behind split byte-identical (298 / 19 / 117) to the Sep-9 cut — a bigger swing than the prior single-cell flips, but the same kind of event (cells flapping fail within their existing version band, no reclassification or roster change), so a fourth straight within-band flake rather than a real regression.

The prior Sep-9 nightly: 2026-09-09 00:26:42 UTC — 434 cells / 207 pass / 227 fail / 0 skip (47.7% pass; at-target draft-18 298 · ahead 19 · behind 117). Pass −1 (208 → 207), fail +1, with the at-target / ahead / behind split byte-identical (298 / 19 / 117) to the Sep-8 cut — a third straight within-band single-cell fail flip, no reclassification or roster change.

The prior Sep-8 nightly: 2026-09-08 00:26:55 UTC — 434 cells / 208 pass / 226 fail / 0 skip (47.9% pass; at-target draft-18 298 · ahead 19 · behind 117). Pass −2 (210 → 208), fail +2, with the at-target / ahead / behind split byte-identical (298 / 19 / 117) to the Sep-7 cut — another within-band fail flip, no reclassification or roster change. It ran ~00:27 UTC, before both the Sep-8 interim-2026-moq-23 meeting and the evening resumption of the relay-conformance sweep (Aman Sharma’s new imquic FETCH-object-ordering bug + a Nokia moqt-nr Joining-Fetch-on-Forward-State-0 bug), so none of those show here. Still targets draft-18.

The prior Sep-7 nightly: 2026-09-07 00:29:12 UTC — 434 cells / 210 pass / 224 fail / 0 skip (48.4% pass; at-target draft-18 298 · ahead 19 · behind 117). Pass −1 (211 → 210), fail +1, with the at-target / ahead / behind split byte-identical (298 / 19 / 117) to the Sep-6 cut — a single within-band fail flip, no reclassification or roster change. (Nokia’s moqt-nr clearing the moxygen conformance suite Sep-7 15:09 CEST landed after this ~00:29 UTC cut, so its effect, if any, shows on the next nightly.) Still targets draft-18.

The prior Sep-6 nightly: 2026-09-06 00:29:32 UTC — 434 cells / 211 pass / 223 fail / 0 skip (48.6% pass; at-target draft-18 298 · ahead 19 · behind 117). Pass +4 (207 → 211, a new high), fail −4, with the at-target / ahead / behind split byte-identical (298 / 19 / 117) to the Sep-5 cut — so all four new passes are cells flipping fail→pass within their existing version band, more of the within-band tail of the Day-3 relay-sweep fixes reaching the nightly rather than any new endpoint or reclassification. Still targets draft-18.

The prior Sep-5 nightly: 2026-09-05 00:25:46 UTC — 434 cells / 207 pass / 227 fail / 0 skip (47.7% pass; at-target draft-18 298 · ahead 19 · behind 117). Pass +10 (197 → 207, a new high), fail −10, with the at-target / ahead / behind split byte-flat (298 / 19 / 117) off the Sep-4 cut — so all ten new passes are cells flipping fail→pass within their existing version band (largely the at-target draft-18 group), the tail of the Day-3 relay-sweep fixes (Nokia’s duplicate-object gone + FETCH-inclusive fix, imquic priority fix) reaching the nightly.

The prior Sep-4 nightly: 2026-09-04 00:24:41 UTC — 434 cells / 197 pass / 237 fail / 0 skip (45.4% pass; at-target draft-18 298 · ahead 19 · behind 117). This is the cut where the Sep-3 relay-conformance sweep lands: pass +30 (167 → 197, a new high), fail −17, and skip 13 → 0 off the Sep-3 00:26:57 cut. It ran after the Sep-3 daytime fixes (Nokia moqt-nr patch, imquic prefix-routing restore, aiomoqt rc3 with d16+d18 12/12), and the previously-skipped 13 cells all now execute. at-target ticked 302 → 298 (−4) while ahead rose 15 → 19 (+4), so the pass gains spread across both at-target and ahead cells rather than concentrating in the draft-18 group. Still targets draft-18.

The prior Sep-3 nightly: 2026-09-03 00:26:57 UTC — 434 cells / 167 pass / 254 fail / 13 skip (38.5% pass; at-target draft-18 302 · ahead 15 · behind 117). A quiet nightly: pass +2 / fail −2 off the Sep-2 21:38:48 hackathon cut, with the at-target / ahead / behind split byte-flat (302 / 15 / 117). This cut ran at ~00:27 UTC, before the Sep-3 daytime relay sweep — so those fixes reached the matrix only on the Sep-4 cut above.

The prior Sep-2 hackathon cut: 2026-09-02 21:38:48 UTC — 434 cells / 165 pass / 256 fail / 13 skip (38.0% pass; at-target draft-18 302 · ahead 15 · behind 117) — the Sep-2 draft-18 hackathon cut. The matrix grew +58 cells off the same-day 00:26:02 UTC cut (376 / 143 / 221 / 12, at-target 250) as the hackathon’s new endpoints wired in — moqtail’s live draft-18 relay at relay18.moqtail.dev (runner #121), mlmrel (runner #120), OpenMOQ’s moq-playa @moqt TypeScript client (runner #119), and the embedded moq.dev client bumped to 0.19 (runner #122). Pass climbed 143 → 165 (+22) and at-target draft-18 250 → 302 (+52) across the two Sep-2 cuts. The hackathon’s manual conformance loop (see Conformance sweep) — moqtail 4/17 → 53/59, moq-rs Sections 1–7, moxygen 74/76 — is the fuller story; the nightly matrix is a lagging aggregate. Still targets draft-18.

The prior day’s 2026-09-01 00:31:10 UTC cut — 347 cells / 126 pass / 210 fail / 11 skip (36.3% pass; at-target draft-18 231 · ahead 3 · behind 113). The matrix trimmed 4 cells (351 → 347, skip +1 to 11), but the composition shifted markedly toward the target: at-target draft-18 rose +21 (210 → 231) while behind fell −25 (138 → 113) — roughly two dozen cells reclassifying from an older draft onto draft-18 as implementations converge ahead of the Sep-2 virtual interop hackathon (registered draft-18 changes: runner #114 put moqlivemock on draft-18, #116 added a stitcher-moq client, #117 gave moq-go a draft-20 moqt-20 ALPN). Pass ticked +1 to 126; the relay roster now lists moq-rs, moq-rs-draft-14 and moq-rs-draft-18 as distinct endpoints, reflecting the conformance split. Still targets draft-18.

The prior day posted two Aug-31 cuts (both on the 351-cell matrix): 00:29:26 UTC — 351 / 122 / 219 / 10 — then 04:12:16 UTC — 351 / 125 / 216 / 10 (at-target 210 · 3 · 138), so pass climbed 116 (Aug-30) → 122 → 125 → 126 (Sep-1) — a +10 recovery off the Aug-30 low, lining up with the draft-18 conformance work landing on the relays (moq-rs merged its “support draft-18 subgroup modifiers” fix #224 at 02:39 UTC between the two Aug-31 cuts). (See Conformance sweep below — afrind’s moxygen conformance run drove the moq-rs fixes; moq-rs went from failing before SUBSCRIBE on Aug-30 to passing conformance Sections 1 and 2 by Sep-1.)

The four prior 351-cell cuts: 2026-08-30 00:28:30 UTC — 351 / 116 / 225 / 10 — the −7 slip to the expanded-matrix low this recovery erases; 2026-08-29 00:23:47 UTC — 351 / 123 / 218 / 10 — the +2 bounce (first up-day on the expanded matrix); 2026-08-28 02:52:10 UTC — 351 / 121 / 220 / 10 — the first clean nightly on the expanded matrix (pass −8 vs the expansion re-run, a new low on 351 as stitcher-moq and drift settled in); and 2026-08-27 14:16:15 UTC — 351 / 129 / 212 / 10 — the matrix expansion (+30 cells, 321 → 351) itself, the runner’s fourth structural expansion and its first growth since the Aug-19 contraction: the stitcher-moq relay (Pluto TV / Paramount) was enrolled when runner PR #112 merged 14:01 UTC (alongside PR #111 documenting the moxygen/moqx draft-18 client ALPN gap). at-target rose 190 → 210 (+20), ahead 1 → 3 (+2), behind 130 → 138 (+8); pass ticked +1 to 129 but fail jumped +29 to 212 as the freshly-wired cells mostly failed on their first cut — the runner’s recurring first-cut-of-an-expansion pattern (so the absolute pass number is not comparable across the expansion). This is the pre-Sep-2-hackathon broadening Mike English flagged (more data-plane coverage, possible results-presentation redesign). Aug-27 also had a ~nightly 01:30:43 run on the old 321-cell matrix — 321 / 122 / 189 / 10 (at-target 190 · ahead 1 · behind 130), a −6 pass post-contraction low — before the 14:16 expansion re-run once 111 landed.

Conformance sweep: live relays

Separate from the nightly runner, afrind has been driving moxygen’s draft-18 conformance script against the live relay endpoints registered in the runner, and expanding its coverage (PUBLISH tests landed; FETCH and joining-FETCH expected in place by the Sep-2 hackathon). The Aug-30 baseline run (posted to Slack #moq) found draft-18 interop in rough shape — of the eight relays probed, only moxygen (Meta) and moqx (OpenMOQ) cleared Section 1 (Basic Forwarding Preferences) 4/4 over both QUIC and WebTransport; the rest failed before a subscribe could complete:

RelayWhere it broke (afrind’s Aug-30 probe)Aug-31 status
moq-rs (draft-18)SUBSCRIBE reaches the server and SubscribeOk is sent, the relay opens subgroup stream id=6 — then resets it ~39 ms later, error=0, so no objects flowPassing conformance Sections 1 and 2 (Sep-1) after mike-english landed conformance fixes (incl. a datagram fix on draft-18-dev) — up from Section 1 tests 1–3 with Test 4 (DATAGRAM) failing on Aug-31; Section 3 now the front (afrind: “Section 3 had some troubles, I’m checking”)
moq-dev-rsPUBLISH accepted, but the relay never forwards the subscribe upstream (0 received); client gets onSubscribeOk, then nothing—
imquicH3 connectSuccess, then total silence — no MoQ SETUP on either side—
moqt-nr (Nokia)Frame underflow → parse error, conn error=3 parsing their SETUP (wire-format mismatch)—
stitcher-moq (Pluto TV / Paramount)PublishNamespaceError code=400 reason=unauthorized on moq-test-00—

afrind noted the failures could equally be moxygen (the test client) bugs.

Sep-2 hackathon results — the conformance loop (afrind runs moxygen’s moq-test script against each live relay, posts the per-section matrix, the author fixes and redeploys) turned the Aug-30 rough picture around. The suite now runs 10 sections (1 Basic Forwarding Preferences · 2 Object/Group Counts · 3 Object Sizes · 4 Group/Object Increments · 5 End-of-Group Markers · 6 Extensions · 7 Complex Scenarios · 8 PUBLISH · 9 FETCH Ranges · 10 Joining FETCH), with Sections 9–10 added Sep-1. End-of-day scores (Slack #moq):

RelaySep-2 resultMovement
moxygen (Meta)74/76 quic · 75/76 WTRecovered from a self-inflicted 58/76 quic · 69/76 WT over a real cross-country network (afrind: “I failed my own test suite … How embarrassing”) — network-timing bugs in the harness itself
moq-rs (Cloudflare)43/59 — Sections 1–7 ✅From Sections 1&2 (Sep-1); four Sep-2 fixes (#228–#231). Fails Section 8 (PUBLISH), Section 10 (Joining FETCH)
moqtail (OzU)53/59From 4/17 at deploy — a live bug-fix loop (afrind + Aman Sharma found, Gürel fixed): PUBLISH_DONE held until data streams arrive (#382), a concurrent-PUBLISH track-record race (#381/#383), plus DUPLICATE_SUBSCRIPTION / REQUEST_ERROR-on-control-stream / REQUEST_UPDATE-for-PUBLISH / FIN-vs-reset / FETCH-prefix-routing bugs still open at day’s end. New live relay relay18.moqtail.dev
moq-net (Pluto TV, stock moq-dev)6/6 both transportsRiedl’s client — a positive control isolating the relay-side prefix-routing gap shared by imquic, moq-rs and aiomoqt

aiomoqt (Python, Marzot/Vivoh) also stood up a relay role and ran the conformance suite from a pinned moxygen build, cutting 0.11.0rc2 to PyPI during the session.

Sep-3 — the sweep extends to three more relays. The same loop (afrind + Aman Sharma drive the moq-test client, Steven Riedl’s stock-moq-dev moq-net client as the positive control) hardened Nokia’s, Miniero’s, and aiomoqt’s relays in one day:

RelaySep-3 movementWhere it still broke
moqt-nr (Nokia)Patched overnight; 6 clients pass (Yu You’s run) and 12/12 both transports from Riedl’s client; registered for draft-19 in the runnerafrind’s readiness probe: relay zeroes publisher-priority (200→0) and the contains-last-in-group flag, delivers the object twice; undefined Type-0 param in REQUEST_OK; FIN-instead-of-reset; never sends NAMESPACE_DONE
imquic (Miniero)Prefix-based routing restored; fixed a pending-publisher-gone hang (SUBSCRIBE for a released namespace now errors instead of hanging) and an unanswered TRACK_STATUSStill drops publisher priority across the hop and doesn’t honour AbsoluteRange subscription ranges (Miniero: “look at both tomorrow”)
aiomoqt “ersatz-relay” (Marzot)0.11.0rc3 to PyPI; CI conformance’s first green run — d16+d18 12/12; relay gained SUBSCRIBE_TRACKS→PUBLISH fan-out (§9.5)Fixed the Aman batch (undefined PUBLISH_NAMESPACE_DONE, wrong-stream REQUEST_ERROR, equality-vs-prefix matching, delivery-semantics bug, missing TRACK_STATUS)

The recurring finding across all three (and the Sep-2 moqtail / moq-rs relays) is prefix-based announce routing: moq-net registers announce-interest with a root/empty prefix, so it needs prefix routing, and its clean 6/6 (Sep-2) and 12/12 (Sep-3) isolate the gap as relay-side. The sweep also diagnosed two moq-net / moq-rs wire bugs for upstream — a spurious “Number of Extensions” varint in every moq-rs SUBSCRIBE_OK, and an ALPN-vs-SETUP version-selection mismatch — recorded on discussions-2026-09.

Sep-4 — Day-3, narrowed to Nokia and imquic. The two relays with bugs still open ran another round:

RelaySep-4 movementWhere it still broke
moqt-nr (Nokia)Duplicate-object fixed (Yu You traced it + the priority-0 to one root cause — a uni-stream object delivered both from the pending buffer and live), FETCH End-Location off-by-one fixed (was inclusive; spec is “End Location, plus 1”)Publisher priority now Actual=128 Expected=200 (partial fix from 0); new bug: subscriber B with FORWARD=0 still receives the first group’s objects
imquic (Miniero)Priority issue reported fixedObject stream never FIN-closes after PUBLISH_DONE (within 1 s); the AbsoluteRange bug reproduces only when start group = 0 (relay uses end_group == 0 as an “unbounded” sentinel); relay sends duplicate NAMESPACE_DONE — Miniero to retest “Monday”

The Sep-3 sweep’s gains reached the nightly matrix on the Sep-4 00:24:41 cut (pass +30, skip 13 → 0 — see Current standing). afrind pointed Yu You at moxygen’s CONFORMANCE_README.md and PR #227 (per-object/track-level deadline, OPEN) to run the conformance client, noting the openmoq/moxygen fork carries a not-yet-upstreamed client bug-fix (with pre-built Docker images/tarballs).

Correction (Aug-31): the “OpenMOQ commit 86bbc5e uint8-vs-varint” diagnosis was retracted. A prior version of this page recorded Luke Curley’s Aug-30 claim that OpenMOQ’s decode_subscribe_message mis-decoded raw-uint8 SUBSCRIBE parameters (FORWARD/SUBSCRIBER_PRIORITY/GROUP_ORDER) as varints. On Aug-31 afrind pointed out the referenced code “isn’t OpenMOQ — this is facebookexperimental/moxygen. The paths you reference aren’t moxygen code,” and Luke withdrew it: “ignore me i trusted AI.” The diagnosis was AI-hallucinated (it cited a commit/paths that don’t correspond to real moxygen/OpenMOQ code) and is void — moxygen/moqx were the two relays that passed Section 1, not the ones failing. afrind added he is “cracking down on ai generated issues in the repo” (see discussions-2026-08).

Aug-31 → Sep-1 progress. After the retraction, Mike English landed real fixes to moq-rs — “We definitely weren’t handling all of the permutations correctly before” — and an Aug-31 re-run showed moq-rs passing Section 1 tests 1, 2 and 3 on both QUIC and WebTransport, with only Test 4 (DATAGRAM) still failing. English then landed a datagram fix on draft-18-dev (Aug-31 23:35), and afrind’s Sep-1 05:08 re-run reported “Sections 1 and 2 passed for your moq-rs-18 Mike. Section 3 had some troubles, I’m checking” — so moq-rs now clears the full first two conformance sections, with Section 3 the current front. This lifted the automated runner too (see Current standing: pass 116 → 122 → 125 → 126 across Aug-31 → Sep-1, with moq-rs #224 landing between the two Aug-31 cuts). Meanwhile English began folding this conformance coverage into the interop runner itself — runner PR #103 (new direct-PUBLISH-lifecycle test cases) with companion #115 (data-plane tests), both still OPEN, reusing afrind’s portable moq-test publisher class (with a floated per-run unique track ID test-<128-bit-run-id> to avoid cross-contamination) — discussed in the dedicated #moq-interop-runner Slack channel. This is the concrete draft-18-readiness picture the Sep-2 virtual interop hackathon is meant to harden.

The Aug-19 contraction — one implementation moved ahead and left the matrix

The headline number changed shape on 2026-08-19, and the cause is specific rather than a generic “resize”: moq-go upgraded itself from draft-18 to draft-19, and in doing so fell out of nearly every pairing in the runner.

  • On the Aug-18 cut, moq-go ran at draft-18 against ~13 relay endpoints (aiomoqt-relay ×2, imquic ×3 transports, moq-dev-rs ×3, moq-rs-draft-18 ×3, moqt-nr ×2, moqx ×3, moxygen ×3, xquic-draft-18) plus itself — around 30 at-target runs, most of them failing 0/6.
  • On the Aug-19 cut and since, moq-go is labeled draft-19 and appears in exactly one pairing: moq-go → moq-go, draft-19, docker, 6/6 pass. Every cross-implementation cell it had is gone, because the runner only pairs endpoints that version-match.
  • That accounts for the whole move: at-target 220 → 190 (−30), ahead 0 → 1 (+1) — the self-pair reclassified — for a net −29 cells (350 → 321). behind stayed frozen at 130 (the draft-14 / draft-16 endpoints).

Two readings follow, and both matter:

  1. The raw pass drop is not a regression. Pass fell 135 → 126, but pass rate rose: 38.6% (135/350) on Aug-18 → 39.3% (126/321) on Aug-22. The cells that vanished were disproportionately moq-go failures. The genuine signal is the small −3 drift across Aug-19 → Aug-21 on a constant 321-cell matrix (129 → 128 → 126), then flat on Aug-22.
  2. Running ahead of the target currently costs you all cross-implementation coverage. moq-go is the first endpoint ever scored ahead, and its reward is a matrix row that only tests against itself. With the Sep-2 virtual interop hackathon explicitly targeting draft-18, and draft-20 not becoming the target until the Oct 12–15 Seattle interim, an implementation that jumps to draft-19 early is invisible to the shared matrix in the meantime. Worth watching whether the runner grows cross-version pairing before draft-22 lands as the next official target.

Aug-22 report detail: aiomoqt scores a clean 18/18 against moqx, moxygen, and moq-rs-draft-18; xquic over the docker transport fails broadly across relays, while the remote-quic transport outperforms docker for several draft-18 pairings. One skip source is a missing relay image (moq-interop-runner-xquic-moq-relay-draft-18:latest reported unavailable).

Day-over-day cell churn (per the gh-pages summaries):

  • Aug 19→20 (−1): moq-rs→moqtail d16 WT and moq-rs-draft-14→moq-dev-rs d14 WT went pass→fail; moqlivemock→imquic d16 WT went fail→pass.
  • Aug 20→21 (−2): moq-rs→moqtail d16 WT recovered; moq-rs-draft-14→moqx d14 (QUIC and WT) and →moxygen d14 WT went pass→fail.
  • Aug 21→22 (flat, 4 up / 4 down): aiomoqt→moq-dev-rs d18 WT, imquic→moxygen d18 docker, moq-rs-draft-14→moxygen d14 WT, and moxygen→imquic d18 remote-QUIC all went fail→pass; imquic→moq-rs-draft-18 docker, moq-rs→moq-rs d16 docker, moq-rs-draft-14→moxygen d14 QUIC, and moxygen→aiomoqt-relay d18 docker went pass→fail.

Daily cuts

Cut (UTC)CellsPassFailSkipAt-targetAheadΔ passNote
2026-10-06 00:28:244772182572——+16partial flake recovery (202 → 218), still short of 237 high; matrix flat; stitcher-moq relay +11, moqlivemock client +4, moq-rs-d14 relay +4; 2 moqt-22 cells back to green; imquic client (3) & moqx relay (21) not yet reverted
2026-10-05 00:29:574772022732——−35one-night flake regression (wipes Oct-4 high); matrix flat, no runner PR; imquic client 16→3, moqx/stitcher-moq relays −13 each; 2 moqt-22 cells red
2026-10-04 01:06:574772372382——+3new absolute pass high (237); fail below 240 first time (238); matrix flat at 477; flake-level churn (5 flip pass, 2 regress); moq-dev-rs holds 39, stitcher-moq flat 30
2026-10-03 00:25:324772342412——+7matrix +14 → 477 (runner #133 adds libquicr d18 remote cells, −4 dead d14/xquic); moq-dev-rs recovers +8 pass via #134; new absolute pass high (234)
2026-10-02 00:28:39463227235133622+449.0%, best rate on a 50+-cell matrix; moqtail relay recovers (4 → 7 pass); quic-zig → imquic first pass
2026-10-01 00:32:06463223238233622−1matrix −12 → 463: runner #131 drops moqx d14 pairings; behind 117 → 105 (all 12 were failing)
2026-09-30 00:28:21475224249233622+5within-band recovery; moq-rs-draft-14 → moqx now a persistent fail (moqx dropped d14)
2026-09-29 00:27:54475219254233622−8flake cluster (moq-playa/quic-zig/moq-dev-js pairs) + first moqx d14 rejections
2026-09-28 00:31:12475227246233622−3within-band flake
2026-09-27 00:30:44475230243233622+8all-time pass high (230); within-band recovery continues
2026-09-26 00:25:54475222251233622+3within-band flake
2026-09-25 00:26:19475219254233622+11recovery off the Sep-24 dip
2026-09-24 00:25:07475208265233622−8dip on the newly widened matrix
2026-09-23 00:26:04475216258233622+15matrix +38 → 475; quic-zig enrolls at target (runner #127), at-target 298 → 336
2026-09-03 00:26:574341672541330215+2quiet nightly; at-target/ahead/behind split byte-flat; ran before the Sep-3 daytime relay sweep
2026-09-02 21:38:484341652561330215+22hackathon cut; matrix +58 (moqtail relay18, mlmrel, moq-playa, moq.dev-0.19 wired in)
2026-09-02 00:26:02376143221122503+17morning cut; matrix +29 vs Sep-1 (pre-hackathon roster)
2026-09-01 00:31:10347126210112313+1matrix −4 → 347; at-target +21 (→231), behind −25 (→113) as impls converge on draft-18 pre-hackathon; stitcher-moq client + moq-go draft-20 ALPN registered
2026-08-31 04:12:16351125216102103+3second Aug-31 cut; new high on the 351-cell matrix; moq-rs #224 landed 02:39 UTC
2026-08-31 00:29:26351122219102103+6first Aug-31 cut; recovery off the Aug-30 low begins
2026-08-30 00:28:30351116225102103−7new low on the expanded matrix; gives back the Aug-29 bounce
2026-08-29 00:23:47351123218102103+2first up-day on the expanded matrix; bounce off the Aug-28 low
2026-08-28 02:52:10351121220102103−8first clean nightly on the 351-cell matrix; new low on the expanded matrix
2026-08-27 14:16:15351129212102103+7matrix +30 → 351: stitcher-moq relay enrolled (PR #112); at-target +20, first growth since the contraction (Δ vs the same-day 01:30 cut)
2026-08-27 01:30:43321122189101901−6nightly cut on the old matrix; post-contraction low
2026-08-26 00:13:53321128183101901+3biggest gain since the contraction
2026-08-25 00:12:46321125186101901+1third straight +1/day
2026-08-24 00:13:06321124187101901+1
2026-08-23 00:14:05321123188101901−3post-contraction low
2026-08-22 00:13:583211261851019010flat
2026-08-21 00:13:55321126185101901−2
2026-08-20 00:12:54321128183101901−1
2026-08-19 00:12:57321129182101901−6moq-go → draft-19; its ~30 pairings leave the matrix (−29 cells); first-ever “ahead” cell
2026-08-18 00:13:26350135204112200+22nd-best on 350-cell matrix
2026-08-17 00:12:07350133206112200+2
2026-08-16 00:12:41350131208112200−3
2026-08-15 00:12:56350134205112200+5
2026-08-14 00:24:37350129210112200−6
2026-08-13 00:23:34350135204112200−1
2026-08-12 00:22:23350136203112200+9350-cell-matrix pass high
2026-08-11 00:18:17350127212112200−6
2026-08-10 00:19:31350133206112200+2morning of Aug-10 interim
2026-08-09 00:18:24350131208112200−1
2026-08-08 00:18:103501322071122000byte-identical to Aug-7
2026-08-07 01:14:34350132207112200+3
2026-08-06 00:29:02350129210112200−1
2026-08-05 00:32:35350130209112200+1
2026-08-04 00:34:04350129210112200−2
2026-08-03 00:36:00350131208112200+1
2026-08-02 00:35:003501302091122000byte-identical to Aug-1
2026-08-01 00:34:17350130209112200−3
2026-07-31 00:35:11350133206112200+1first 350-cell high

Longer history

The runner has gone through three structural expansions and one contraction, and each one moves the pass count more than any week of real implementation work does:

  • July 2 — matrix +28 to 294; at-target draft-18 78 → 152, which then held for five cuts through the draft-18-only era (July 2–6).
  • July 7 — matrix +25 to 319 and all 34 skips cleared to zero. Pass then climbed three straight cuts as new cross-version cells converted green: +14 (93→107) July-8, +17 (→124) July-9, +8 (→132) July-10. It then oscillated 130↔132 for a week on a byte-identical matrix, broke up to 136 July-16 and 137 July-17, slipped to 132 July-18, recovered to 134 July-19.
  • July 20 — matrix +19 to 338; fresh draft-18 endpoints all failed on their first cut (pass flat at 134), then +8 to 142 July-21 as they converged, flat 142 July-22.
  • July 23 — matrix +12 to 350, at-target to 220; pass fell −12 to 130 and skips reappeared (0 → 11). The 350-cell matrix then held for 27 consecutive cuts (July 23 → Aug 18), pass wandering in a 126–136 band.
  • Aug 19 — the first contraction: −29 to 321, at-target 220 → 190, and the first-ever ahead cell — caused not by a runner change but by moq-go moving to draft-19 and losing every version-matched pairing.
  • Aug 27 — the fourth expansion and first growth since the contraction: +30 to 351, at-target 190 → 210, ahead 1 → 3, behind 130 → 138, when the stitcher-moq relay (Pluto TV / Paramount) was enrolled (runner PR #112, 14:01 UTC). Pass ticked +1 to 129 while fail jumped +29 to 212 — the freshly-wired cells failing on their first cut, exactly as prior expansions did. (The same day’s earlier 01:30 nightly cut, still on the 321-cell matrix, had slipped −6 to a post-contraction-low 122.)

The recurring pattern: every structural change drops the raw pass count on its first cut before the newly-wired cells converge — so cross-expansion comparisons of the absolute pass number are close to meaningless. Pass rate and the at-target/ahead/behind split are the durable readings.

The runner still targets draft-18 and has not advanced to draft-19 — though moq-go is now running draft-19 ahead of it, and the interim-2026-moq-21 minutes name draft-22 as the eventual next official target.

Live interop (Vienna Hackathon)

The IETF-126 Hackathon (Vienna, week of July 20) began generating live, human-run interop on July 18 — supplementing the automated nightly runner:

  • Mike English’s draft-18 single-instance testing relay draft-18-interop.cloudflare.mediaoverquic.com:443 (also the runner’s moq-rs-draft-18 endpoint) was put forward for live testing. Yu You (Nokia) ran a basic v18 conformance client against it: 4 / 7 tests pass (setup-only, announce-only, publish-namespace-done, subscribe-error) but announce-subscribe, object-vectors, and subscribe-before-announce all fail — the relay rejects PUBLISH with errCode=0x0 reason="not supported" (the Cloudflare draft-18 relay does not yet accept the upstream PUBLISH flow).
  • Lorenzo Miniero’s first draft-19 imquic relay at lminiero.it:9000 (see interop-endpoints) — a call for draft-19 peers, with filters only partially supported.
  • Luke Curley’s Hang stack demoed against Jordi Cenzano (Meta): cdn.moq.pro/anon (draft 14-19), the moq.pub / moq.watch JS clients, the moq-cli Rust CLI, and RTMP/SRT/WHEP converters — all fronting the same broadcast.

July 19 (Hackathon Day 1, Sunday) was the window’s richest live-interop day — five relays under simultaneous cross-implementation test, with results logged to the ad-hoc interop wiki (Mike English gathering notes for Friday’s interop report):

  • Relays exercised: Moxygen fb.mvfst.net:9448/moq-relay (afrind), imquic lminiero.it:9000 (Miniero, draft-19), Nokia moqt://moqt.nokiaresearch.com:4443/moq (Yu You, draft-18, with July-19 fixes for redundant request_ids + subscriber-forced forwarding), Cloudflare draft-18-interop.cloudflare.mediaoverquic.com:443, and Luke Curley’s cdn.moq.pro/anon.
  • Jordi Cenzano’s matrix (Meta moq-encoder-player, MOQ-MIv3 packager migrating to LOC): Moxygen, imquic (Miniero’s), and Nokia all achieved full video+audio publish/subscribe; Cloudflare failed on PUBLISH (“seems NOT implemented”), and cdn.moq.pro/anon failed on subscribe (“publisher not found” / “Track does not exist”).
  • Kota Yatagai’s Moqtopus (draft-18 subscriber) verified SETUP/SUBSCRIBE/SUBSCRIBE_OK/REQUEST_ERROR against Moxygen, plus PUB_NS+SUBSCRIBE against Nokia (subgroup + datagram modes) and REQUEST_UPDATE OK/ERROR — logged in a +2007-line publisher/subscriber-flow commit “at IETF126.”
  • aiomoqt (Giovanni Marzot, v0.10.6) ran a Python control-plane interop regression with “good results.”
  • Two spec-interpretation findings surfaced on the floor: (1) a rendezvous-timeout semantics debate — whether a relay should always issue upstream subscriptions when a PUBLISH_NAMESPACE is advertised, or only after a RENDEZVOUS_TIMEOUT (afrind ↔ Yu You; Nokia deployed a mid-Hackathon fix so PUB_NS-then-SUBSCRIBE routes without a timeout); (2) cdn.moq.pro’s IETF path is “nowhere near as tested” as Hang’s own clients — it sends unsolicited PUBLISH_NAMESPACE (a legacy holdover) and SUBSCRIBE against a foreign publisher was failing. Luke Curley also stated Hang will likely never implement the draft-19 filters because they “complicate billing.”

July 20 (Hackathon Day 2, Monday) produced the window’s biggest interop milestone and continued the debugging:

  • First cross-implementation draft-19 interop. Luke Curley’s Rust moq-cli (moq-dev build 0.8.7-24f8528ed) interoped successfully with Miniero’s imquic draft-19 relay lminiero.it:9000: auto-negotiation produced a 124,451-byte fMP4 (ffprobe-validated H.264 320×180), forced draft-19 succeeded (76,804 bytes, 5.23 s) and forced draft-18 also succeeded — two independent draft-19 codebases on the wire together for the first time. (Drafts 16/17 connected but produced no media; 14/15 failed at H3 CONNECT — Miniero has dropped 14/15 support.)
  • moq-cli ↔ Moxygen (fb.mvfst.net:9448): raw-QUIC draft-18 succeeded end-to-end (2.48 MB MP4, H.264 320×180 @ 30 fps, AAC, clean FFmpeg decode), but HTTPS/WebTransport failed — both sides hit WT_BUFFERED_STREAM_REJECTED (0x3994bd84) and the subscriber received zero bytes; afrind shipped a buffered-stream fix later July 20.
  • Nokia (moqt://moqt.nokiaresearch.com:4443/moq) — Yu You fixed the SUBSCRIBE_TRACKS / SUBSCRIBE_NAMESPACE split and a lingering deprecated STREAM_HEADER_TRACK (0x50) stream opener, redeploying twice July 20 for Luke Curley to test.
  • Cloudflare (draft-18-interop.cloudflare.mediaoverquic.com:443) — mixed: Kota Yatagai’s Moqtopus reached full PASS (PUB_NS + SUBSCRIBE in both subgroup and datagram modes, plus REQUEST_UPDATE OK/ERROR — logged to the ad-hoc wiki July 20), but Jordi Cenzano’s moq-encoder-player still failed with objects not flowing because “the relay closes the control QUIC streams for those subscriptions immediately after the publisher sends SUBSCRIBE_OK.”
  • cdn.moq.pro/anon stayed broken over native QUIC — /anon returns a 401 and QUIC PATH is not wired through for the IETF path (only for moq-lite / qmux), so afrind could not authenticate; Luke suggested the authenticated ?jwt= URL or qmux (TCP/TLS/WebSocket) as workarounds. A durable auth-model design signal emerged: Luke wants SUBSCRIBE_NAMESPACE mandatory with PUBLISH_NAMESPACE as an optional RTT optimization, while afrind noted the two carry different authorization models (SUBSCRIBE_NAMESPACE = the subscriber implicitly trusts the publisher for any track under the namespace; PUBLISH_NAMESPACE is separately authorized).
  • afrind asked for a canonical list of available draft-18 relays and pointed testers at moxygen’s data-plane conformance suite for relays (requires prefix-based routing).

Per the ad-hoc interop wiki (Kota’s July-20 edit), the Moqtopus draft-18 matrix now shows Nokia, Meetecho, Moxygen, and Cloudflare all PASS PUB_NS/SUBSCRIBE (subgroup + datagram); only moq.pro fails (peer shutdown after SETUP). Mike English is gathering these ad-hoc reports for Friday’s (July 24) interop report.

July 22 (between sessions) — afrind’s data-plane conformance suite becomes the de-facto draft-18 relay benchmark. afrind ran his 41-test draft-18 data-plane conformance suite (moxygen’s suite, moq-test-based, requires prefix-based routing) against the live relays and reported that Nokia’s relay passed all 41 tests over both raw QUIC and WebTransport — the first relay to clear the full suite — and challenged others to match it. Zafer Gürel said moqtail is “working on it, a few issues left” (and shipped a matching second relay batch the same day — FETCH range/joining-fetch semantics, reserved-namespace rejection, PUBLISH_BLOCKED on stream exhaustion). Miniero’s imquic needs a prefix-routing fix before it can be tested against the moq-test-based suite. afrind still could not get subscriptions running through cdn.moq.pro and was unsure of the current Cloudflare relay status. This 41-test suite (distinct from Yu You’s earlier 7-test client check) is emerging as the concrete relay-readiness bar ahead of Friday’s interop report.

July 23 (IETF-126 Thu/Fri) — MOQtail joins the full-A/V set; MOQtail deploys a public draft-18 relay. Jordi Cenzano’s updated v18-MOQMIv3 moq-encoder-player matrix now shows MOQtail carrying full video + audio alongside Moxygen, imquic (Miniero’s), and Nokia — while Cloudflare and cdn.moq.pro both fail on SUBSCRIBE, each closing the QUIC stream. Kota Yatagai root-caused the Cloudflare failure: the relay retains a namespace/track-name after the session ends, so a same-name re-publish is treated as a request arriving after PUBLISH_DONE. Zafer Gürel brought a public MOQtail draft-18 relay online at relay18.moqtail.dev (public Grafana dashboard; see interop-endpoints); early testing found raw-QUIC ALPN=moqt-18 negotiation failing for Moqtopus and afrind (relay also advertises h3) though imquic’s client connects. Jordi is migrating his packager MOQMI→LOC and reported a player refactor that simplified audio/A-V sync via newer AudioContext capabilities. Mike English gathered the ad-hoc reports (including Giovanni Marzot’s aiomoqt run) for Friday’s interop report — which is not yet published in any official source.

The full day-by-day score history lives in the wiki log (Interop bullet in each daily entry).

Best Performing Pairs

  • moq-rs-draft-16 ←> moq-rs-draft-16: All tests pass (self-test)
  • moq-dev-js ←> moqx: 6/6 pass
  • moq-rs-draft-16 ←> moqx: 5-6/6 pass
  • moq-rs-draft-16 ←> moxygen: 5-6/6 pass
  • moq-rs-draft-16 ←> imquic: 5-6/6 pass
  • moq-rs ←> moq-rs: All tests pass (self-test, draft-14)
  • moq-rs ←> moqx: All tests pass (draft-14)

Getting Started

To add a new implementation to the runner, see the getting started guide.

Related