open-standards/wai/live-conformance/loc/README.md
Transaction Science cbf58297e2 LOC carriage: WAI envelopes on LOC objects, a writer and reader in joule-moq, the corpus live-conformance/loc
extensions/loc-carriage.md maps an envelope whose payload is one WebCodecs
chunk (an Opus packet, an AVC or HEVC access unit in Annex B, an ADTS
frame) onto one object of a track of packaging loc (draft-ietf-moq-loc-04):
the payload as the LOC Payload, the manifest as the Immutable Property
WAI_MANIFEST (0x3A61), the receipt commitment as WAI_RECEIPT. A reader
rebuilds the envelope byte for byte and checks the receipt against it,
refusing with the extension's codes. joule-moq's loc module writes and
reads; its example writes the corpus and tests/loc_vectors.rs checks it;
loc_verify.py is the second implementation. WAI_MANIFEST is registered as
a wire identifier; moq-streaming-format §6 points to the carriage.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-22 10:43:34 -04:00

2.3 KiB

live-conformance/loc — WAI envelopes on LOC objects

The corpus of extensions/loc-carriage.md §8, in vectors.json:

  • objects: one LOC object per case, of every mapped capability (§3.1): the envelope it carries (envelope, hexadecimal), its MOQ Object Properties as MOQT -22 encodes them (properties: one Immutable Properties pair holding the LOC properties, WAI_MANIFEST and, where stated, WAI_RECEIPT), its payload, its LOC properties (loc) and its receipt property's value (receipt, or null). A conforming reader reads the object back to exactly that envelope, those properties and that receipt, and a conforming writer writes exactly those bytes from them.
  • writer_refused: envelopes a writer refuses (an unmapped capability, two pictures in one payload, an encrypted manifest, bytes that are not a WAI1 envelope), each with its code.
  • refused: objects a reader refuses, each a change to one written object, with its code; every code of §6 is given by one of these or of writer_refused.
  • property_types: the type of each property, as §2.2 and §4.1 give them.

Provenance. Written by cargo run -p joule-moq --example loc_vectors -- gen (from joule-code/joule-code-rs), from fixed values. The HEVC objects carry the first two access units of ../../format-probe-conformance/ext/hevc/base_64x64.265, a real encoder's output of a synthetic picture (its provenance is that corpus's). The Opus object carries one 20 ms packet of silence (TOC 0xF8). The AVC and AAC objects carry fixed bytes in the form §3.2 checks, which are not decodable pictures or sounds. Group receipts are named by the BLAKE3 hash of a fixed label; no signature is in the corpus.

Checks. joule-moq's tests/loc_vectors.rs regenerates the file byte for byte, requires every outcome, and requires §6's table to list exactly the codes the reader and writer give. ../loc_verify.py, written from the extension's text and sharing no code with joule-moq, does the same with its own MOQT -22 decoder and BLAKE3, writes every object again, and requires every mutated copy of the corpus, and the corpus under a copy of itself without one of its checks, to fail:

python3 -I live-conformance/loc_verify.py live-conformance/loc