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

34 lines
2.3 KiB
Markdown

# live-conformance/loc — WAI envelopes on LOC objects
The corpus of [`extensions/loc-carriage.md`](../../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`](../../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