Each is a mapping with a reference module, a corpus and a second implementation written
from its text. None adds a record or changes a byte of an envelope, a receipt or a claim,
and none is wired into a relay, the room service or a page: each module is what a publisher
and a receiver call. Every draft was read at the latest revision in the IETF archive on 10
November 2026.
- Playout timing (draft-nandakumar-moq-tempo-00; co-watch §15, new). joule-moq-room's tempo
module reads and writes the draft's CaptureTimestamp, PlayoutDelay and HopTime, and holds
the instant they state to the room: it is the millisecond in which co-watch's controlled
position enters the object, and a delay above the track's stated bound is refused whatever
instant it gives. A change of delay the room decides is a pause and a play, or a seek, sent
as any control. The catalog member wai_tempo (moq-streaming-format §4.4) carries the bound
and the two catalog extensions the draft leaves to be defined. The draft's property types
are unassigned; the module uses placeholders in MOQT's application range.
- The MoQ FEC catalog binding (draft-ramadan-moq-fec-catalog-00, -fec-core-00,
-fec-block-codes-00; carousel §8.3, new). wai-rs's carousel::moq_fec binds a schedule's
raptorq entries to the FEC instances a catalog declares under moq-object-v1, and back:
an object a block, a pass a repair layer, symbols as symbol-track and repair objects. An
entry binds only where everything carousel §6 derives from it holds of the block sent (the
same symbols a pass, the same K'); a catalog is read failing closed; a rebuilt object is
delivered only at its entry's Location, length and content hash. tests/carousel_moq_fec.rs
writes the corpus and decodes every object with an independent implementation of RFC 6330,
whose symbols for the block-codes draft's Appendix B are that appendix's.
- Multicast endpoints (draft-ramadan-moq-multicast-02; bearer-receipts §9.7, which read -00).
At -02 an endpoint lists only mmtp tracks and their repair tracks, so no WAI track rides
one of the draft's endpoints, and §9.7 now says so. What is implemented is the reading of a
catalog's multicast member, each endpoint standing or ignored with a label; it joins nothing.
- MoQ files (draft-jennings-moq-file-05; live-recording §8.7, new). joule-moq's file module
writes a track's objects as the draft's .moq and .dat files and reads them back byte for
byte, properties and all, so a track and its receipts track verify from the files alone. A
reader opens nothing outside its directory and refuses a file cut short.
- V3C tracks (draft-yuyou-moq-v3c-00; moq-streaming-format §4.5, new). joule-moq's v3c
module splits a wai.pc.vpcc payload into the draft's component tracks and joins it back,
with the catalog member wai_v3c. ISO/IEC 23090-5 was not read: the unit header is RFC 10034
§4.3.1's copy, unit types 7 and above are refused, and the corpus holds opaque test bytes,
no bitstream an encoder wrote.
Planted faults, each caught by the reference and, but where noted, by the second
implementation: a symbol of another object (offered as itself, in place of a block's own
symbol, and, in the test alone, as a repair symbol under a rewritten header); a truncated data
file and a truncated .moq file; a timing claim outside its bound (a delay past the track's
bound, and an instant one millisecond off the controlled position's). Writing the tests
found two holes, both closed: a rebuilt object was not held to its entry's Location, and a
Group missing its last object on a track joins to another payload, which the text now states.
Corpora: wai/moqt-conformance/{moq-file,tempo,v3c}/ and
wai/live-conformance/carousel-moq-fec/, with moq_file_verify.py, tempo_verify.py,
v3c_verify.py and carousel_moq_fec_verify.py. The registry lists wai_tempo and wai_v3c
(export regenerated). wai/ietf/catalog_check.py holds them, fec and the packaging values
fec-repair, fec-source and v3c in three more writers' catalogs, with 31 more planted faults;
draft-charlot-moq-wai-packaging-01 is unchanged. joule-code-conformance.yml and
joule-moq-room.yml run the second implementations and trigger on the corpora and texts their
tests read; wai conform --independent runs four more verifiers.
Not done: no relay rewrites HopTime or reads the Sync Support parameter; nothing sends
stamped objects, FEC tracks or V3C tracks on a session; the drafts' MMTP packaging, FEC on
multicast paths and Reed-Solomon are not mapped.
Co-Authored-By: Claude <[email protected]>
2.4 KiB
moqt-conformance/tempo — playout timing held to a room
The corpus of extensions/co-watch.md §15, in one file,
vectors.json: the object properties of draft-nandakumar-moq-tempo-00, and the instant
they state held to the room clock and the controlled position.
property_typesare the property types the reference uses until the draft's are assigned.propertiesare timings (capture_ms,delay_ms,hop_ms, eachnullwhere the object states none) with the pairs they are written as:immutable, inside Immutable Properties, andmutable, beside them, each the Key-Value-Pairs' bytes in hexadecimal.malformedare pairs a sink refuses.shortare timestamps as sent, the receiver's time, and the full timestamp (nullwhere there is none).catalogarewai_tempomembers withacceptand the capture times of five Locations, (0, 0), (0, 1), (7, 0), (7, 3) and (21600, 0), or the code.scriptsare control scripts, each control[action, at, arg](co-watch §5.1), sent 300 ms ahead of its instant and, of two for one instant, in the order listed; the source starts at 0, lastsduration_usand the room'st0ist0_us.claimsare timing claims, each under a script: the object'sposition_usandlength_us, the instant the search startsfrom_us, what the object states and its track's bound, and the outcome,due_usor areason.changesare changes of delay: the script, the instant,delta_ms, the controls that make it, and when an object atposition_usis due before and after.targetsare a sink's playout targets in the draft's three scenarios.
Provenance. Generated here by
JOULE_MOQ_ROOM_WRITE_TEMPO=1 cargo test --test tempo_vectors in
joule-code/joule-code-rs/crates/joule-moq-room (src/tempo/corpus.rs), from constants; no
key signs anything, no media and no input from outside this repository. Each case states the
outcome it was written to have.
joule-moq-room's test tests/tempo_vectors.rs checks that the file regenerates byte for
byte and that the reference reaches every outcome, plants a timing claim outside each of its
bounds, and sweeps objects across every script. ../tempo_verify.py
is the second implementation, written from co-watch §5, §6 and §15: it shares no code with
joule-moq-room or wai-rs, computes the controlled position itself, and changes cases and
requires each change to be caught.