open-standards/wai/pack-conformance
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 5eb38ff836
All checks were successful
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 21s
wai-app and Create / wai-app · does this change touch it (push) Successful in 21s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 25s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 26s
wai-sink-swift native sink package / does this change touch it (push) Successful in 19s
wai-quantum for JavaScript / does this change touch it (push) Successful in 32s
WAI Studio / does this change touch it (push) Successful in 20s
wai-ledger service / does this change touch it (push) Successful in 1m10s
wai-fleet service / does this change touch it (push) Successful in 1m11s
wai-key-proxy / does this change touch it (push) Successful in 1m12s
wai-audit collector and player integration / does this change touch it (push) Successful in 1m24s
WAI operation catalogue / does this change touch it (push) Successful in 1m24s
wai-sink-android native sink library / does this change touch it (push) Successful in 1m10s
wai-quantum studio and desktop / does this change touch it (push) Successful in 1m11s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 2m42s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Successful in 4m39s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 4m58s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 7m3s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 14s
wai-quantum energy-landscape jobs / does this change touch it (push) Successful in 13s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 1m2s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 2m3s
wai-ledger service / service · linux (push) Successful in 2m3s
wai-quantum for JavaScript / javascript · linux (push) Successful in 4m18s
wai-fleet service / service · linux (push) Successful in 2m47s
wai-key-proxy / proxy · linux (push) Successful in 2m48s
wai-audit collector and player integration / collector · linux (push) Successful in 5m2s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 6m37s
wai-quantum studio and desktop / studio · browser (push) Successful in 9m9s
wai-quantum energy-landscape jobs / the same bits · linux-arm64 (push) Successful in 12m17s
WAI Studio / Studio in WebKit · linux (push) Successful in 11m47s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 10m38s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 16m1s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 1m32s
wai-quantum energy-landscape jobs / native against WebAssembly, over many seeds (push) Successful in 6m49s
wai-quantum energy-landscape jobs / reader, kernels, answers and the stated result · linux, release (push) Successful in 8m59s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 10m33s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 3m23s
wai-ledger service / service · macos (push) Successful in 2m42s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 8m25s
wai-quantum energy-landscape jobs / the module under wasm32-wasip2 (wasmtime) (push) Successful in 18m46s
wai-fleet service / service · macos (push) Successful in 3m27s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 4m58s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 12m24s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 17m11s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 17m37s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 7m15s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 15m40s
wai-quantum energy-landscape jobs / the same bits · macos (push) Successful in 7m14s
wai: marks and highlight reels — a lead's shots, chapters, break candidates and clips derived from its stage index, and a reel each sink assembles for its own viewer
packaging §8.11 registers the record `wai.delivery.marks` (`wai-pack-marks`): a lead's shots (the
pieces that follow a cut of wai.pack.scenecut/1, as its stage index flags them), its chapters
(titled spans, each beginning at the start of the piece its instant falls in), its break
candidates (piece starts a cue began, a chapter begins at or a cut precedes, none inside a clip)
and its clips (the run of whole pieces each moment of the policy covers). They are a pure function
of the lead's stage index, the effective policy and the chapters a packager is given; the index is
held to the policy by digest, so the cuts' thresholds are the policy's, and its moment bits must be
§8.1's. A verifier holding the index and the policy derives them again and compares byte for byte
(`marks-mismatch`); a policy whose threshold differs from the one the index was cut under is
refused (`marks-policy`). They are written as one canonical JSON document, a WebVTT file using
chapter title text, EXT-X-DATERANGE tags of three WAI classes after an EXT-X-PROGRAM-DATE-TIME,
and DASH EventStreams of the scheme tag:transaction.science,2026:wai/marks, each read back to what
it was written from; a reader refuses what its writer would not write (`marks-vtt`, `marks-hls`,
`marks-dash`). Texts read: WebVTT CRD 2026-05-20, draft-pantos-hls-rfc8216bis-22 §4.2 and
§4.4.5.1, and ISO/IEC 23009-1:2026's MPD schema (PeriodType, EventStreamType, EventType, example
G9). The reference packager does not yet write marks into a package.

sink-predicate §9 registers `wai.delivery.sink_reel` (`wai-sink-reel`): a source's signed reel
predicate naming a programme's marks by digest, each reel a list of candidate clips with the tags a
viewer must follow to want each, the regions each is shown in and its caps. A sink assembles each
reel from its own location, exposures and interests (the tags its viewer follows, held on the
device; unidirectional-delivery §2 names the class), takes in order the candidates its interests
want, shown at its location, uncapped and fitting the reel, and presents them in the programme's
order. Nothing about the viewer leaves the device; a reel predicate holding a member that would send
something is refused `predicate_needs_report`. A candidate may want only tags its clip's record
carries (`reel_clip_mismatch`); a sink's log naming a clip with no record in the marks is refused
`reel_clip_unknown`, one presenting a clip its interests do not want `reel_not_wanted`.

The references are wai-rs's `pack_marks` (feature `pack_marks`) and `sink_predicate::reel`
(feature `sink_reel`). The corpora are pack-conformance/marks/ (33 derivations, 18 documents, 26
forms; the indexes of its two fixture cases hold the pieces scenecut/1 cuts the scene-cut corpus's
frames into) and live-conformance/sink-reel/ (49 reel predicates, 22 evaluations, 17 logs).
marks_verify.py and sink_reel_verify.py, their second implementations, agree on every case;
marks_verify.py recomputes the fixtures' cuts from their frames under the policy's thresholds; they
fail every mutated copy (11 of 11, 14 of 14) and catch every weakened verifier (24 of 24, 28 of 28).
Twenty-three faults planted in the references each fail their tests: a threshold changed in the
policy accepted, a fixture's cut moved, a forced piece counted as a shot, a cut inside a clip
offered, a cue inside a clip passed over, a chapter begun off its piece, moment bits, the plan
digest and a live window unchecked, a quoted title, an unescaped WebVTT title, the HLS reader not
held to the writer, DASH events renumbered, a mismatched document verified; and for reels, a reel or
a log naming a clip with no record, a sink without interests wanting every clip, the source's order
presented, exposures not carried across reels, a report member read, the wrong signing domain, a
want the clip's record does not carry, and a reel assembled outside its span.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-10 15:54:41 -05:00
..
catalogs Every MoQ catalog we write is MSF's, wai-link is defined, and the catalog check holds MSF's own rules 2026-11-10 14:05:27 -05:00
cmaf-mutations Every MoQ catalog we write is MSF's, wai-link is defined, and the catalog check holds MSF's own rules 2026-11-10 14:05:27 -05:00
conversions wai-pack: the policy, scene-cut segmentation and their corpus 2026-10-05 07:33:52 -04:00
delivery wai-pack: staged packages — refinement layers, stills, a piece's ladder, live windows and simulated delivery (W4-4) 2026-10-08 14:21:54 -04:00
encode wai-pack: emit only what the registry pins (R6), and the encoder's vectors 2026-10-05 08:10:36 -04:00
ladder-mutations Every MoQ catalog we write is MSF's, wai-link is defined, and the catalog check holds MSF's own rules 2026-11-10 14:05:27 -05:00
live pack-conformance: a live-window corpus, checked by both implementations 2026-10-08 19:52:14 -04:00
loudness wai: loudness measured in integers, with the gain to a target in a signed statement 2026-11-08 15:23:58 -05:00
marks wai: marks and highlight reels — a lead's shots, chapters, break candidates and clips derived from its stage index, and a reel each sink assembles for its own viewer 2026-11-10 15:54:41 -05:00
modef Mode F: WAI envelopes as the samples of a fragmented MP4 track, written, read and checked against CTA-5005-B 2026-11-10 14:26:36 -05:00
multi Every MoQ catalog we write is MSF's, wai-link is defined, and the catalog check holds MSF's own rules 2026-11-10 14:05:27 -05:00
mutations wai-pack: packages of several components, and the composing sink's package packed by it 2026-11-09 12:58:33 -05:00
package-mutations Every MoQ catalog we write is MSF's, wai-link is defined, and the catalog check holds MSF's own rules 2026-11-10 14:05:27 -05:00
packs Every MoQ catalog we write is MSF's, wai-link is defined, and the catalog check holds MSF's own rules 2026-11-10 14:05:27 -05:00
policy packaging §4.4: a piece is at most ten minutes and 2^24 units; floors counted before decoding 2026-10-09 14:13:41 -04:00
qchoice wai-pack: the step is chosen per piece (§5.6), and the Python verifier recomputes the encoder's choices 2026-10-05 09:44:52 -04:00
receipts Corpora: weak-key cases in every receipt family's corpus 2026-10-07 10:16:21 -04:00
refusals packaging §4.4: a piece is at most ten minutes and 2^24 units; floors counted before decoding 2026-10-09 14:13:41 -04:00
renditions wai: AC-3 and E-AC-3 registered, and a programme's audio renditions written for HLS and DASH 2026-11-08 15:11:47 -05:00
scenecut wai-pack: the policy, scene-cut segmentation and their corpus 2026-10-05 07:33:52 -04:00
staged-mutations Every MoQ catalog we write is MSF's, wai-link is defined, and the catalog check holds MSF's own rules 2026-11-10 14:05:27 -05:00
stills wai-pack: a still's reader inflates as zlib does; png_diff runs both readers 2026-10-09 13:42:54 -04:00
.gitattributes wai: the packaging extension's policy and pieces, and its CI 2026-10-05 07:42:09 -04:00
cmaf_diff.py cmaf_diff.py: the timescale case alters mdhd's timescale (#426 review S5) 2026-10-24 21:01:58 -04:00
conversions.json wai-pack: the policy, scene-cut segmentation and their corpus 2026-10-05 07:33:52 -04:00
loudness_verify.py wai: loudness measured in integers, with the gain to a target in a signed statement 2026-11-08 15:23:58 -05:00
marks_verify.py wai: marks and highlight reels — a lead's shots, chapters, break candidates and clips derived from its stage index, and a reel each sink assembles for its own viewer 2026-11-10 15:54:41 -05:00
modef_probe.py Mode F: WAI envelopes as the samples of a fragmented MP4 track, written, read and checked against CTA-5005-B 2026-11-10 14:26:36 -05:00
modef_verify.py Mode F: WAI envelopes as the samples of a fragmented MP4 track, written, read and checked against CTA-5005-B 2026-11-10 14:26:36 -05:00
multi_verify.py wai-pack: a sound track's Opus floor, supplied in the CMAF form 2026-11-09 15:21:55 -05:00
pack_verify.py Every MoQ catalog we write is MSF's, wai-link is defined, and the catalog check holds MSF's own rules 2026-11-10 14:05:27 -05:00
png_diff.py wai-pack: a still's reader inflates as zlib does; png_diff runs both readers 2026-10-09 13:42:54 -04:00
policy_diff.py wai-pack: a sound track's Opus floor, supplied in the CMAF form 2026-11-09 15:21:55 -05:00
README.md wai: marks and highlight reels — a lead's shots, chapters, break candidates and clips derived from its stage index, and a reel each sink assembles for its own viewer 2026-11-10 15:54:41 -05:00
renditions_verify.py wai: AC-3 and E-AC-3 registered, and a programme's audio renditions written for HLS and DASH 2026-11-08 15:11:47 -05:00
requirements-verify.txt ci: pack_verify.py's Ed25519 library installed from a hashed requirements file with --require-hashes 2026-10-06 07:44:38 -04:00
segment_diff.py wai-pack: the segmenter's state is bounded by its lookahead and window 2026-10-05 09:20:07 -04:00
source_diff.py wai-pack: the WAV reader forms 2 x channels without wrapping, and no header sizes a buffer 2026-10-05 09:03:36 -04:00
stage_diff.py stage_diff: wide stills, so every deflate distance code is exercised 2026-10-08 19:58:07 -04:00
supplied_cmaf.py wai packaging stack: #426, #438 and #452's GPU tier, squashed onto main 2026-10-24 20:31:28 -04:00
supplied_floor.py wai packaging stack: #426, #438 and #452's GPU tier, squashed onto main 2026-10-24 20:31:28 -04:00
supplied_opus.py wai-pack: a sound track's Opus floor, supplied in the CMAF form 2026-11-09 15:21:55 -05:00

pack-conformance — the packaging corpus

Vectors for extensions/packaging.md: the policy, its digest and what it may ask a packager to emit (§3), how a source is cut into pieces (§4), the integer video payloads, refinement layers and stills a packager writes (§5), packages (§6–§11), and their delivery over a simulated link (§8.9).

Provenance. Generated here: the wai-pack fixture generator (wai-pack/src/fixture.rs, wai-pack/src/conformance.rs) writes every frame from integer functions of the frame and pixel index; a package's bases, refinement layers and stills are codings of those frames, and its floor an AV1 coding of them by an encoder, as supplied_floor.py states. No footage. renditions/, loudness/ and marks/ are written by wai-rs's wai_audio_renditions_vectors gen, wai_loudness_vectors gen and wai_pack_marks_vectors gen from fixed values and formulas of integers (their READMEs).

  • policy/ — policies a packager accepts (every rung one it may emit, §3.6), and expected.json: each policy's effective canonical JSON and digest (eq-defaults-a.toml also with royalty_free_only forced on, the one way an override changes it, §3.2), and the pairs eq-<name>-a.toml and eq-<name>-b.toml, two spellings of one policy that must have one digest: every default omitted or written out; standard or inline tables, dotted keys, member order, string escapes, integer notation and comments; and max-piece.toml, the longest piece a policy may allow (§4.4), at both bounds.

  • refusals/ — policy/*.toml, one fault each (the byte layer's among them: a byte-order mark, bytes that are not UTF-8, an integer at 2^63, nesting to depth 33 and 80), and source/* (Y4M and WAV), and expected.json: each one's reason (§13). Every file is read as bytes. A policy's reason is a packager's: the policy's own (§3.2–§3.4), or its first rung's capability refusal (§3.6), read from SPEC §5's registry. The source files are written by the generator.

  • conversions.json and conversions/ — milliseconds to a timebase (§4.4), a lead start to a component's timebase (§4.5), and Y4M to RGB8 (§4.7) by the SHA-256 of each frame, for 4:2:0 with odd dimensions and for 4:4:4. The Y4M files are written by the generator.

  • scenecut/ — policy.toml and expected.json: for each fixture, its SHA-256, the score of every frame, every piece (start, frames, flags, kind, and the statistics the kind is read from) and the plan digest (§4.2–§4.6).

  • encode/ — WIV1 payloads of the integer video encoder (§5.5; wai-rs int_video_enc), written by the generator, and expected.json: one for every piece of every fixture, coding the piece's first 12 frames, under a whole-pel and a half-pel parameter set; for each, the encoder's parameters, the payload's BLAKE3, the SSE of its reconstruction against the source, and the SHA-256 of every decoded frame. Identical content gives identical bytes: kinds-01's pieces 4 and 5 both start inside one static shot, so their first frames, and their payloads, are the same.

  • marks/ — a lead's shots, chapters, break candidates and clips derived from its stage index and policy, documents verified, and their WebVTT, HLS and DASH forms read back (§8.11): written by wai_pack_marks_vectors gen (wai-rs), checked by marks_verify.py (marks/README.md).

  • renditions/ — sets of audio rendition entries and the description records they name, with each set's HLS tags and DASH adaptation sets or its refusal (§8.10): written by wai_audio_renditions_vectors gen (wai-rs), checked by renditions_verify.py (renditions/README.md).

  • loudness/ — programmes given as formulas of integers, their loudness measured in integers, and signed loudness statements, each verified or refused (§12): written by wai_loudness_vectors gen (wai-rs), checked by loudness_verify.py (loudness/README.md).

  • qchoice/expected.json — the step the base encode chooses (§5.6) for every piece of every fixture (its first 12 frames), under two bounds: each candidate's SSE and SSE per sample in thousandths, the step chosen, and the chosen payload's BLAKE3.

  • packs/video-base-01/ — a golden package (§5–§11). Its inputs: policy.toml, the supplied floor floor/v.obu (an AV1 stream with a key frame at each piece start of the plan, each piece coded alone, written by an AV1 encoder from the fixture; the policy pins its listing), and key.hex (a test signing seed, never a production key). package/ is every file the packer writes from them and the fixture video-base-01: objects, the stage index, the floor's objects and CMAF files, the catalogs, the receipt and LISTING. The fixture's bumper plays twice, so its pieces are one object each time.

  • multi/ — packages of several components (§4.5, §5.8), each with the lead and supplied floor of video-base-01 (its fixture, packs/video-base-01/floor and key.hex): multi-av-01, the lead and a stereo audio component of FLAC pieces from a WAV written by a formula (multi_fixture::wav_sample, never committed); multi-titles-01, the lead, a vector-graphics title card, a timed-text component and a score with its FLAC floor; multi-feed-01, the lead and a scoreboard feed; multi-sting-01, the lead and a voiced score of two channels at 48 kHz (score §2.4: band-limited timbres, a sine, noise, pans, curved envelopes, low-pass sections, a glide and echoes) with its two-channel FLAC floor; and multi-opus-01, whose lead is video-floor-only-01's two supplied CMAF floors (a piece per segment, §7.8) and whose sound track, the WAV of the formula at 48 kHz, carries its FLAC pieces and an Opus floor supplied in the CMAF form (§7.9): floor/a/, written by supplied_opus.py (ffmpeg's libopus at 128 kb/s in 20 ms packets, its HLS muxer's 0.2 s fragments grouped a piece to a segment, and the tail), committed and pinned by the listing of the whole supplied floor. policy.toml and the committed sources/ are each golden's inputs, and package/ what the packer writes from them. multi_verify.py, written from the extension text and sharing no code with wai-pack, recomputes each component's pieces from the lead's, each base's decoded-output digest from the sources (the WAV's samples, each score's mixdown by score §3, voices and two channels included, the source document's frames by tools/wai_vector_check.py, the WebVTT segments it writes), each FLAC payload and caption segment byte for byte, each feed piece's seal, and an Opus floor's CMAF files through floor.listing (its init and dOps, each packet by RFC 6716 §3.4, the segments against the pieces) and each Opus floor object, the Ogg Opus stream §7.9 writes, byte for byte, by a reader and an Ogg writer of its own; and plants a flipped payload byte in each component, and in an Opus floor a flipped floor object byte, a flipped media segment byte and a floor.listing cut short, and requires each found. tests/multi.rs packs each again byte for byte, verifies it, and refuses a flipped byte, an altered payload sealed again, a piece's object in another's place and pieces off the lead's. The corpus check also packs the composing sink's reference package, ../wai-web/compose/package/, again from ../wai-web/compose/policy.toml and its sources and requires every file the same (multi_fixture::compose_check).

  • packs/video-staged-01/ — a staged golden package (§5.4, §5.7): a moving shot, the bumper, a still shot, the bumper again and a second moving shot, under a policy of an int_motion base with two int_refine layers, a still for a static piece (a rule's ladder), three classes (one capped by rate, one floor only), a moment whose rule moves the last piece's layers to an 800 ms deadline, and layer lags. Its floor was written by supplied_floor.py. The bumper's base, layers and floor are one object each; the still's piece is carried over HTTP by the floor (§8.3) and over MoQ on the base track.

  • packs/video-ladder-01/ — a golden package of two floor rungs over one base (§7.1): the fixture and base rung of video-base-01, so its bases are that package's objects, and two supplied AV1 streams, floor/hi.obu at the fixture's size and floor/lo.obu at half its width and height, each written by supplied_floor.py (--scale lo=2). Each piece has its base and one floor object per floor rung; each floor has its own CMAF files under its floor name (floor/hi/, floor/lo/), its own floor playlist and MoQ track, and the classical master, every class's master and dash/classic.mpd list both.

  • packs/video-repack-01/ — a re-pack golden (§11.5): video-ladder-01's policy under another asset id and its supplied floor, packed with every piece's base taken from the parent its file parent names, video-base-01, rather than coded. Its objects are video-ladder-01's; its receipt names video-base-01's receipt as the package it re-packs (parent kind re-pack); and each piece's base entry is the parent's, field for field. Both verifiers check it against its parent.

  • packs/video-cmaf-01/ — a golden whose supplied floor is in the CMAF form (§7.7): video-ladder-01's policy with floor.supplied_form = "cmaf", and its two streams as a media muxer wrote them, floor/<name>/init.mp4 and floor/<name>/seg_<k>.m4s, one segment per piece, by supplied_cmaf.py (ffmpeg's HLS muxer, -c copy). The package's floor files are those files, byte for byte, under their SHA-256; floor.listing is the supplied floor's listing; and each floor object holds its piece's samples, which are the OBU form's temporal units of the same streams.

  • modef/ — Mode F (http-delivery §11.7, Appendix B): golden packages' tracks and the HTTP corpus's O9 written as fragmented MP4 tracks whose samples are the envelopes byte for byte, with track files, media playlists, a test multivariant playlist, and planted faults each refused with its reason. wai-pack modef check, wai-rs's tests/http_modef.rs and modef_verify.py replay it; modef_probe.py opens it with a media prober (modef/README.md).

  • cmaf-mutations/ — the CMAF golden altered, in package-mutations/'s layout: itself (ok); a segment replaced by one of the same samples, a free box before it, under its own SHA-256, which the catalogs name, so its one fault is its binding to floor.listing; floor.listing altered; and without it (each floor-cmaf-mismatch).

  • packs/video-floor-only-01/ and packs/video-floor-only-02/ — floor-only goldens (§7.8): a component of profile = "floor-only" with the ladder's two floor rungs and no base or source, the floor in the CMAF form (video-cmaf-01's files) and in the OBU form (video-ladder-01's streams). Their pieces are the first floor's segments or shown key frames, the ladder golden's plan; each piece is its two floor objects, which carry no derived_from and hold the ladder golden's units, of kind none; no class lists a WAI object.

  • ladder-mutations/ — packages a verifier must refuse or accept (§11.3), each the ladder golden altered (re-sealed with its key where the receipt or LISTING alone would catch it), in package-mutations/'s layout: the golden itself (ok); piece 2's two floor objects swapped (floor-object-mismatch); the second floor's CMAF files under the component's name (floor-cmaf-mismatch); and a classical master listing one floor of two (catalog-mismatch).

  • mutations/ — stage indexes, objects and version-2 receipts, and expected.json: each case's reason (§6.2–§6.4, §9.1), a well-formed case of each kind among them, and three receipts carrying a signature only a verifier that checks the equation alone accepts (a key of small order, that key spelled with y = p + 1, an R of small order), each receipt-signature (SPEC §7 Signatures).

  • receipts/ — version-1 package receipts as JSON (§9.3), with each one's receipt hash: the legacy receipt whose hash wai-rs pins, an unmetered one, and the unmetered one carrying each of those three signatures, marked "signature": "refused".

  • catalogs/ — stage indexes no golden package has (refinements on more than one deadline), with the MoQ catalog each gives (§8.4); each case's floor names its sequence header OBU (seq_obu) and timescale, from which §7.6 writes the initialization segment the catalog carries inline.

  • live/ — the staged golden's source packed live (§9.2) with its key, in windows of two pieces: each window's stage index and receipt (windows/<n>/), and expected.json: each window's first piece and entry, its pieces, its index digest and its receipt hash. Each window verifies against its receipt; the first starts the chain, and each later one names the receipt before it as its live-window parent, the index before it as its prev_index_digest, and continues its pieces and entries. Its pieces, bases and refinements are the golden's, entry for entry (a live pack has no floor).

  • stills/ — PNG files a still's reader reads or refuses (§5.7: any PNG of 8-bit RGB without interlace), each a generated 5 × 3 picture written chunk by chunk, and expected.json: each file's verdict and, read, the SHA-256 of its RGB8 samples. Read: the module's own still, and files with a suggested palette, ancillary chunks, and the image data split across two chunks. Refused: an interlace, bytes after IEND, a short row, a palette after the image data, an unknown critical chunk, no IEND, a chunk between the image data, a chunk's CRC, a sixth filter, another colour type, a zlib window past 32 KiB, bytes after the zlib stream, and its Adler-32. And one dynamic block of literals twice: with a lone distance code of one bit, read (the one incomplete code set the zlib library takes), and of two bits, refused.

  • staged-mutations/ — the staged golden itself (ok: verified without its sources, every layer's prefix digest held to it), and the staged golden altered and re-sealed with its key, in the layout of package-mutations/: a refinement on another deadline than its plan's, a piece missing its top layer, a still where the policy's rule now gives the piece the default ladder (each index-policy-mismatch), a top layer coded again at another step and a still's digest of its one frame rather than its frame held for the piece (each prefix-digest), and a piece and a still each longer than the policy's max_ms (index-policy-mismatch, refused before a frame is decoded, so a still's declared duration never sets what a verifier allocates); a policy past §4.4's longest piece (max_ms 600001, policy-piece-bounds); and the still given the longest piece a policy allows (max_ms ten minutes), its manifest naming those frames, refused by its floor's unit count before any frame is decoded (floor-object-mismatch); a still whose manifest's target holds a member more, and a top layer whose target is not null (each object-manifest); and the still as a PNG §5.7 does not read, its one dynamic block's lone distance code two bits long (prefix-digest).

  • delivery/ — expected.json: the staged golden packed live and delivered to a tv subscriber over a simulated link (§8.9), under §8.5's priorities, without them, and capped at layer 1: each piece's presented layer, base arrival and dropped layers, and the byte counts. Labelled simulated.

  • package-mutations/ — packages a verifier must refuse (§11.3), each the golden altered and, where the receipt or LISTING alone would catch the alteration, re-sealed with the golden's key: what a dishonest packager holding the key could publish. Each is an overlay on the golden (<name>/, the files that differ or are new; expected.json, the files it removes, the directories it adds that hold nothing or cannot be read, and its reason), written out as a directory and read strictly by each verifier: a receipt over no component, an index that is not its policy's, the policy's own refusals (a policy.json that turns royalty_free_only off among them), a missing or corrupted object, a live window no catalog can be written for, floor objects that do not open on a key frame or are not §7.2's, files and directories a strict read finds, and a receipt file that is not its canonical form; and those the verifier must accept (an extra key frame the policy allows, and a metered package, §9.4: the golden re-sealed with a 500 mW model meter over one second and its measurement claim, every member fixed), with a claim about another figure (measurement-claim-invalid) and none (measurement-claim-missing).

The fixtures are not committed. wai-pack fixture gen <name> writes each from its definition (wai-pack/src/fixture.rs), every byte an integer function of the frame index and the pixel position, and the corpus pins its SHA-256:

  • cuts-01 — hard cuts; a flash exactly as long as the lookahead, which is not cut; a fade, which is not cut; and two shots cut against each other, each return a cut.
  • kinds-01 — one shot of each kind, then a static shot longer than the longest piece, cut where max forces it.
  • video-base-01 — 64 × 36: three shots with a one-second bumper between them, the bumper the same frames both times (its span reads time from its own start).
  • video-staged-01 — 64 × 36: a moving shot, the bumper, a shot that does not change, the bumper again, and a second moving shot.

Files are compared as bytes; .gitattributes turns off line-ending conversion.

Generation.

cd wai/wai-pack
cargo run --release -- conformance regen ../pack-conformance

Verifiers.

  • wai-pack conformance check ../pack-conformance recomputes every expected file and every generated input and requires them to equal the committed ones, requires the digests of each equal pair to be equal, decodes every encode payload through decode_int to the encoder's reconstruction and recomputes its SSE. It packs each golden again and compares every file, verifies the committed package (wai-pack verify), gives every mutation and every package mutation its reason, reads every still to its verdict, and checks the live windows' chain. cargo test runs the same check, with the scene cuts of each fixture stated as tests (tests/scenecut.rs).

  • pack_verify.py, Python standard library and, to sign what it re-derives, cryptography (TOML through tomllib, so 3.11 or later) and sharing no code with wai-pack, written from the extension: its own policy schema, constraints, canonical JSON and digest; its own Y4M and WAV readers; the fixtures regenerated from their definition; wai.pack.scenecut/1 in its on-demand form, every frame known, against the vectors of the streaming segmenter; the capability rules from the registry's published export (../registry/capabilities.json); and every encode payload decoded to its frames' SHA-256, with its SSE recomputed from the regenerated source. BLAKE3 comes from ../claim-conformance/_blake3.py, and the WIV1 parser and decoder from ../int-payload-conformance/int_payload_verify.py. For the packages it has its own stage index reader and rules, object rules (each payload parsed as its pinned format, a WIR1 reader included), version-1 and version-2 receipts (Ed25519 by WAI's strict rule, SPEC §7 Signatures, from ../claim-conformance/_ed25519.py), an AV1 stream and sequence header reader, the CMAF files, and every catalog: it verifies each golden package in §11.3's order, rebuilding the floor's files and re-rendering the catalogs byte for byte, gives every mutation its reason, checks the version-1 receipts, and verifies every package mutation and staged mutation in the same order, refused with its reason. Every prefix is decoded: a still by its own PNG reader, and each refinement layer by the WIR1 decoder of ../staged-conformance/staged_verify.py (written from staged-delivery); and the MoQ catalog is checked by that file's moq-streaming-format §4.1 check. Every HTTP playlist of a golden is read by ../http-conformance/http_verify.py's union, floor and adjacency checks (http-delivery §4.2), and every file of stills/ by its own PNG reader, to the corpus's verdict. Each window of live/ it reads as an index and a receipt, checks the chain, and compares with the golden's index. From the regenerated fixture it re-derives what only the source decides: the pieces, their rules, moments, ladders and class plan, each base's SSE and step and the encoder's choices, each still's bytes, and each refinement layer's bytes with its own rANS coder and table fit; and it checks the supplied floor against the policy's listing and the plan. The delivery cases it re-derives from the fixture's cut and the package's index by its own mapping onto the simulator of ../staged-measure-conformance/sim_verify.py.

    python3 pack-conformance/pack_verify.py pack-conformance
    
  • policy_diff.py runs the policy reader differentially: byte-level cases (a byte-order mark, bytes that are not UTF-8, integers past 2^53 and 2^63, nesting at and past the cap, control characters, line endings) and seeded random policies with faults in every table, each one's verdict and digest from wai-pack policy-verdict equal to pack_verify.py's.

    python3 pack-conformance/policy_diff.py <wai-pack binary> 1 3000
    
  • segment_diff.py runs wai.pack.scenecut/1 differentially: seeded random clips under random parameters, every piece and score of the streaming segmenter (wai-pack segment-json) equal to pack_verify.py's on-demand form, and every piece within min and max.

    python3 pack-conformance/segment_diff.py <wai-pack binary> 1 2000
    
  • stage_diff.py runs the staged packer differentially: refinement layers over random frames and steps, stills of random pictures, piece plans under random policies (rules with ladder subsets, maximum layers and deadlines, classes with rates, layer lags) and deliveries of random publications over random links, each result of wai-pack stage-json equal to pack_verify.py's.

    python3 pack-conformance/stage_diff.py <wai-pack binary> 1 3000
    
  • png_diff.py runs a still's reader differentially: streams the zlib library writes (every level and strategy, windows from 512 bytes to 32 KiB) and the packager's own stills; dynamic blocks built on each of RFC 1951's and zlib's code-set rules (complete codes, no distance code, a lone one-bit distance code used and misused, a lone longer one, over-subscribed and incomplete codes of each kind, repeats with nothing before them or past the code lengths, no end-of-block code, too many symbols, a distance past the bytes written, stored blocks with a wrong complement, fixed blocks with symbols they cannot use, several blocks of mixed kinds); and those altered. Each verdict, and each read picture's SHA-256, from wai-pack stage-json's read-png must be pack_verify.py's, which inflates with Python's zlib; and each construction must have the verdict the rules give it.

    python3 pack-conformance/png_diff.py <wai-pack binary> 1 4000
    
  • supplied_floor.py is how a golden's supplied floor was written (an AV1 encoder over each piece of the generated fixture, the policy's listing set to it); it is not a step of verification, since an encoder's output is pinned by the listing, not re-derived.

  • source_diff.py runs the source readers differentially: seeded Y4M and WAV mutations (dimensions and channel counts at and past their range, every format field, truncations, single-byte changes), each file's verdict from wai-pack source-verdict equal to pack_verify.py's, and no reader panicking.

    python3 pack-conformance/source_diff.py <wai-pack binary> 1 3000