open-standards/wai/live-conformance/carousel/README.md
Transaction Science 869fd65efc wai: a schedule names Raptor (RFC 5053), the code MBMS download uses
Carousel §4.1, §5.5: an entry's fec may be raptor (FEC Encoding ID 1), with RFC
5053's F, T, Z, N and Al, held to its fields and to its block sizes, 4 to 8,192
source symbols, with ESIs in 16 bits. 3GPP TS 26.346 §7.2.2 requires a receiver
of MBMS download to support the code.

Carousel §5.3: RFC 5053 states no bound on a decoder's failure. An independent
implementation failed on 14 to 31 blocks in 100 at K + 2, so a Raptor block is
held at K and a margin set by measurement, 8, 16 or 28 at overhead 0, 1 or 2,
and failure_one_in is null. tests/carousel.rs decodes each Raptor object a case
holds available with that implementation, a new development dependency, holds a
fixed sample of it to the measurement, and keeps the measurement as an ignored
test.

no-code stays the default, and carousel §11 keeps the IETF's disclosures on RFC
5053 for implementers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-06 18:09:38 -05:00

56 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# live-conformance/carousel — when each object passes, and when it is held
The corpus of [`extensions/carousel.md`](../../extensions/carousel.md) §10, in one file,
`vectors.json`.
**Provenance.** Generated here by `wai_carousel_vectors gen` (`wai-rs`, feature `carousel`),
from Ed25519 keys on fixed 32-byte seeds, constant times, and envelopes of exact lengths whose
payloads are opaque test bytes written by the generator; no media and no input from outside this
repository.
`keys` names every key by its role, as 64 lowercase hexadecimal digits: the publisher's
(`publisher`, `did:web:publisher.example#d1`), a second key of its origin (`publisher_d2`), a
sink's (`sink`, signing under its `did:key`), and the roots of the test key logs (`log_root`,
`other_log_root`).
`verdicts` (§6) are each one group of four objects, of 3,200, 896, 288 and 200 octets, as a
verifier holds it:
- `group`: the group receipt (jwp-receipts §2.4.1) and `objects`, each object `receipt` with its
`envelope` in hexadecimal where the verifier holds the bytes, or `null`;
- `claims`: the transmission and schedule claims, each in its canonical wire form, each signer's
in the order of its chain;
- `loss_ppm` and `overhead`: the loss bound and overhead (§2); `statement`: `null`, or a
statement offered (§6.4): `{"kind": "object", "bearer_id", "index", "by_ms"}` or
`{"kind": "group", "bearer_id", "by_ms"}`;
- `outcome`: `refuse` and its `reason`; or `verdict` with each object's verdict, each claim's
(`declared`, `stands`, `extended`, `set-aside reason=…`, or `reject step=… reason=…`), a line for each entry
of each schedule that stands — its `bearer_id`, `leaf_index`, `pass`, `available_ms`,
`bytes_sent` and `failure_one_in` — and the statement's result.
`claims` are each one schedule claim and its `outcome` through jwp-receipts §3.1 steps 1–4:
`accept`, or `reject step=… reason=…`. Among them every bound of §5.1, §5.2, §5.4, §5.5 and §4.2
rule 3.3 that a schedule can reach, met and passed.
`plans` (§7) are each an `entry` of a schedule, the instant `at_ms` a receiver is at, its
`loss_ppm` and `overhead`, and `held`, the encoding symbols it holds of each source block.
`outcome`: `plan`, with the `passes` it listens to (each `pass`, `start_ms` and `end_ms`),
`complete_ms` and `listen_ms`; or `refuse` and its `reason`.
`inband` (§8.2) are each what a receiver acquired on an instance: its `bearer_id`, the `group`
receipt, the `claims` in chain order, and the key `logs`, each a revision's text keyed by the origin
it was acquired for. `outcome`: `refuse` and its `reason`, for a group that fails; or `inband` with
each claim's label, `set` (`suffices`, or the reason it does not) and `inband_ms`, the interval of
the schedule that stands where the set suffices, `null` otherwise.
Everything is synthetic. Keys attest nothing; bearer instances use the example URN namespace
(`urn:example:`) and origins a reserved example domain. Each case states the outcome it was
written to have, declared in the generator, never copied from a verifier.
`wai_carousel_vectors verify` and `tests/carousel.rs` check that the file regenerates byte for
byte and that `wai-rs` reaches every stated outcome; the test also decodes each RaptorQ object a
case holds available with an independent implementation of RFC 6330, and each Raptor object with one
of RFC 5053, from what a receiver within the case's loss bound holds. `../carousel_verify.py` is the second implementation, written from
the extension's text, which also mutates copies of the corpus and drops each of its own checks
in turn and requires each to be caught. `../../claim-conformance/claim_verify.py carousel
vectors.json` reads every claim through jwp-receipts §3.1 steps 1–4.