open-standards/wai/ietf/nmsf-comment.md
Transaction Science 94fef38698
Some checks failed
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 18s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 35s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Failing after 4m26s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 5m17s
The MSF packaging draft, revision -01: current MOQT and MSF, the floor, and a check of our catalogs
draft-charlot-moq-wai-packaging-01 (xml, and the txt and html xml2rfc renders; -00 kept):

- Written against draft-ietf-moq-transport-23 and draft-ietf-moq-msf-01, with the per-role
  required fields and packagingMetadata of MSF's editor's copy of 9 November 2026. MOQT
  citations move where -23 moved them (relay object handling 7.9, the delivery-timeout
  parameters 9.19.3 and 9.19.4); WAI_RECEIPT states its scope, its single instance and the
  65535-byte bound on a property value.
- New: how a receiver falls back, per object to the envelope's fallback and per track to a
  floor track of another packaging in the "wai" track's altGroup (Section 6), as the
  packager writes it; wai_delivery_timeout_ms, which the packager writes on layer tracks;
  the MSF fields a "wai" track carries; one ordered dispatch procedure per object.
- IANA: MSF keeps no registry of packaging values, so "wai" and "wai-receipts" need no IANA
  action (and are asked for should one be created); WAI_RECEIPT stays requested in MOQ
  Properties. application/wai and its codecs parameter leave this draft.
- xml2rfc 3.35.0: no warning. idnits 2.17.1: 0 errors, 0 flaws, 1 warning (no
  first-submission date on the datatracker for this name).

wai/ietf/catalog_check.py, run by the repository checks: the catalogs the packager wrote,
held to the draft's packaging values, "wai" track fields, receipts links and stage-set
checks. Passes on all 18; notes three departures from MSF itself (version written as the
number 1; cmaf floor tracks without isLive or initRef). Its self-test plants 21 faults in
a copy of a real catalog and requires each caught.

wai/ietf/README.md says what the draft defines, the revisions it targets, and how to
rebuild and check it. nmsf-comment.md notes that draft-herz-moq-nmsf-01 has expired.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-10 13:24:32 -05:00

100 lines
5.3 KiB
Markdown

# Comment on `draft-herz-moq-nmsf-01`: a model digest and a determinism field
> Status: draft comment for the authors of `draft-herz-moq-nmsf-01` and the moq list.
> **Not sent.** Sending it is the owner's decision. Section numbers below are those of
> `draft-herz-moq-nmsf-01` unless another document is named.
> `draft-herz-moq-nmsf-01` (last revised 7 April 2026) expired on 9 October 2026, as the
> datatracker showed on 10 November 2026; no later revision exists.
Thank you for the draft. Two catalog fields would let a subscriber check two things
the current text leaves to agreement between the endpoints: which model weights a
track needs, and whether a decoder on another device reproduces what the encoder's
context assumes. Both proposals are small and OPTIONAL, and neither changes the
object wire format of §3.2.
## 1. A model digest
§3.9's `modelVersion` is a version string. Two endpoints can hold different weights
under the same string, through a fine-tune, a re-export or a quantised variant. A
learned decoder run against weights other than the encoder's does not fail: it
produces a plausible picture that is wrong.
Proposal: an OPTIONAL `modelDigest` member in the `nvc` object, the SHA-256 of the
weights' bytes as 64 lowercase hexadecimal digits, with two rules:
- a subscriber that holds no weights with that digest SHOULD NOT subscribe, which
extends §3.9's existing "SHOULD NOT subscribe" rule to a check a subscriber can
make;
- a decoder MUST NOT decode a track against weights whose digest differs.
Where the weights span several files (networks, entropy tables), the digest can
cover a listing of per-file digests. The WAI specification defines one form for such
a listing: one line per file, giving its SHA-256 and its path, in byte order of the
paths. A checksum utility can verify it without WAI software (WAI `SPEC.md` §3.1,
"What the digest covers").
## 2. A determinism field
§4.6 has the encoder run the synthesis transform so that its context buffer "contains
exactly the same data that a decoder would produce". That holds only where the
decoder computes the same values as the encoder, on whatever device it runs:
- **Entropy decode.** §4.2 step 4 entropy-decodes the latent with CDF parameters
derived from the decoded hyperprior. If that derivation runs in floating point, two
devices can derive different parameters from one bitstream, select different
distributions, and decode different symbols from then on.
- **Context.** §4.1 feeds each reconstructed frame back as the next frame's context.
Where the reconstruction differs between devices, the difference carries forward
until the next Intra frame. Where the entropy model also reads that context (a
temporal prior), the entropy decode itself diverges.
Floating-point basic operations are correctly rounded, but runtimes choose
accumulation order, fused multiply-add, vector width and reduced precision per
device, so the same network does not in general give the same bits on two devices.
Proposal: an OPTIONAL `entropyDeterminism` member in the `nvc` object, with two
values:
- `integer-exact`: the decoder derives every entropy-coding parameter in integer or
fixed-point arithmetic, or reads it from the bitstream, and so decodes the same
symbols on every device;
- `unchecked`: no such guarantee is made. This is the meaning when the member is
absent.
A codec whose whole decode, synthesis and context included, is integer could also
state that, so that a subscriber knows the reconstructed frames themselves reproduce.
WAI names these two levels `entropy-consistency` and `decode-equivalence`, and
explains why parameter transmission reaches the first but not the second
(`extensions/determinism-tiers.md` §2).
Both levels are attainable in practice. WAI registers learned decoders whose
hyper-decoder, entropy-parameter derivation and synthesis are integer
(`wai.neural.int_hyper`, and `wai.video.int_hyper` for integer motion-compensated
P-frames after such a keyframe). The repository's CI decodes their committed test
vectors on Linux x86_64, Linux arm64 and macOS arm64, and requires the same output
hashes on each (`extensions/determinism-tiers.md` §6). Those vectors are small, and
the full-scale model is checked against its exporter's integer reference on one
machine per run.
## 3. Integrity, for completeness
§8 relies on hop-by-hop TLS. TLS protects each hop, but not a payload against a relay
that alters it. A publisher signature per group, over the hashes of the group's
objects, carried on a separate track, lets a subscriber detect alteration across
relays and account for objects a relay dropped. If that is of interest, the WAI
receipts track defines one way to do it (`draft-charlot-moq-wai-packaging-01` §8;
`extensions/jwp-receipts.md` §2 and §3).
## Pointers
- WAI `SPEC.md` §3.1: the parameter-set pin, by SHA-256 over the whole set, its
verification order and its refusal reasons.
- `extensions/determinism-tiers.md` §2 and §3: the two tiers and what each lets a
receiver hash.
- `extensions/moq-streaming-format.md` §4 and §4.2: catalog fields that declare a
track's capabilities, its weakest tier, and the parameter sets its objects pin, by
digest.
- `draft-charlot-moq-wai-packaging-01` §5.3 and §5.5: the same, as an MSF packaging.
All in the WAI repository: https://git.transaction.science/Transaction-Science/open-standards
(directory `wai/`).