Skip to main content

WAI Extension: MoQ Streaming Format

Mirrored from the canonical text at commit 117bad22 ().

Status: Draft, and deliberately tracking rather than pinning — MOQT is pre-Working-Group-Last-Call and its text still moves. Declares WAI as a streaming format over Media over QUIC Transport, so a WAI envelope is a first-class MOQT object rather than an opaque payload inside someone else’s container. No new transport: WAI defines none by charter, and this extension does not change that. Field semantics and rules over them only — never MOQT’s byte encoding. Keywords MUST, MUST NOT, SHOULD, MAY are RFC 2119/8174.

1. Why a streaming format

MoQ separates two things that other stacks fuse:

WAI already references MoQ for confidentiality (MLS + SFrame; see confidentiality). That binding treats MoQ as a pipe. This one treats it as what it is — a two-layer design with an open slot at the upper layer, which is precisely where a container that carries capability-dispatched objects belongs.

The alignment is structural, not aspirational. MSF fragments a stream into objects in groups; WAI envelopes are already objects, and jwp-receipts already commits per object and signs per group. The two layers agree on the unit without either being changed.

2. Precedent: the slot is open, and cheaply

MSF’s catalog names a format in its packaging field, over a value set MSF’s own text fixes (loc, mediatimeline, eventtimeline, moqlog, moqmetrics, catalog). There is no central streaming-format registry. Read alone, that is closed.

draft-ietf-moq-cmsf shows it is not. CMSF is a sibling Internet-Draft that declares packaging value cmaf, stating that it extends the allowed packaging values defined in MSF; inherits MSF wholesale — all of the specifications, requirements and terminology defined in MSF apply to implementations of this extension; adds two track-level catalog fields; and registers nothing: this document has no IANA actions. LOCMAF is a second instance of the same move.

So the path is a sibling draft with no registry action and no permission sought. This extension is the WAI-side statement of what such a draft would say.

3. The packaging value

A track carrying WAI envelopes MUST declare packaging value "wai".

4. Catalog declaration

A WAI track’s catalog entry MUST declare, in addition to MSF’s required fields, the capabilities a sink needs to dispatch what the track carries:

fieldtypemeaning
wai_capabilitiesarray of stringCapability strings (WAI SPEC.md §4) that objects on this track may dispatch to.
wai_determinismstringThe weakest tier any object on the track claims — see determinism-tiers. Absent means no tier is claimed.
wai_receiptsbooleanWhether objects carry receipts per §5.

These are custom catalog fields under MSF’s extension rule; they are namespaced by their wai_ prefix and MUST NOT collide with MSF-defined names.

5. The per-object property

MSF §12 defines MSF Properties at Track and Object scope, with an IANA registry of property types that today holds essentially one entry (MSF_COMPRESSION). CMSF adds track-level catalog fields and defines no per-object property. The object-scope slot is empty.

A WAI receipt is already per-object. This extension therefore defines one object-scope property, WAI_RECEIPT, whose value is the object’s receipt commitment:

fieldtypemeaning
content_hash32 Bjwp-receipts §2.1 BLAKE3 over the envelope bytes.
joules_microu64Microjoules producing this object; 0 is the unmetered marker, never 0 J (energy-measurement §2).
acquisitionstringAcquisition class per energy-measurement §2; empty when joules_micro is 0.
acquisition_evidencebytesFor OnChipCounter and CalibratedInstrument, the evidence that follows the tag byte in energy-measurement.md §2.7 (declared uncertainty, then filtering state or calibration reference). Empty for every other class.
group_receipt32 BThe link hash of the group receipt covering this object (jwp-receipts §3 step 3).

6. What this extension does not do

Stated so it is not re-argued:

7. Framing

The delivery industry is converging on MoQ, and the layer above it is where formats declare themselves. A container that carries instructions, dispatches by capability, and commits per object has a natural home there — not because it competes with the transport, but because the transport deliberately left the question of meaning to someone else.