open-standards/wai/live-conformance/native-sink
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 995b31b192
Some checks failed
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 24s
wai-audit collector and player integration / does this change touch it (push) Has been cancelled
wai-audit collector and player integration / collector · linux (push) Has been cancelled
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Has been cancelled
wai-fleet service / does this change touch it (push) Has been cancelled
wai-fleet service / service · linux (push) Has been cancelled
wai-fleet service / service · macos (push) Has been cancelled
wai-ledger service / does this change touch it (push) Has been cancelled
wai-ledger service / service · linux (push) Has been cancelled
wai-ledger service / service · macos (push) Has been cancelled
wai-sink-android native sink library / does this change touch it (push) Has been cancelled
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Has been cancelled
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Has been cancelled
wai-sink-swift native sink package / does this change touch it (push) Has been cancelled
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 49s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 12m0s
wai: the native sink corpus's no-conversion rule moves to wai/.gitattributes
2df4f582a put a .gitattributes (`* -text`) in live-conformance/native-sink/
so a checkout under core.autocrlf=true keeps the bytes wai.lock pins. That
directory is held to README.md and vectors.json alone by tests/native_sink.rs
and by native_sink_verify.py, so the native-sink conformance step failed on
main. The rule is now `live-conformance/native-sink/** -text` in wai/.gitattributes,
beside the other corpora's: git check-attr gives both files text unset, as
before, and cli_project's line-ending test still holds them.

Changelog: none
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 08:41:42 -05:00
..
README.md wai conform sink: the native sink through the conformance runner, and wai verify --conformant admits a result only for a run that passed 2026-11-04 12:29:01 -05:00
vectors.json wai: the Swift package of the native sink, and a log that keeps its order 2026-10-25 22:55:08 -04:00

live-conformance/native-sink — the native sink

The corpus of extensions/native-sink.md §10: scripts of the calls a native host makes to its sink over one session, each with the answer the call gets, and the outcome the owner's collector reaches for the session's bundle (stream-audit §10).

Sink equivalence. For each case, a conforming sink opened with the case's config, the session key whose seed is seed and the start start_us, and given each call's do in order, gives each call the answer it states: a playlist's verdict (§4.2), an object's verdict (§4.3), an observation's {"end"} (§6.1), {"ok": true} for an event, a parent receipt, an energy entry or an attachment, a CMCD batch, or the bundle (stream-audit §9) as the JSON text the sink writes; and a refused call {"error": <reason>}. The bundle, verified for owner serving channels, reaches the case's outcome. Each configuration under configs is refused with the reason it states. A sink that gives another answer, byte or reason does not conform.

Provenance. Generated here: wai_native_sink_vectors gen writes vectors.json from fixed seeds. Each key is SHA-256 of the corpus's label (wai:native-sink/corpus/key, a zero byte) and an index byte (0 the owner, 1 the publisher that seals the playlists, 2 a stranger); each session's seed is SHA-256 of wai:native-sink/corpus/session, a zero byte and an index byte; every time is a constant after 2026-10-25T00:00:00Z; and Ed25519 signing is deterministic (RFC 8032), so the file is the same bytes on every machine. The media are the reference package pack-conformance/packs/video-base-01's floor: its CMAF initialization section and five fragments, each named by its SHA-256 (packaging §7), copied byte for byte; a tampered fragment differs from its original in one bit of its last byte. The WAI objects are opaque test bytes (WAI1 and a SHA-256 of a label), named by their content hashes, which nothing decodes. The playlists are written here: the floor's, in the form http-delivery Appendix G renders, sealed by playlist receipts under the publisher's key; a WAI playlist of the objects; live revisions chained by their receipts; and a stream of another service, with a key, program times and an ad marked by EXT-X-DATERANGE. The observation cadences, stalls and energy figures are synthetic constants chosen to exercise the rules and were measured by nothing. The origins are .example names (RFC 2606). The generator asserts that each case gets the answers it was written to have before it writes it.

Layout

One file, vectors.json:

  • owner, channels: the collector's key and the channels it serves;
  • objects: every body a call names, hexadecimal, by name;
  • configs: configurations a session refuses;
  • cases: each with its name, a note, its config, seed, start_us, calls (each a do and its answer) and the bundle's outcome:
    • signed-vod, tampered-fragment, unsigned-refused, receipt-refusals, live-chain, wai-objects, live-rebound, third-party-ad, content-addressed, names-are-names, hidden, idle, energy, log-order, page-parity and refused-calls.

page-parity is also replayed by the page's integration of stream-audit, wai-audit/web/native-sink.test.mjs, which signs the same bundle byte for byte.

Rebuilding: cd wai/wai-rs && cargo run --no-default-features --features native_sink --bin wai_native_sink_vectors gen ../live-conformance/native-sink; … verify ../live-conformance/native-sink checks it; python3 -I ../live-conformance/native_sink_verify.py ../live-conformance/native-sink is the second implementation.

Running a sink against it. wai conform sink --suite native-sink --impl "<command> {case}" gives a sink each case with its answers withheld: the bodies its calls name (objects, hexadecimal), its config, seed and start_us, and each call's do; and each configuration under configs as a case of no call, under a seed of zeros. The sink writes its answer to each call in order, or, refusing the configuration, that refusal alone, one JSON text a line in RFC 8785 form. A case passes when what it writes has the SHA-256 of the answers this file states, written the same way, and the run's outcome is a signed conform-result/1 record (conformance-results). wai_native_sink_vectors answers {case} is the reference sink, and … answers --c-abi {case} the same sink through its C interface.