moq-streaming-format: declare WAI as a MoQ streaming format #85

Merged
dcharlot merged 1 commit from wai/moq-streaming-format into main 2026-09-10 12:21:10 -04:00
Owner

WAI already references MoQ for confidentiality (MLS + SFrame) — a binding that treats MoQ as a pipe. MoQ is not a pipe. It is a two-layer design, and the upper layer has an open slot exactly where a container of capability-dispatched objects belongs.

  • MOQT moves objects in groups on tracks, and does not know what an object means.
  • MSF (draft-ietf-moq-msf) says what objects mean — fragments a stream into objects, declares what a publisher emits in a catalog, sets prioritisation.

The alignment is structural, not aspirational: MSF's unit is an object in a group; WAI envelopes are already objects; jwp-receipts already commits per object and signs per group. Neither layer has to change to agree.

The slot is open, and cheaply

MSF's packaging field has a fixed value set and no central registry — which reads closed. draft-ietf-moq-cmsf shows it isn't: a sibling I-D declaring packaging value cmaf, stating it extends the allowed packaging values defined in MSF, inheriting MSF wholesale, adding two track-level catalog fields, and registering nothing — "this document has no IANA actions." LOCMAF is a second instance. A sibling draft, no registry action, no permission sought.

What CMSF did not take is the per-object slot. MSF §12 defines properties at Track and Object scope with an IANA type registry holding essentially one entry (MSF_COMPRESSION); CMSF defines no per-object property. §5 takes it with WAI_RECEIPT — content hash, joules, acquisition class, group-receipt hash — the shape jwp-receipts already has.

The load-bearing rule

§3: the object boundary MUST be the envelope boundary. That is what makes MOQT's object identity and the receipt's per-object commitment the same unit. If they diverge, every guarantee that composes them is void.

§4 makes the catalog do work: wai_capabilities MUST be exhaustive, a sink MUST NOT subscribe assuming an undeclared capability won't appear, and wai_determinism is the weakest tier on the track — declaring the strongest would advertise a guarantee most objects don't meet.

What it does not do

No MOQT wire encoding, no replacement for CMSF or LOC, no making MoQ WAI's transport, and no pinning of a draft revision. MOQT is pre-Last-Call; where it and this text disagree, MOQT wins and this text is what changes.

Ingest queue item 13b (#80 §4.4). Sourced from direct reads of draft-ietf-moq-msf and draft-ietf-moq-cmsf-00.

🤖 Generated with Claude Code

WAI already references MoQ for confidentiality (MLS + SFrame) — a binding that treats MoQ as a **pipe**. MoQ is not a pipe. It is a two-layer design, and the upper layer has an open slot exactly where a container of capability-dispatched objects belongs. - **MOQT** moves objects in groups on tracks, and does not know what an object means. - **MSF** (`draft-ietf-moq-msf`) says what objects mean — fragments a stream into objects, declares what a publisher emits in a **catalog**, sets prioritisation. The alignment is structural, not aspirational: MSF's unit is an object in a group; WAI envelopes are already objects; `jwp-receipts` already commits per object and signs per group. **Neither layer has to change to agree.** ### The slot is open, and cheaply MSF's `packaging` field has a fixed value set and no central registry — which reads closed. `draft-ietf-moq-cmsf` shows it isn't: a sibling I-D declaring packaging value `cmaf`, stating it *extends the allowed packaging values defined in MSF*, inheriting MSF wholesale, adding two track-level catalog fields, and registering nothing — **"this document has no IANA actions."** LOCMAF is a second instance. A sibling draft, no registry action, no permission sought. **What CMSF did not take is the per-object slot.** MSF §12 defines properties at Track *and* Object scope with an IANA type registry holding essentially one entry (`MSF_COMPRESSION`); CMSF defines no per-object property. §5 takes it with `WAI_RECEIPT` — content hash, joules, acquisition class, group-receipt hash — the shape `jwp-receipts` already has. ### The load-bearing rule §3: **the object boundary MUST be the envelope boundary.** That is what makes MOQT's object identity and the receipt's per-object commitment the same unit. If they diverge, every guarantee that composes them is void. §4 makes the catalog do work: `wai_capabilities` MUST be exhaustive, a sink MUST NOT subscribe assuming an undeclared capability won't appear, and `wai_determinism` is the **weakest** tier on the track — declaring the strongest would advertise a guarantee most objects don't meet. ### What it does not do No MOQT wire encoding, no replacement for CMSF or LOC, no making MoQ WAI's transport, and **no pinning of a draft revision**. MOQT is pre-Last-Call; where it and this text disagree, MOQT wins and this text is what changes. Ingest queue item 13b (#80 §4.4). Sourced from direct reads of `draft-ietf-moq-msf` and `draft-ietf-moq-cmsf-00`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
moq-streaming-format: declare WAI as a MoQ streaming format
All checks were successful
standards workspaces build + test / aac-rs (pull_request) Successful in 32s
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 3s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 37s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m48s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 2m8s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m13s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 44s
standards workspaces build + test / map-rs (pull_request) Successful in 54s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m15s
standards workspaces build + test / mesh-rs (pull_request) Successful in 1m31s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m1s
standards workspaces build + test / openpay (pull_request) Successful in 2m53s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 2m30s
standards workspaces build + test / arl-rs (pull_request) Successful in 9m4s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 9m51s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 9m15s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 9m17s
standards workspaces build + test / sense-rs (pull_request) Successful in 9m43s
a243192a04
WAI already references MoQ for confidentiality (MLS + SFrame), and that binding
treats MoQ as a pipe. MoQ is not a pipe — it is a two-layer design, and the upper
layer has an open slot exactly where a container of capability-dispatched objects
belongs.

MOQT moves objects in groups on tracks and does not know what an object means.
MSF (draft-ietf-moq-msf) says what objects mean: it fragments a stream into
objects, declares what a publisher emits in a catalog, and sets prioritisation.
The alignment with WAI is structural rather than aspirational — MSF's unit is an
object in a group, WAI envelopes are already objects, and jwp-receipts already
commits per object and signs per group. Neither layer has to change to agree.

THE SLOT IS OPEN, AND CHEAPLY. MSF's `packaging` field has a fixed value set and
no central registry, which reads closed. draft-ietf-moq-cmsf shows it is not: a
sibling I-D that declares packaging value `cmaf`, says it extends the allowed
values defined in MSF, inherits MSF wholesale, adds two track-level catalog
fields, and registers nothing — "this document has no IANA actions". LOCMAF is a
second instance. A sibling draft, no registry action, no permission sought.

What CMSF did NOT take is the per-object slot. MSF §12 defines properties at
Track AND Object scope with an IANA type registry holding essentially one entry
(MSF_COMPRESSION); CMSF defines no per-object property. §5 takes that slot with
WAI_RECEIPT — content hash, joules, acquisition class, group-receipt hash — which
is the shape jwp-receipts already has. `acquisition` MUST accompany
`joules_micro`, because a joule figure without its acquisition class is what
energy-measurement §2 forbids, and putting it on a wire does not make it
acceptable.

The load-bearing rule is §3: the object boundary MUST be the envelope boundary.
That is what makes MOQT's object identity and the receipt's per-object commitment
the same unit. If they diverge, every guarantee that composes them is void.

§4 makes the catalog do work rather than decorate: `wai_capabilities` MUST be
exhaustive, a sink MUST NOT subscribe assuming an undeclared capability will not
appear, and `wai_determinism` is the WEAKEST tier on the track — declaring the
strongest would let a track advertise a guarantee most of its objects do not
meet.

§6 states what this does not do, so it is not re-argued: no MOQT wire encoding,
no replacement for CMSF or LOC, no making MoQ WAI's transport, and no pinning of
a draft revision. MOQT is pre-Last-Call; where it and this text disagree, MOQT
wins and this text is what changes.

Ingest queue item 13b from the landscape survey (#80 §4.4). Sourced from direct
reads of draft-ietf-moq-msf and draft-ietf-moq-cmsf-00.

Co-Authored-By: Claude Opus 5 <[email protected]>
dcharlot force-pushed wai/moq-streaming-format from a243192a04
All checks were successful
standards workspaces build + test / aac-rs (pull_request) Successful in 32s
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 3s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 37s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m48s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 2m8s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m13s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 44s
standards workspaces build + test / map-rs (pull_request) Successful in 54s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m15s
standards workspaces build + test / mesh-rs (pull_request) Successful in 1m31s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m1s
standards workspaces build + test / openpay (pull_request) Successful in 2m53s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 2m30s
standards workspaces build + test / arl-rs (pull_request) Successful in 9m4s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 9m51s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 9m15s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 9m17s
standards workspaces build + test / sense-rs (pull_request) Successful in 9m43s
to 0c17e8c846
Some checks failed
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 2s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m51s
standards workspaces build + test / aac-rs (pull_request) Successful in 35s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m16s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 45s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m14s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 2m24s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 35s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 1m59s
standards workspaces build + test / map-rs (pull_request) Successful in 29s
standards workspaces build + test / mesh-rs (pull_request) Successful in 31s
standards workspaces build + test / openpay (pull_request) Successful in 1m22s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 2m37s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 39s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 31s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 18s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 14s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 39s
standards workspaces build + test / arl-rs (pull_request) Successful in 9m20s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 9m41s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 9m53s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 9m4s
standards workspaces build + test / sense-rs (pull_request) Successful in 9m30s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 1m10s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 20s
WAI conformance / cargo-class corpora · windows (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · windows (pull_request) Has been cancelled
2026-09-10 10:25:51 -04:00
Compare
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!85
No description provided.