Some checks failed
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (push) Successful in 50s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 36s
wai-app and Create / wai-app · does this change touch it (push) Successful in 34s
wai-fleet service / does this change touch it (push) Successful in 35s
wai-ledger service / does this change touch it (push) Successful in 36s
WAI Studio / does this change touch it (push) Successful in 31s
wai-fleet service / service · macos (push) Successful in 1m10s
wai-ledger service / service · macos (push) Successful in 1m46s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 5m23s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 7m36s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 12s
joule-code conformance gate / Build + round-trip C1-C4 vectors (push) Successful in 2m28s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 16m14s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 42s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m47s
wai-ledger service / service · linux (push) Successful in 3m34s
wai-fleet service / service · linux (push) Successful in 4m25s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 2m50s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 6m55s
WAI Studio / Studio in WebKit · linux (push) Successful in 16m42s
joule-code conformance gate / joule-moq-relay, every target (push) Successful in 3m41s
joule-code conformance gate / joule-moq-ingest, every target (push) Successful in 6m10s
- joule-moq-web's web/binding/sink.html answers each call of live-conformance/browser with wai-live-web's wasm build and the page's own side table (web/room/binding.js), each answer one JSON text in RFC 8785 form; e2e/conform_sink.mjs drives it in a browser and is the HTTP adapter of wai conform sink --suite browser. With --wai it runs the runner itself, the record named for the page and the browser's version, and admits it with wai verify --conformant. - Run on the build host in its installed browser (156.0.8078.80, headless): 110 of 110 cases, conformant, admitted. Planted (--plant: frames the page shows as refused answered verified): 106 of 110, failing at frames/object_refused among four, and its record refused at admission rule 2. - e2e/run.sh runs both as its conform step (joule-moq-web.yml), the planted record's refusal checked too. - wai-breaking.yml: the relay's --version for the record drops the comma after the number. Co-Authored-By: Claude Opus 5.5 <[email protected]>
54 lines
4.5 KiB
Markdown
54 lines
4.5 KiB
Markdown
# live-conformance/browser — the browser sink
|
|
|
|
The corpus of [`extensions/browser-sink.md`](../../extensions/browser-sink.md) §12: capability
|
|
reports with the routing tables they give, constraint sets, energy entries, content bindings,
|
|
a chain of signed group receipts whose objects bind, the states of frames on screen, and
|
|
side-table sequences.
|
|
|
|
| member of `vectors.json` | what each case holds, and what a conforming implementation reaches |
|
|
|---|---|
|
|
| `routes` | a capability `report` (§3); the `outcome` (`routed`, or `refused` with the `reason`), and for a routed report its `table`: for each object its `route`, `reason`, each leg's outcome, `asked`, `tier` and energy entry (§4, §6), member for member |
|
|
| `constraints` | `sets` (or `null`: none) and declared `params`; the `outcome` of §5 (`unconstrained`, `satisfied`, `unsatisfied`, `unevaluable`) and its `reason` |
|
|
| `bindings` | a `value`; the `outcome` of reading it (§7.1), its `reason` when refused, its `canonical` form and its `tier` when read |
|
|
| `frame_tiers` | a route, the route's tier, whether the frame's `format` is null and whether the page altered it; the frame's `tier` (§7.2) |
|
|
| `chain` | group receipts of jwp-receipts' legacy form under one key, the second linked to the first; each group's `canonical` bytes and `link_hash`; each object's envelope (hexadecimal, or the file `int_motion.wai`), its object receipt, whether it verifies, and the `binding` a page that decoded it on the wasm route writes, in canonical form |
|
|
| `frames` | a binding (or `null`), the object's, chain's and provenance verdicts; the `result` of §10: `state`, `reason`, `tier`, `digest`, `receipt` |
|
|
| `tables` | a pending `bound` and a sequence of operations (`chunk`, `output`, `clone`, `transfer`, `close`, `reset`, `flush`); the `result` of §9.2: each open frame's binding in canonical form or `null`, the refusals by operation index, and the count of entries struck by a bound, a reset or a flush |
|
|
|
|
`int_motion.wai` is a `WAI1` envelope of `wai.video.int_motion`. A page decodes it on the wasm
|
|
route; each decoded frame's SHA-256, over `RGB8`, is stated by
|
|
[`../../wai-rs/tests/vectors/int_video/sha256.json`](../../wai-rs/tests/vectors/int_video/sha256.json)
|
|
(`int_video`), and the browser end-to-end scenario `binding` of `joule-moq-web` checks the frames
|
|
it decodes against those digests.
|
|
|
|
`wai_browser_sink_vectors verify` and `tests/browser_sink.rs` check that both files regenerate
|
|
byte for byte and that `wai-rs` reaches every outcome; the test also verifies the chain with
|
|
`jwp_delivery`. `../browser_sink_verify.py` is the second implementation, written from the
|
|
extension's text, sharing no code with `wai-rs`, and run as `python3 -I`.
|
|
|
|
Another browser sink runs the corpus through `wai conform sink --suite browser`, which writes a
|
|
signed record of the run (extensions/conformance-results.md). Each call of the families above but
|
|
the chain is a case, named `<family>/<name>` (`frame_tiers/<index>`): the sink is given the
|
|
call's inputs as `{"call": <family>, …}`, its answer withheld, and writes its answer, an object
|
|
of the members the table gives that family's outcome, as one JSON text in RFC 8785 form and a
|
|
line feed. The case passes when that has the SHA-256 of the answer the corpus states. The
|
|
reference sink's answer to one call is `wai_browser_sink_vectors answers <case.json>`:
|
|
|
|
wai conform sink --suite browser --root wai --impl 'wai_browser_sink_vectors answers {case}'
|
|
|
|
A page runs it in a browser too: `joule-moq-web`'s `web/binding/sink.html` answers each call with
|
|
`wai-live-web`'s wasm build and the page's own side table (`web/room/binding.js`), and
|
|
`e2e/conform_sink.mjs` is the runner's HTTP adapter for it, the record named for the page and the
|
|
browser's version:
|
|
|
|
node joule-code/joule-code-rs/crates/joule-moq-web/e2e/conform_sink.mjs --browser <browser> \
|
|
--wai <wai> --wai-dir wai --out browser-page.wai-conform.json
|
|
|
|
**Provenance.** Generated here: `wai_browser_sink_vectors gen` writes both files from constants
|
|
in `wai-rs/src/browser_sink/corpus.rs`. The signing key's seed is BLAKE3 of the corpus's fixed
|
|
label and an index, every time is a constant, and Ed25519 signing is deterministic (RFC 8032),
|
|
so the files are the same bytes on every machine. The capability reports, the user agents'
|
|
answers and the energy measurements are constants chosen to exercise each rule; they describe
|
|
no user agent or device and were measured by nothing. The envelopes wrap the `WIV1` payload
|
|
`wai-rs/tests/vectors/int_video/int_video_bitstream.wiv1`, whose provenance
|
|
`wai-rs/tests/vectors/README.md` states.
|