wai: stitched presentation — player-signed claims of stitched and interstitial ads, the signed pod-input record, ad frames in live-compose #470

Closed
dcharlot wants to merge 0 commits from wai/ssai-stitched into main
Owner

What this is

wai.video.stitched_presentation (new extension wai/extensions/stitched-presentation.md): a
player's signed claim that it presented an ad another party wrote into an HLS or DASH
stream (stitched into the segments, or served as an interstitial), beside a signed
pod-input record of each ad decision, so that presentations, quartiles and the spend that
counts are recomputed from what players signed rather than from requests a server saw. And two
ad-frame layouts in wai.live.compose (a squeeze and a double box), whose ad region the
stitched claims measure over.

  • WSC1, the stitched claim (§5). It names the ad by the marker the stream carries
    (§3): an EXT-X-DATERANGE tag's ID and START-DATE plus the ad identity an attribute of
    it carries; an interstitial date range's ID and START-DATE plus the index of the asset of
    the asset list the player was served, whose URI is the identity; or a DASH event's Period,
    schemeIdUri, value and id plus the identity an attribute carries. It states the
    SHA-256 of the manifest it read the marker from. It reuses ad-presentation's spans, rules,
    viewability rules, run, quartile and RFC 9577/9578 attestation by reference, under a session
    key made for one playback session and a redemption context of its own.
  • WSI1, the pod-input record (§4, RI2b), signed by the stitcher or by a proxy in front of
    the ad server: the response's digest (a VAST document, read; a VMAP document, bound; or a
    form-1 wai.video.ssai receipt by its identity), the chosen ads (marker digest, ad identity,
    identity in the response by VAST 4.3 §3.4.3 AdServingId or §3.3.2 Ad@id, §3.7.1
    universal creative identifier, creative digest, duration, price per presented impression and
    its source: the response's CPM Pricing (checked, scaled exactly by the currency's ISO 4217
    minor unit), a winning bid (its document bound by digest), or stated by the signer), the
    avail, the session it was decided for (or none, a break every viewer is shown), the
    measurement terms (ad-presentation §8's fields, claim required), and the frame.
  • Composited frames (§6, live-compose §5.9): the ad's region is an integer function of the
    record's frame fields; the claim states the region's share of the picture; a player measures
    the fraction of the region in view; one presentation is one claim per signing player.
  • Verification (§7): records against their responses (pod_response_mismatch when a
    price, a creative identifier or an identity is not the response's, or a form-1 receipt's
    impressions are not the ads), then claims against their record (session or shared) and the
    manifest's bytes (claim_marker_absent when the stream did not carry that marker with that
    identity), one own claim a session, then each ad's presentations, the five quartile counts,
    and the spend by currency, never summed across currencies. A form-1 receipt's stated
    quartiles and billable spend are stated beside the presented ones.
  • SsaiReceipt (form 1) gains a JSON carriage (to_json/from_json, §4.5), so it can be
    a record's response; its signed bytes, its identity and the pinned legacy receipt hash are
    unchanged (test a_stitched_receipt_reads_back_from_its_json).
  • live-compose layouts 3 (squeeze) and 4 (double box): the ad participant is marked by
    pip_attr, the program is the first of the others (featured first); §3.3 holds the frame's
    fields; the frame gives the program's tile, the ad's tile and the ad region. The corpus gains
    layout cases of both frames and refusals of their fields; live_compose_verify.py lays them
    out itself.

What runs, and how

  • The tool and service: wai_stitched_presentation (feature stitched_presentation):
    vectors gen|verify, verify <bundle.json>, sign-pod <draft.json> --key <seed>, and
    serve --listen 127.0.0.1:9690 answering POST /v1/verify and GET /v1/health (loopback
    only; bounded head, body, time and connections; stateless).
  • The browser producer: joule-moq-web/web/ads/stitched.js (no dependency) reads markers
    from playlists, asset lists and MPDs, computes an ad frame's region and the fraction of it in
    view, and writes and signs the claim with WebCrypto Ed25519, using ad-presentation's span
    recorder.
  • CI: a new wai-conformance step, "stitched presentation · wai-rs,
    stitched_presentation_verify.py and the reference producer", and a paths: entry for the
    extension. The existing live-ads step's --lib wai_video_ssai:: covers the form-1 carriage.

Design decisions

  • A claim of its own, not a WPC1 version 2. ad-presentation's claim is bound to a room,
    a break digest and a break-form receipt; a stitched ad has none. A separate magic keeps every
    WPC1 byte and both of its implementations unchanged, while the spans, rules, viewability,
    quartile and attestation are taken from ad-presentation by reference (and in code: the
    module calls presentation::{quartile, runs, rules_hold, token_challenge, read_token, issuer_verifies}).
  • Markers by body, not by digest alone. The claim carries the marker's fields, so a
    verifier holding the manifest re-reads the marker from the bytes; the record carries the
    digest. ID+START-DATE stays the same across a live playlist's reloads.
  • The manifest is required. A claim whose manifest the verifier does not hold is refused
    (claim_manifest_unknown): "identified by manifest hash" is checked, not trusted.
  • Sessions from the key alone. The stitched session is SHA-256 of a domain and the session
    key, since a stitched stream has no room id; the signer must take the session from the
    player's key (§4.6). A shared record (linear channel, composited break) counts each distinct
    session's presented claim once, and the text says a shared record should require attestation
    because anyone can mint keys.
  • Quartiles recomputed, not compared. Unlike WPC1's claim_quartile_mismatch, the verifier
    states the quartile the claim reaches and, for a form-1 response, the stated one beside it:
    the prefetch case (segments fetched, never presented) is the difference.
  • Price per presented impression, in millionths of a minor unit, so spend is a count times
    a price; a CPM Pricing value is checked exactly (P × 10^(e+3)), and a value that does not
    scale to an integer refuses the record.
  • Magics WSI1/WSC1. The first draft used WPI1/WPS1, which co-performance already defines;
    the registry's wire-identifier table showed the collision, and the second commit renamed them.
  • An XML subset of its own (§3.5) for MPDs and VAST documents, in Rust, Python and
    JavaScript each written separately: no document type declarations, five entities and
    character references, local names, no attribute-value normalisation. No new dependency.
  • The ad region is a fact of the corpus. A falsification moved a squeeze's side band and
    the corpus still verified (same area); each accepted record now states its share and region.

Checks (all on the build host through rb, except the light scripts run locally)

check command result
module unit tests cargo test --locked --no-default-features --features stitched_presentation --lib stitched_presentation:: 6 passed
ad-frame unit tests cargo test --locked --no-default-features --features stitched_presentation --lib live_compose::layout::frame_tests 2 passed
corpus test cargo test --locked --no-default-features --features stitched_presentation --test stitched_presentation 3 passed
tool's corpus check cargo run -q --locked --no-default-features --features stitched_presentation --bin wai_stitched_presentation -- vectors verify ../live-conformance/stitched PASS, PASS
live-compose cargo test … --features live_compose --lib live_compose:: / --test live_compose / wai_live_compose_vectors verify 9 passed / 4 passed / PASS, PASS
live-ads, form 1 cargo test … --features live_ads --lib live_ads:: / --lib wai_video_ssai:: / --test live_ads / --test ad_presentation 12 / 14 / 3 / 3 passed
registry cargo test --locked --no-default-features --lib codecs::registry; cargo run … --bin wai -- registry export --check 14 passed; up to date
clippy cargo clippy --locked --no-default-features --features {stitched_presentation,live_compose,live_ads} --all-targets no note in a file this PR adds or touches beyond the one already on main (wai_video_ssai.rs:211, pre-existing)
lockfiles cargo metadata --locked --offline --format-version 1 for wai-rs, wai-live-web, joule-moq-room exit 0 (no dependency added)
dependents cargo check --locked in wai/wai-live-web and joule-moq-room (both enable live_compose) exit 0
independent verifier python3 -I live-conformance/stitched_presentation_verify.py live-conformance/stitched PASS; every mutated copy fails; every weakened verifier is caught
other verifiers of touched texts live_compose_verify.py compose, live_ads_verify.py ads, ad_presentation_verify.py presentation, browser_sink_verify.py browser, claim_verify.py (default and consumption) exit 0 each
browser producers node --test …/web/ads/stitched.test.mjs; …/presentation.test.mjs 6 passed; unchanged
browser e2e, compose BROWSER_BIN=<host browser> e2e/run.sh --only compose ok: every layout (the ad frames among them), mix, descriptor and composition case through the wasm build gives the corpus's outcome, none differ; wai-rs's own corpus check holds in the browser; exit 0
tool and service verify of each vector's bundle; serve on loopback: health, POST /v1/verify, 413, 400, 405, 404, 408 (slow head), a non-loopback --listen refused; sign-pod reproduces the corpus's first record byte for byte and refuses a draft breaking §4.4 all as stated
workflow steps python3 wfsteps.py HEAD 9d984511a origin/main cc93f4b38; ruby -ryaml over .github/workflows/*.yml 0 problems; parse
repo checks check-tests-in-ci.py, check-workflow-concurrency.sh, check-spec-refs.py, check-wai-section-refs.py, check-no-vanity-metrics.sh, test-public-text-checks.sh, check-comparative-prose.sh, check-orphan-sources.py exit 0 each
public names check-public-names.sh over the changed files and the full scope; commit messages and this body with grep -E clean

Falsifications (committed first; each mutation broke one rule; the guarding check failed; restored)

# mutation check exit
F1 the marker is not read from the manifest --test stitched_presentation 101
F2 a claim's frame share is not checked same 101
F3 CPM scaled by 10^(e+2) same 101
F4 spend summed across currencies same 101
F5 an own claim counts whatever its verdict same 101
F6 a squeeze's side band on the window's side same (after the region became a fact; first it passed, which is why) 101
F7 a squeeze's window drawn under the ad --test live_compose 101
F8 §9 lists one code fewer the_extension_lists_the_reasons 101
F9 a session record counts any session's claim --test stitched_presentation 101
F10 the Python ad frame's side band moved stitched_presentation_verify.py 1
F11 the JS marker body's fields swapped stitched.test.mjs 1
F12 JS measures the whole picture, not the region stitched.test.mjs 1
F13 Python accepts a claim of a session no record was decided for stitched_presentation_verify.py 1
F14 a corpus byte: a squeeze's stated share stitched_presentation_verify.py 1

The Python verifier also mutates copies of the corpus, one defect each, and drops each of its
own checks in turn; every copy and every weakened verifier is caught.

Not done

  • No adapter for any particular player. The producer takes manifest bytes and
    observations; driving it from a player's own events is RI1's audit kit.
  • No ad-request proxy. The record format and sign-pod are here; a proxy that forwards a
    stitcher's ad requests, digests the VAST response as received and signs per decision is not.
  • VMAP and winning-bid documents are bound by digest and not read: no text of either was
    read for this revision.
  • No viewability rule of its own for a composited ad: no text read defines one; the
    claim states the region's share for a buyer to weigh.
  • HLS and DASH texts: this revision relies on what live-ads read (draft-22 §4.2, §4.4.5.1,
    Appendix D; ISO/IEC 23009-1:2026's schema) and re-read nothing of them.
  • No per-client limits on the service beyond its connection, body and time bounds.
  • Not deployed; the deploy note says how it would run.

🤖 Generated with Claude Code


Closed: Landed on main through merge train E (#499, merge bf39ec9a); verified by content: this PR's head is in main

## What this is `wai.video.stitched_presentation` (new extension `wai/extensions/stitched-presentation.md`): a player's signed claim that it presented an ad **another party** wrote into an HLS or DASH stream (stitched into the segments, or served as an interstitial), beside a signed **pod-input record** of each ad decision, so that presentations, quartiles and the spend that counts are recomputed from what players signed rather than from requests a server saw. And two **ad-frame layouts** in `wai.live.compose` (a squeeze and a double box), whose ad region the stitched claims measure over. - **`WSC1`, the stitched claim** (§5). It names the ad by the **marker** the stream carries (§3): an `EXT-X-DATERANGE` tag's `ID` and `START-DATE` plus the ad identity an attribute of it carries; an interstitial date range's `ID` and `START-DATE` plus the index of the asset of the asset list the player was served, whose `URI` is the identity; or a DASH event's Period, `schemeIdUri`, `value` and `id` plus the identity an attribute carries. It states the SHA-256 of the manifest it read the marker from. It reuses ad-presentation's spans, rules, viewability rules, run, quartile and RFC 9577/9578 attestation by reference, under a session key made for one playback session and a redemption context of its own. - **`WSI1`, the pod-input record** (§4, RI2b), signed by the stitcher or by a proxy in front of the ad server: the response's digest (a VAST document, read; a VMAP document, bound; or a form-1 `wai.video.ssai` receipt by its identity), the chosen ads (marker digest, ad identity, identity in the response by VAST 4.3 §3.4.3 `AdServingId` or §3.3.2 `Ad@id`, §3.7.1 universal creative identifier, creative digest, duration, price per presented impression and its source: the response's CPM `Pricing` (checked, scaled exactly by the currency's ISO 4217 minor unit), a winning bid (its document bound by digest), or stated by the signer), the avail, the session it was decided for (or none, a break every viewer is shown), the measurement terms (ad-presentation §8's fields, claim required), and the frame. - **Composited frames** (§6, live-compose §5.9): the ad's region is an integer function of the record's frame fields; the claim states the region's share of the picture; a player measures the fraction of the **region** in view; one presentation is one claim per signing player. - **Verification** (§7): records against their responses (`pod_response_mismatch` when a price, a creative identifier or an identity is not the response's, or a form-1 receipt's impressions are not the ads), then claims against their record (session or shared) and the manifest's bytes (`claim_marker_absent` when the stream did not carry that marker with that identity), one own claim a session, then each ad's presentations, the five quartile counts, and the spend by currency, never summed across currencies. A form-1 receipt's stated quartiles and billable spend are stated beside the presented ones. - **`SsaiReceipt` (form 1) gains a JSON carriage** (`to_json`/`from_json`, §4.5), so it can be a record's response; its signed bytes, its identity and the pinned legacy receipt hash are unchanged (test `a_stitched_receipt_reads_back_from_its_json`). - **live-compose layouts 3 (squeeze) and 4 (double box)**: the ad participant is marked by `pip_attr`, the program is the first of the others (featured first); §3.3 holds the frame's fields; the frame gives the program's tile, the ad's tile and the ad region. The corpus gains layout cases of both frames and refusals of their fields; `live_compose_verify.py` lays them out itself. ## What runs, and how - **The tool and service**: `wai_stitched_presentation` (feature `stitched_presentation`): `vectors gen|verify`, `verify <bundle.json>`, `sign-pod <draft.json> --key <seed>`, and `serve --listen 127.0.0.1:9690` answering `POST /v1/verify` and `GET /v1/health` (loopback only; bounded head, body, time and connections; stateless). - **The browser producer**: `joule-moq-web/web/ads/stitched.js` (no dependency) reads markers from playlists, asset lists and MPDs, computes an ad frame's region and the fraction of it in view, and writes and signs the claim with WebCrypto Ed25519, using ad-presentation's span recorder. - **CI**: a new `wai-conformance` step, "stitched presentation · wai-rs, stitched_presentation_verify.py and the reference producer", and a `paths:` entry for the extension. The existing live-ads step's `--lib wai_video_ssai::` covers the form-1 carriage. ## Design decisions - **A claim of its own, not a WPC1 version 2.** ad-presentation's claim is bound to a room, a break digest and a break-form receipt; a stitched ad has none. A separate magic keeps every WPC1 byte and both of its implementations unchanged, while the spans, rules, viewability, quartile and attestation are taken from ad-presentation by reference (and in code: the module calls `presentation::{quartile, runs, rules_hold, token_challenge, read_token, issuer_verifies}`). - **Markers by body, not by digest alone.** The claim carries the marker's fields, so a verifier holding the manifest re-reads the marker from the bytes; the record carries the digest. `ID`+`START-DATE` stays the same across a live playlist's reloads. - **The manifest is required.** A claim whose manifest the verifier does not hold is refused (`claim_manifest_unknown`): "identified by manifest hash" is checked, not trusted. - **Sessions from the key alone.** The stitched session is SHA-256 of a domain and the session key, since a stitched stream has no room id; the signer must take the session from the player's key (§4.6). A shared record (linear channel, composited break) counts each distinct session's presented claim once, and the text says a shared record should require attestation because anyone can mint keys. - **Quartiles recomputed, not compared.** Unlike WPC1's `claim_quartile_mismatch`, the verifier states the quartile the claim reaches and, for a form-1 response, the stated one beside it: the prefetch case (segments fetched, never presented) is the difference. - **Price per presented impression**, in millionths of a minor unit, so spend is a count times a price; a CPM `Pricing` value is checked exactly (`P × 10^(e+3)`), and a value that does not scale to an integer refuses the record. - **Magics WSI1/WSC1.** The first draft used WPI1/WPS1, which co-performance already defines; the registry's wire-identifier table showed the collision, and the second commit renamed them. - **An XML subset of its own** (§3.5) for MPDs and VAST documents, in Rust, Python and JavaScript each written separately: no document type declarations, five entities and character references, local names, no attribute-value normalisation. No new dependency. - **The ad region is a fact of the corpus.** A falsification moved a squeeze's side band and the corpus still verified (same area); each accepted record now states its share and region. ## Checks (all on the build host through `rb`, except the light scripts run locally) | check | command | result | |---|---|---| | module unit tests | `cargo test --locked --no-default-features --features stitched_presentation --lib stitched_presentation::` | 6 passed | | ad-frame unit tests | `cargo test --locked --no-default-features --features stitched_presentation --lib live_compose::layout::frame_tests` | 2 passed | | corpus test | `cargo test --locked --no-default-features --features stitched_presentation --test stitched_presentation` | 3 passed | | tool's corpus check | `cargo run -q --locked --no-default-features --features stitched_presentation --bin wai_stitched_presentation -- vectors verify ../live-conformance/stitched` | PASS, PASS | | live-compose | `cargo test … --features live_compose --lib live_compose::` / `--test live_compose` / `wai_live_compose_vectors verify` | 9 passed / 4 passed / PASS, PASS | | live-ads, form 1 | `cargo test … --features live_ads --lib live_ads::` / `--lib wai_video_ssai::` / `--test live_ads` / `--test ad_presentation` | 12 / 14 / 3 / 3 passed | | registry | `cargo test --locked --no-default-features --lib codecs::registry`; `cargo run … --bin wai -- registry export --check` | 14 passed; up to date | | clippy | `cargo clippy --locked --no-default-features --features {stitched_presentation,live_compose,live_ads} --all-targets` | no note in a file this PR adds or touches beyond the one already on main (`wai_video_ssai.rs:211`, pre-existing) | | lockfiles | `cargo metadata --locked --offline --format-version 1` for wai-rs, wai-live-web, joule-moq-room | exit 0 (no dependency added) | | dependents | `cargo check --locked` in `wai/wai-live-web` and `joule-moq-room` (both enable `live_compose`) | exit 0 | | independent verifier | `python3 -I live-conformance/stitched_presentation_verify.py live-conformance/stitched` | PASS; every mutated copy fails; every weakened verifier is caught | | other verifiers of touched texts | `live_compose_verify.py compose`, `live_ads_verify.py ads`, `ad_presentation_verify.py presentation`, `browser_sink_verify.py browser`, `claim_verify.py` (default and `consumption`) | exit 0 each | | browser producers | `node --test …/web/ads/stitched.test.mjs`; `…/presentation.test.mjs` | 6 passed; unchanged | | browser e2e, compose | `BROWSER_BIN=<host browser> e2e/run.sh --only compose` | ok: every layout (the ad frames among them), mix, descriptor and composition case through the wasm build gives the corpus's outcome, none differ; wai-rs's own corpus check holds in the browser; exit 0 | | tool and service | `verify` of each vector's bundle; `serve` on loopback: health, `POST /v1/verify`, 413, 400, 405, 404, 408 (slow head), a non-loopback `--listen` refused; `sign-pod` reproduces the corpus's first record byte for byte and refuses a draft breaking §4.4 | all as stated | | workflow steps | `python3 wfsteps.py HEAD 9d984511a origin/main cc93f4b38`; `ruby -ryaml` over `.github/workflows/*.yml` | 0 problems; parse | | repo checks | `check-tests-in-ci.py`, `check-workflow-concurrency.sh`, `check-spec-refs.py`, `check-wai-section-refs.py`, `check-no-vanity-metrics.sh`, `test-public-text-checks.sh`, `check-comparative-prose.sh`, `check-orphan-sources.py` | exit 0 each | | public names | `check-public-names.sh` over the changed files and the full scope; commit messages and this body with `grep -E` | clean | ## Falsifications (committed first; each mutation broke one rule; the guarding check failed; restored) | # | mutation | check | exit | |---|---|---|---| | F1 | the marker is not read from the manifest | `--test stitched_presentation` | 101 | | F2 | a claim's frame share is not checked | same | 101 | | F3 | CPM scaled by 10^(e+2) | same | 101 | | F4 | spend summed across currencies | same | 101 | | F5 | an own claim counts whatever its verdict | same | 101 | | F6 | a squeeze's side band on the window's side | same (after the region became a fact; first it passed, which is why) | 101 | | F7 | a squeeze's window drawn under the ad | `--test live_compose` | 101 | | F8 | §9 lists one code fewer | `the_extension_lists_the_reasons` | 101 | | F9 | a session record counts any session's claim | `--test stitched_presentation` | 101 | | F10 | the Python ad frame's side band moved | `stitched_presentation_verify.py` | 1 | | F11 | the JS marker body's fields swapped | `stitched.test.mjs` | 1 | | F12 | JS measures the whole picture, not the region | `stitched.test.mjs` | 1 | | F13 | Python accepts a claim of a session no record was decided for | `stitched_presentation_verify.py` | 1 | | F14 | a corpus byte: a squeeze's stated share | `stitched_presentation_verify.py` | 1 | The Python verifier also mutates copies of the corpus, one defect each, and drops each of its own checks in turn; every copy and every weakened verifier is caught. ## Not done - **No adapter for any particular player.** The producer takes manifest bytes and observations; driving it from a player's own events is RI1's audit kit. - **No ad-request proxy.** The record format and `sign-pod` are here; a proxy that forwards a stitcher's ad requests, digests the VAST response as received and signs per decision is not. - **VMAP and winning-bid documents are bound by digest and not read**: no text of either was read for this revision. - **No viewability rule of its own for a composited ad**: no text read defines one; the claim states the region's share for a buyer to weigh. - **HLS and DASH texts**: this revision relies on what live-ads read (draft-22 §4.2, §4.4.5.1, Appendix D; ISO/IEC 23009-1:2026's schema) and re-read nothing of them. - **No per-client limits** on the service beyond its connection, body and time bounds. - Not deployed; the deploy note says how it would run. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- **Closed:** Landed on main through merge train E (#499, merge bf39ec9a); verified by content: this PR's head is in main
wai.video.stitched_presentation (extensions/stitched-presentation.md): a WPS1 claim names an ad
by the marker the stream carries for it (an EXT-X-DATERANGE tag, an interstitial's asset, a DASH
event) in the manifest it states the SHA-256 of; a WPI1 pod-input record, signed by the
stitcher or a proxy in front of the ad server, binds the response digest, the chosen ads, their
creatives and prices, the avail, the frame and the measurement terms; a verifier recomputes
each ad's presentations, quartiles and the spend that counts by currency. A form-1
wai.video.ssai receipt gains a JSON carriage (its signed bytes unchanged) so it can be a
record's response. live-compose gains the squeeze and double-box ad frames (§5.9). Corpus
live-conformance/stitched/, its independent verifier stitched_presentation_verify.py, and the
browser producer web/ads/stitched.js with tests against the corpus.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The pod-input record and the claim were first written as WPI1 and WPS1, which co-performance
already defines (§5.1, §7.7); the registry's wire-identifier table showed the collision. They
are WSI1 and WSC1 now, the corpus regenerated. The capability is registered in
codecs/registry.rs with its two wire identifiers, the registry export regenerated, SPEC §5
gains its paragraph, the CHANGELOG its entries, and wai-conformance a step that runs the
module's tests, the corpus through the tool, the independent verifier and the browser
producer.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
An ad frame's function takes the descriptor's fields it reads (allowed too_many_arguments,
with the reason); the verifier keeps each ad's own claims by index alone; the XML subset's
name reader takes its stop characters as an array.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
A falsification moved a squeeze's side band onto the window's side and the corpus still
verified: the share is the same area, and no fact stated the rectangles. Each accepted record
now states its frame's share and its ad region's rectangles (live-compose §5.9), so wai-rs and
stitched_presentation_verify.py must agree on the region, not only its area; the Python
verifier gains the matching mutation.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai: stitched-presentation §7.2 step 5 states its refusal plainly
Some checks failed
wai-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Has been cancelled
WAI energy receipts / does this change touch it (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI conformance / does this change touch it (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
standards workspaces build + test / which workspaces this change touches (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (pull_request) Has been cancelled
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Has been cancelled
joule-code conformance gate / joule-moq-relay, every target (pull_request) Has been cancelled
joule-code conformance gate / joule-moq-ingest, every target (pull_request) Has been cancelled
4623548d63
Co-Authored-By: Claude Opus 5.5 <[email protected]>
dcharlot closed this pull request 2026-10-26 20:58:23 -04:00
Some checks failed
wai-web wasm32 / does this change touch it (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Has been cancelled
wai-quantum studio and desktop / does this change touch it (pull_request) Has been cancelled
wai-quantum studio and desktop / studio · browser (pull_request) Has been cancelled
wai-quantum studio and desktop / desktop app · macos (pull_request) Has been cancelled
wai-pack / wai-pack · does this change touch it (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Has been cancelled
WAI energy receipts / does this change touch it (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI conformance / does this change touch it (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
standards workspaces build + test / which workspaces this change touches (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (pull_request) Has been cancelled
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Has been cancelled
joule-code conformance gate / joule-moq-relay, every target (pull_request) Has been cancelled
joule-code conformance gate / joule-moq-ingest, every target (pull_request) Has been cancelled

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!470
No description provided.