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
| Endpoint | Project | Draft (Aug-22) | Notes |
|---|---|---|---|
aiomoqt, aiomoqt-relay, aiomoqt-relay-quic | aiomoqt — Python asyncio (gmarzot) | 18 | Client + two relay roles; 18/18 vs moqx, moxygen, moq-rs-draft-18 on the Aug-22 cut |
imquic | imquic — lorenzo-miniero’s C library | 18 | Client and relay |
moq-dev-js, moq-dev-rs | moq (luke-curley) | 18 | JS/Hang player + Rust client and relay |
moq-go | Go implementation — not yet covered by a wiki page | 19 | Ahead 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-18 | moq-rs | 16 / 14 / 18 | Three draft-pinned endpoints; moq-rs-draft-18 is mike-english’s single-instance relay |
moq5 | Client — not yet covered by a wiki page | 18 | |
moqlivemock | Eyevinn moqlivemock (mlmtest, tobbe-einarsson) | — | Client role |
moqt-nr | Nokia relay (Yu You) — not yet covered by a wiki page | 18 → 18 / 19 | moqt.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 |
moqtail | moqtail (Zafer Gurel) | 16 | Relay |
moqtopus | Moqtopus — C++/MsQuic for Unreal Engine (Kota Yatagai) | 18 | Client |
moqx | OpenMOQ moqx | 18 | Client + relay |
moxygen | Meta’s C++ relay | 18 | Client + 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-moq | quiche (martin-duke, victor-vasiliev) | 16 | Relay |
stitcher-moq | Pluto TV / Paramount relay — not yet covered by a wiki page (Steven Riedl) | 18 → 20 | Relay; 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-18 | Alibaba XQUIC | 14 / 18 | Client + relay; draft-18 relay image reported unavailable on the Aug-22 cut |
libquicr | Cisco | 14 | Relay |
Coverage gap:
moq-go,moq5,moqt-nr, and (since Aug-27)stitcher-moqare 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 — thestitcher-moqclient ↔stitcher-moqrelay 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-moqclient 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:
| Relay | Where 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 flow | Passing 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-rs | PUBLISH accepted, but the relay never forwards the subscribe upstream (0 received); client gets onSubscribeOk, then nothing | — |
| imquic | H3 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):
| Relay | Sep-2 result | Movement |
|---|---|---|
| moxygen (Meta) | 74/76 quic · 75/76 WT | Recovered 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/59 | From 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 transports | Riedl’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:
| Relay | Sep-3 movement | Where 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 runner | afrind’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_STATUS | Still 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:
| Relay | Sep-4 movement | Where 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 fixed | Object 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
86bbc5euint8-vs-varint” diagnosis was retracted. A prior version of this page recorded Luke Curley’s Aug-30 claim that OpenMOQ’sdecode_subscribe_messagemis-decoded raw-uint8SUBSCRIBE 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-goran 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-gois 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).
behindstayed frozen at 130 (the draft-14 / draft-16 endpoints).
Two readings follow, and both matter:
- 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-gofailures. 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. - Running ahead of the target currently costs you all cross-implementation coverage.
moq-gois 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) | Cells | Pass | Fail | Skip | At-target | Ahead | Δ pass | Note |
|---|---|---|---|---|---|---|---|---|
| 2026-10-06 00:28:24 | 477 | 218 | 257 | 2 | — | — | +16 | partial 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:57 | 477 | 202 | 273 | 2 | — | — | −35 | one-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:57 | 477 | 237 | 238 | 2 | — | — | +3 | new 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:32 | 477 | 234 | 241 | 2 | — | — | +7 | matrix +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:39 | 463 | 227 | 235 | 1 | 336 | 22 | +4 | 49.0%, best rate on a 50+-cell matrix; moqtail relay recovers (4 → 7 pass); quic-zig → imquic first pass |
| 2026-10-01 00:32:06 | 463 | 223 | 238 | 2 | 336 | 22 | −1 | matrix −12 → 463: runner #131 drops moqx d14 pairings; behind 117 → 105 (all 12 were failing) |
| 2026-09-30 00:28:21 | 475 | 224 | 249 | 2 | 336 | 22 | +5 | within-band recovery; moq-rs-draft-14 → moqx now a persistent fail (moqx dropped d14) |
| 2026-09-29 00:27:54 | 475 | 219 | 254 | 2 | 336 | 22 | −8 | flake cluster (moq-playa/quic-zig/moq-dev-js pairs) + first moqx d14 rejections |
| 2026-09-28 00:31:12 | 475 | 227 | 246 | 2 | 336 | 22 | −3 | within-band flake |
| 2026-09-27 00:30:44 | 475 | 230 | 243 | 2 | 336 | 22 | +8 | all-time pass high (230); within-band recovery continues |
| 2026-09-26 00:25:54 | 475 | 222 | 251 | 2 | 336 | 22 | +3 | within-band flake |
| 2026-09-25 00:26:19 | 475 | 219 | 254 | 2 | 336 | 22 | +11 | recovery off the Sep-24 dip |
| 2026-09-24 00:25:07 | 475 | 208 | 265 | 2 | 336 | 22 | −8 | dip on the newly widened matrix |
| 2026-09-23 00:26:04 | 475 | 216 | 258 | 2 | 336 | 22 | +15 | matrix +38 → 475; quic-zig enrolls at target (runner #127), at-target 298 → 336 |
| 2026-09-03 00:26:57 | 434 | 167 | 254 | 13 | 302 | 15 | +2 | quiet nightly; at-target/ahead/behind split byte-flat; ran before the Sep-3 daytime relay sweep |
| 2026-09-02 21:38:48 | 434 | 165 | 256 | 13 | 302 | 15 | +22 | hackathon cut; matrix +58 (moqtail relay18, mlmrel, moq-playa, moq.dev-0.19 wired in) |
| 2026-09-02 00:26:02 | 376 | 143 | 221 | 12 | 250 | 3 | +17 | morning cut; matrix +29 vs Sep-1 (pre-hackathon roster) |
| 2026-09-01 00:31:10 | 347 | 126 | 210 | 11 | 231 | 3 | +1 | matrix −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:16 | 351 | 125 | 216 | 10 | 210 | 3 | +3 | second Aug-31 cut; new high on the 351-cell matrix; moq-rs #224 landed 02:39 UTC |
| 2026-08-31 00:29:26 | 351 | 122 | 219 | 10 | 210 | 3 | +6 | first Aug-31 cut; recovery off the Aug-30 low begins |
| 2026-08-30 00:28:30 | 351 | 116 | 225 | 10 | 210 | 3 | −7 | new low on the expanded matrix; gives back the Aug-29 bounce |
| 2026-08-29 00:23:47 | 351 | 123 | 218 | 10 | 210 | 3 | +2 | first up-day on the expanded matrix; bounce off the Aug-28 low |
| 2026-08-28 02:52:10 | 351 | 121 | 220 | 10 | 210 | 3 | −8 | first clean nightly on the 351-cell matrix; new low on the expanded matrix |
| 2026-08-27 14:16:15 | 351 | 129 | 212 | 10 | 210 | 3 | +7 | matrix +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:43 | 321 | 122 | 189 | 10 | 190 | 1 | −6 | nightly cut on the old matrix; post-contraction low |
| 2026-08-26 00:13:53 | 321 | 128 | 183 | 10 | 190 | 1 | +3 | biggest gain since the contraction |
| 2026-08-25 00:12:46 | 321 | 125 | 186 | 10 | 190 | 1 | +1 | third straight +1/day |
| 2026-08-24 00:13:06 | 321 | 124 | 187 | 10 | 190 | 1 | +1 | |
| 2026-08-23 00:14:05 | 321 | 123 | 188 | 10 | 190 | 1 | −3 | post-contraction low |
| 2026-08-22 00:13:58 | 321 | 126 | 185 | 10 | 190 | 1 | 0 | flat |
| 2026-08-21 00:13:55 | 321 | 126 | 185 | 10 | 190 | 1 | −2 | |
| 2026-08-20 00:12:54 | 321 | 128 | 183 | 10 | 190 | 1 | −1 | |
| 2026-08-19 00:12:57 | 321 | 129 | 182 | 10 | 190 | 1 | −6 | moq-go → draft-19; its ~30 pairings leave the matrix (−29 cells); first-ever “ahead” cell |
| 2026-08-18 00:13:26 | 350 | 135 | 204 | 11 | 220 | 0 | +2 | 2nd-best on 350-cell matrix |
| 2026-08-17 00:12:07 | 350 | 133 | 206 | 11 | 220 | 0 | +2 | |
| 2026-08-16 00:12:41 | 350 | 131 | 208 | 11 | 220 | 0 | −3 | |
| 2026-08-15 00:12:56 | 350 | 134 | 205 | 11 | 220 | 0 | +5 | |
| 2026-08-14 00:24:37 | 350 | 129 | 210 | 11 | 220 | 0 | −6 | |
| 2026-08-13 00:23:34 | 350 | 135 | 204 | 11 | 220 | 0 | −1 | |
| 2026-08-12 00:22:23 | 350 | 136 | 203 | 11 | 220 | 0 | +9 | 350-cell-matrix pass high |
| 2026-08-11 00:18:17 | 350 | 127 | 212 | 11 | 220 | 0 | −6 | |
| 2026-08-10 00:19:31 | 350 | 133 | 206 | 11 | 220 | 0 | +2 | morning of Aug-10 interim |
| 2026-08-09 00:18:24 | 350 | 131 | 208 | 11 | 220 | 0 | −1 | |
| 2026-08-08 00:18:10 | 350 | 132 | 207 | 11 | 220 | 0 | 0 | byte-identical to Aug-7 |
| 2026-08-07 01:14:34 | 350 | 132 | 207 | 11 | 220 | 0 | +3 | |
| 2026-08-06 00:29:02 | 350 | 129 | 210 | 11 | 220 | 0 | −1 | |
| 2026-08-05 00:32:35 | 350 | 130 | 209 | 11 | 220 | 0 | +1 | |
| 2026-08-04 00:34:04 | 350 | 129 | 210 | 11 | 220 | 0 | −2 | |
| 2026-08-03 00:36:00 | 350 | 131 | 208 | 11 | 220 | 0 | +1 | |
| 2026-08-02 00:35:00 | 350 | 130 | 209 | 11 | 220 | 0 | 0 | byte-identical to Aug-1 |
| 2026-08-01 00:34:17 | 350 | 130 | 209 | 11 | 220 | 0 | −3 | |
| 2026-07-31 00:35:11 | 350 | 133 | 206 | 11 | 220 | 0 | +1 | first 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
aheadcell — caused not by a runner change but bymoq-gomoving 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-moqrelay (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’smoq-rs-draft-18endpoint) 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 rejectsPUBLISHwitherrCode=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), themoq.pub/moq.watchJS clients, themoq-cliRust 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), imquiclminiero.it:9000(Miniero, draft-19), Nokiamoqt://moqt.nokiaresearch.com:4443/moq(Yu You, draft-18, with July-19 fixes for redundant request_ids + subscriber-forced forwarding), Cloudflaredraft-18-interop.cloudflare.mediaoverquic.com:443, and Luke Curley’scdn.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”), andcdn.moq.pro/anonfailed 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 unsolicitedPUBLISH_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 build0.8.7-24f8528ed) interoped successfully with Miniero’s imquic draft-19 relaylminiero.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 hitWT_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 theSUBSCRIBE_TRACKS/SUBSCRIBE_NAMESPACEsplit and a lingering deprecatedSTREAM_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’smoq-encoder-playerstill 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/anonstayed broken over native QUIC —/anonreturns a401and QUICPATHis 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 wantsSUBSCRIBE_NAMESPACEmandatory withPUBLISH_NAMESPACEas 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
- interop-status - Overall interop testing status
- interop-endpoints - Public relay endpoints