Two drafts read whole at the revision in the IETF archive on 10 November 2026, with
draft-gurel-moq-track-switching-01 beside the first. Neither module opens a stream or
is on a session's path: each is what a subscriber, a publisher and a relay compute.
- Subscriber-side track switching (draft-ugur-moq-fast-switching-00). joule-moq's
switching module reads a Switch Set from an MSF catalog's altGroup and
keyframeSpacing, with its GoP Ladders and its Alignment Unit, and refuses a set in
which a spacing is not a multiple of that unit. It gives the Frame Number, the
nearest Switch Point and its Distance, the track chosen under the draft's full
policy and its simpler one, and the End Group in both of its cases. SWITCH_FROM is
an unmerged pull request and is not in draft-ietf-moq-transport-23, and neither are
track-switching-01's altTrackGroup and Switch Track Alias: none is written. A
SwitchPlan states the switch as the two requests -23 has, a SUBSCRIBE of the target
with an absolute-start Location Filter at {targetGroup, 0} and a REQUEST_UPDATE
that ends the current subscription at the End Group, and the module's text says
what the drafts' parameters would add. The release buffer keys both tracks' objects
by Frame Number and presents each once, in order. A switch that would start inside
a Group, and one at a Group the target never publishes, are refused, each with its
own code.
- Probe tracks (draft-gurel-moq-probing-00). joule-moq's probe module parses Dynamic
Probe Names by the draft's grammar with every invalid case of its section 7.1 under
its own reason, resolves a probe as Figure 4 does in exact integer arithmetic, and
lists its objects: Location, payload size, release time, the lowest publisher
priority, LOC's Timestamp property and a payload of zeros. It holds the per-probe,
session and relay-wide limits with Table 5's defaults as a configuration and clamps
nothing, maps every outcome to its error code in both directions with its Retry
Interval, writes and reads the probe catalog (which has no member a limit could be
carried in), reads the session-scoped namespaces and the empty-namespace form, and
measures a receiver's throughput and the trend of its arrival gaps against the send
gaps.
Writing the tests found one thing in the first draft: where the spacings of the
current and the target track do not divide one another, the End Group its section 7
computes can end before the Switch Point, so frames between them would never be
sent. The module computes the End Group as the draft writes it and refuses to plan
such a switch.
Corpora: wai/moqt-conformance/switching/ and wai/moqt-conformance/probe/, each one
vectors.json written by the module's corpus generator, with the drafts' own worked
examples in them (Frame Number 28 and Table 1, both End Groups; Tables 4, 5 and 6
and Figure 5). switching_verify.py and probe_verify.py are the second
implementations, standard library only, sharing no code with the crate. Planted
faults, each refused with its own reason by both: 34 for switching, 70 for probes.
Each verifier changes copies of its corpus and requires every change to be caught,
then leaves out each of its own checks in turn and requires the corpus to catch it.
joule-code-conformance.yml runs both verifiers; wai conform --independent lists
them as moq-switching and moq-probe (moqt-mappings.sh).
Co-Authored-By: Claude <[email protected]>