wai: the opportunity report and the statement check (wai.delivery.opportunity) #541

Merged
dcharlot merged 8 commits from wai/fast-statement-check into main 2026-10-29 22:16:45 -04:00
Owner

Stacked on #539 (wai/fast-revenue-share, the revenue share). This branch was made from #539's branch and has its latest commit merged in. Until #539 merges, the diff against main includes #539's commits. When #539 merges, origin/main gets merged into this branch (no rebase).

What this adds

wai.delivery.opportunity (wai/extensions/opportunity-report.md) is a new extension with its own text. It is not a set of sections added to revenue-share, for three reasons. A report rests on records the statement never reads: a room's cues, and the SCTE 35 sections those cues carry. A report needs no invoice, so an owner whose platform signs nothing can still use it. And #539's text and records keep their bytes.

  • The opportunity report, WOR1, covers one party of a revenue-share contract over one period. It states the ad breaks that aired in the programmes of the splits that party shares in. Breaks come from two places:

    • Cued breaks. A room the contract names (a carrier of kind 1) is verified as live-ads §9.2 steps 1–3 verify one: the room, its policy, and the schedule its accepted cues make. Each break is placed at t0 + t. When the opening cue is of form 1, its SCTE 35 section is read (§5) and held to the cue's summary.
    • Scheduled breaks. These are the ad entries of the signed program-as-run that no cued break starts within. An entry aired in two windows counts once.

    Each break is attributed by its start, as revenue-share §6 attributes an impression. The report has one line per split and class (cued, scheduled), each giving breaks, break_ms, slots, unslotted and the party's ppm. Each line carries a citation digest of its cues (kind 12), the policy when slots come from it (kind 13) and its runs (kind 10). The report is signed by its issuer (the owner, the operator or an auditor), and every figure is recomputed.

  • The reported statement is a platform-neutral JSON form (§9.1) and CSV form (RFC 4180, §9.2). Each gives the channel, the period, the currency, a basis (gross or share), impressions and revenue as an integer amount, and optionally figures per day and per programme. It is an input and never evidence: a check names it by the SHA-256 of its bytes.

  • The statement check, WCK1. It has one line for the period, one per day and one per programme. Each line gives:

    • the opportunities;
    • the reported impressions and revenue;
    • fill_ppm = ⌊impressions × 10⁶ / slots⌋;
    • revenue_per_slot = ⌊revenue / slots⌋.

    Arithmetic is in integers; a quotient too large for its field is held at 2⁶⁴ − 1.

    The flags:

    • unproved: impressions reported where no break aired;
    • above and below: the line's fill is outside [floor, ceiling] × the period's own rate. The check states its bounds; the defaults are 500000 and 2000000 ppm;
    • impressions_above_signed, impressions_below_signed, revenue_above_signed, revenue_below_signed: when #539's signed statement for the same contract, party and period is given, its impressions and revenue (the gross sum, or the party's total) sit beside the reported figures on the period line.
  • Operations, under the agent rules:

    • opportunity.create: wai opportunity create;
    • opportunity.verify: wai opportunity verify, which takes a report's document or a check's;
    • statement.check: wai statement check, which reads CSV for a file named .csv.

    All three need the feature opportunity_report (= revenue_share). ops.json, Studio's actions.generated.js and the registry export were regenerated, not hand-merged.

  • wai-rs: the module opportunity_report with the submodules section (the SCTE 35 subset reader and the corpus's section writer), reported and corpus; the bin wai_opportunity_vectors; the test tests/opportunity_report.rs.

  • Conformance: live-conformance/opportunity/ (50 vectors, 11 accepted) and the independent opportunity_report_verify.py.

  • The rest: the CI step in wai-conformance.yml and the cli_ops run in wai-catalogue.yml; entries in REGISTRY.md (the record, and magics WOR1 §7.1 and WCK1 §10.1; WSC1 was taken), the registry export, the vocabulary, SPEC §5 and CHANGELOG. All my additions to shared files sit in their own blocks.

Design decisions

  • The cues are a room's cues. The opportunity report reuses live-ads' verification of a room (grants, chains, the schedule rules), so the trust root is the room the contract already names. No cue signer is added to WRC1, whose bytes stay the same. An injector's cues (cue-injection) are cues of the room. The report does not translate their WIJ1 records again; cue-injection §8 does that.

  • What a section states (§5). The report reads the CRC, the header, splice_insert(), time_signal() and splice_null(), and the CUEI segmentation descriptors. From them it takes three things:

    • slots: the sub_segments_expected of the first placement-opportunity start descriptor (0x34 or 0x36);
    • duration: break_duration, or the opening descriptor's segmentation_duration;
    • id: splice_event_id, or the opening descriptor's segmentation_event_id.

    A section that does not read is cue_section_invalid. If the summary contradicts the section (a cancel or a return in the section, another id, or ⌊ticks/90⌋ ≠ duration_ms), the cue is cue_section_mismatch. Where no section states slots, a cued break takes its room policy's slots. A scheduled break is unslotted.

  • Refusals, never silent drops. A cued break in the period that lies outside every window is refused outside_window, as revenue-share refuses such an impression. When two rooms' breaks overlap, the report refuses break_overlap rather than count one break twice. Breaks outside the period belong to another period's report.

  • The fill is impressions per slot. That number is audience × share of slots filled, and no record states an audience. So above and below are relative to the period's own rate. A reported statement that is low on every line is flagged only against the signed statement (§10.3, §15).

  • Signed figures on the period line only. Statement lines are per split, and a party's part is rounded once per line.

  • Changes to #539's files are visibility only: revenue_share::{the_runs, asset_at} become pub(crate), and eight CLI helpers in dx/share.rs become pub(super).

Checks

Builds, tests and Python verifiers ran on the Framework box via [email protected] ~/kani-logs/remote/rb. Light scripts ran locally. Head is 026e5416, after merging #539's latest commit.

check command result
unit tests cargo test --locked --no-default-features --features opportunity_report --lib opportunity_report:: 12 passed
integration test cargo test --locked --no-default-features --features opportunity_report --test opportunity_report 6 passed (byte-for-byte regeneration, outcomes, reason coverage, §13 exact, worked example, every break kind)
revenue share still holds … --test revenue_share 7 passed
CI's full feature list cargo test --features "$WAI_FEATURES" --test opportunity_report --test revenue_share and --lib opportunity_report:: 6 + 7 + 12 passed
corpus cargo run --features opportunity_report --bin wai_opportunity_vectors verify ../live-conformance/opportunity PASS regenerates, PASS every vector
second implementation python3 -I live-conformance/opportunity_report_verify.py live-conformance/opportunity exit 0: 50/50 vectors agree with Rust, SCTE 35 §14.1 sample, reason coverage and accounting, 115 mutated copies fail, 32 dropped checks caught
other verifiers revenue_share_verify.py, browser_sink_verify.py, sink_energy_verify.py, live_ads_verify.py, receipt_ledger_verify.py exit 0 each
CLI cargo test --features quickstart --bin wai --test cli_ops; … quickstart,opportunity_report …; … quickstart,revenue_share --test cli_ops 47 + 10 passed each
catalogue, registry cargo test --lib catalogue (6), --lib registry (20), --test cli_registry (6), --lib vocab_pin_terms (1) passed
exports wai ops export --check ../catalogue/ops.json; wai registry export --check; node wai/wai-studio/scripts/actions.mjs --check up to date
clippy cargo clippy --all-targets with quickstart,opportunity_report, quickstart,revenue_share, quickstart 0 notes in touched files
compatibility wai breaking --against 564a42df (merge base with main) no unacknowledged breaking change (additions only)
lockfile cargo metadata --locked --offline --format-version 1 exit 0; no new dependency
workflows python3 ~/kani-logs/wfsteps.py HEAD HEAD^1 HEAD^2; ruby -ryaml over .github/workflows/*.yml 0 problem(s); 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, check-wai-ops-doors(-selftest) exit 0 each
public names check-public-names.sh over the 28 changed files; grep -E of commit messages and this body clean

Falsifications

All were run after committing. Each mutation was applied in the rb snapshot with an anchor check and restored with git checkout.

# rule broken guard exit
F1 CRC polynomial 0x04C11DB7 → …B6 --lib opportunity_report::section 101
F2 §5.3 agreement dropped wai_opportunity_vectors verify 1
F3 §4.2 cued test dropped same 1
F4 §4.2 dedupe dropped same 1
F5 below inverted worked example 101
F6 signed comparison dropped worked example 101
F7 a §13 row removed section_13… test 101; Python verifier 1 (this second guard was added after the first run let it pass) 101 / 1
F8 statement.check's --dry-run sample removed cli_ops 101
F9 Python agrees() made always true Python verifier 1
F10 one vector's stated flags changed Python 1, Rust 1 1

Not in this PR

  • parsers for any platform's own report format;
  • the hosted statement-check service and its UI;
  • payouts and deploys;
  • re-translating cue-injection's WIJ1 records, which cue-injection §8 does;
  • per-day or per-programme signed figures.

No existing record's signed format changes.

🤖 Generated with Claude Code

**Stacked on #539** (`wai/fast-revenue-share`, the revenue share). This branch was made from #539's branch and has its latest commit merged in. Until #539 merges, the diff against main includes #539's commits. When #539 merges, `origin/main` gets merged into this branch (no rebase). ## What this adds `wai.delivery.opportunity` ([`wai/extensions/opportunity-report.md`](wai/extensions/opportunity-report.md)) is a new extension with its own text. It is not a set of sections added to revenue-share, for three reasons. A report rests on records the statement never reads: a room's cues, and the SCTE 35 sections those cues carry. A report needs no invoice, so an owner whose platform signs nothing can still use it. And #539's text and records keep their bytes. - **The opportunity report, `WOR1`**, covers one party of a revenue-share contract over one period. It states the ad breaks that aired in the programmes of the splits that party shares in. Breaks come from two places: - **Cued breaks.** A room the contract names (a carrier of kind 1) is verified as live-ads §9.2 steps 1–3 verify one: the room, its policy, and the schedule its accepted cues make. Each break is placed at `t0 + t`. When the opening cue is of form 1, its SCTE 35 section is read (§5) and held to the cue's summary. - **Scheduled breaks.** These are the `ad` entries of the signed program-as-run that no cued break starts within. An entry aired in two windows counts once. Each break is attributed by its start, as revenue-share §6 attributes an impression. The report has one line per split and class (cued, scheduled), each giving breaks, `break_ms`, slots, unslotted and the party's `ppm`. Each line carries a citation digest of its cues (kind 12), the policy when slots come from it (kind 13) and its runs (kind 10). The report is signed by its issuer (the owner, the operator or an auditor), and every figure is recomputed. - **The reported statement** is a platform-neutral JSON form (§9.1) and CSV form (RFC 4180, §9.2). Each gives the channel, the period, the currency, a basis (`gross` or `share`), impressions and revenue as an integer amount, and optionally figures per day and per programme. It is an input and never evidence: a check names it by the SHA-256 of its bytes. - **The statement check, `WCK1`.** It has one line for the period, one per day and one per programme. Each line gives: - the opportunities; - the reported impressions and revenue; - `fill_ppm` = ⌊impressions × 10⁶ / slots⌋; - `revenue_per_slot` = ⌊revenue / slots⌋. Arithmetic is in integers; a quotient too large for its field is held at 2⁶⁴ − 1. The flags: - `unproved`: impressions reported where no break aired; - `above` and `below`: the line's fill is outside [floor, ceiling] × the period's own rate. The check states its bounds; the defaults are 500000 and 2000000 ppm; - `impressions_above_signed`, `impressions_below_signed`, `revenue_above_signed`, `revenue_below_signed`: when #539's signed statement for the same contract, party and period is given, its impressions and revenue (the gross sum, or the party's total) sit beside the reported figures on the period line. - **Operations**, under the agent rules: - `opportunity.create`: `wai opportunity create`; - `opportunity.verify`: `wai opportunity verify`, which takes a report's document or a check's; - `statement.check`: `wai statement check`, which reads CSV for a file named `.csv`. All three need the feature `opportunity_report` (= `revenue_share`). `ops.json`, Studio's `actions.generated.js` and the registry export were regenerated, not hand-merged. - **wai-rs:** the module `opportunity_report` with the submodules `section` (the SCTE 35 subset reader and the corpus's section writer), `reported` and `corpus`; the bin `wai_opportunity_vectors`; the test `tests/opportunity_report.rs`. - **Conformance:** `live-conformance/opportunity/` (50 vectors, 11 accepted) and the independent `opportunity_report_verify.py`. - **The rest:** the CI step in `wai-conformance.yml` and the `cli_ops` run in `wai-catalogue.yml`; entries in REGISTRY.md (the record, and magics `WOR1` §7.1 and `WCK1` §10.1; `WSC1` was taken), the registry export, the vocabulary, SPEC §5 and CHANGELOG. All my additions to shared files sit in their own blocks. ## Design decisions - **The cues are a room's cues.** The opportunity report reuses live-ads' verification of a room (grants, chains, the schedule rules), so the trust root is the room the contract already names. No cue signer is added to `WRC1`, whose bytes stay the same. An injector's cues (cue-injection) are cues of the room. The report does not translate their `WIJ1` records again; cue-injection §8 does that. - **What a section states (§5).** The report reads the CRC, the header, `splice_insert()`, `time_signal()` and `splice_null()`, and the `CUEI` segmentation descriptors. From them it takes three things: - **slots:** the `sub_segments_expected` of the first placement-opportunity start descriptor (0x34 or 0x36); - **duration:** `break_duration`, or the opening descriptor's `segmentation_duration`; - **id:** `splice_event_id`, or the opening descriptor's `segmentation_event_id`. A section that does not read is `cue_section_invalid`. If the summary contradicts the section (a cancel or a return in the section, another id, or ⌊ticks/90⌋ ≠ `duration_ms`), the cue is `cue_section_mismatch`. Where no section states slots, a cued break takes its room policy's `slots`. A scheduled break is unslotted. - **Refusals, never silent drops.** A cued break in the period that lies outside every window is refused `outside_window`, as revenue-share refuses such an impression. When two rooms' breaks overlap, the report refuses `break_overlap` rather than count one break twice. Breaks outside the period belong to another period's report. - **The fill is impressions per slot.** That number is audience × share of slots filled, and no record states an audience. So `above` and `below` are relative to the period's own rate. A reported statement that is low on every line is flagged only against the signed statement (§10.3, §15). - **Signed figures on the period line only.** Statement lines are per split, and a party's part is rounded once per line. - **Changes to #539's files are visibility only:** `revenue_share::{the_runs, asset_at}` become `pub(crate)`, and eight CLI helpers in `dx/share.rs` become `pub(super)`. ## Checks Builds, tests and Python verifiers ran on the Framework box via `[email protected] ~/kani-logs/remote/rb`. Light scripts ran locally. Head is `026e5416`, after merging #539's latest commit. | check | command | result | |---|---|---| | unit tests | `cargo test --locked --no-default-features --features opportunity_report --lib opportunity_report::` | 12 passed | | integration test | `cargo test --locked --no-default-features --features opportunity_report --test opportunity_report` | 6 passed (byte-for-byte regeneration, outcomes, reason coverage, §13 exact, worked example, every break kind) | | revenue share still holds | `… --test revenue_share` | 7 passed | | CI's full feature list | `cargo test --features "$WAI_FEATURES" --test opportunity_report --test revenue_share` and `--lib opportunity_report::` | 6 + 7 + 12 passed | | corpus | `cargo run --features opportunity_report --bin wai_opportunity_vectors verify ../live-conformance/opportunity` | PASS regenerates, PASS every vector | | second implementation | `python3 -I live-conformance/opportunity_report_verify.py live-conformance/opportunity` | exit 0: 50/50 vectors agree with Rust, SCTE 35 §14.1 sample, reason coverage and accounting, 115 mutated copies fail, 32 dropped checks caught | | other verifiers | `revenue_share_verify.py`, `browser_sink_verify.py`, `sink_energy_verify.py`, `live_ads_verify.py`, `receipt_ledger_verify.py` | exit 0 each | | CLI | `cargo test --features quickstart --bin wai --test cli_ops`; `… quickstart,opportunity_report …`; `… quickstart,revenue_share --test cli_ops` | 47 + 10 passed each | | catalogue, registry | `cargo test --lib catalogue` (6), `--lib registry` (20), `--test cli_registry` (6), `--lib vocab_pin_terms` (1) | passed | | exports | `wai ops export --check ../catalogue/ops.json`; `wai registry export --check`; `node wai/wai-studio/scripts/actions.mjs --check` | up to date | | clippy | `cargo clippy --all-targets` with `quickstart,opportunity_report`, `quickstart,revenue_share`, `quickstart` | 0 notes in touched files | | compatibility | `wai breaking --against 564a42df` (merge base with main) | no unacknowledged breaking change (additions only) | | lockfile | `cargo metadata --locked --offline --format-version 1` | exit 0; no new dependency | | workflows | `python3 ~/kani-logs/wfsteps.py HEAD HEAD^1 HEAD^2`; `ruby -ryaml` over `.github/workflows/*.yml` | 0 problem(s); 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`, `check-wai-ops-doors(-selftest)` | exit 0 each | | public names | `check-public-names.sh` over the 28 changed files; `grep -E` of commit messages and this body | clean | ## Falsifications All were run after committing. Each mutation was applied in the rb snapshot with an anchor check and restored with `git checkout`. | # | rule broken | guard | exit | |---|---|---|---| | F1 | CRC polynomial 0x04C11DB7 → …B6 | `--lib opportunity_report::section` | 101 | | F2 | §5.3 agreement dropped | `wai_opportunity_vectors verify` | 1 | | F3 | §4.2 cued test dropped | same | 1 | | F4 | §4.2 dedupe dropped | same | 1 | | F5 | `below` inverted | worked example | 101 | | F6 | signed comparison dropped | worked example | 101 | | F7 | a §13 row removed | `section_13…` test 101; Python verifier 1 (this second guard was added after the first run let it pass) | 101 / 1 | | F8 | `statement.check`'s `--dry-run` sample removed | `cli_ops` | 101 | | F9 | Python `agrees()` made always true | Python verifier | 1 | | F10 | one vector's stated flags changed | Python 1, Rust 1 | 1 | ## Not in this PR - parsers for any platform's own report format; - the hosted statement-check service and its UI; - payouts and deploys; - re-translating cue-injection's `WIJ1` records, which cue-injection §8 does; - per-day or per-programme signed figures. No existing record's signed format changes. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
extensions/revenue-share.md: the share contract (WRC1) an operator and every
owner it names sign, mapping a channel's assets to splits of integer millionths
with a rule for breaks between programmes; the program-as-run's JSON carriage,
writing out the wai.video.channel receipt's signed bytes unchanged; impressions
from the receipt ledger's verified invoices, placed by their instants and
attributed to the programme on air; the statement (WRS1) of one party and one
period, divided by the largest-remainder rule and citing its records.

wai-rs: the revenue_share module (feature revenue_share), ChannelReceipt's JSON
carriage, the corpus generator and tests/revenue_share.rs with the worked
example. live-conformance/share/: the corpus, from fixed seeds and the ledger
corpus's sources.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Written from extensions/revenue-share.md, sharing no code with wai-rs: reads
every contract, run, marker and statement itself, verifies each ledger document
with receipt_ledger_verify.py, recomputes every attribution, line, division and
citation, and requires every mutated copy of the corpus and every weakened
verifier to fail. The text states the aired test of a run exactly; the module's
complex types are named.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
contract.create (wai contract create), contract.update (wai contract accept),
statement.create (wai statement create) and statement.verify (wai statement
verify), under the agent rules, with --dry-run samples in tests/cli_ops.rs and
an end-to-end test in tests/revenue_share.rs. wai.delivery.revenue_share and its
magics WRC1 and WRS1 in the registry, with the export regenerated; the catalogue
export and Studio's generated actions regenerated; a SPEC §5 paragraph and a
CHANGELOG entry. CI: the conformance step (module tests, the corpus test and
revenue_share_verify.py), the feature in the feature lists, and cli_ops with
quickstart,revenue_share in the catalogue job.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai catalogue: the feature revenue_share, so its operations are available in a build that has it
Some checks failed
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 14s
wai-pack / wai-pack · macos (pull_request) Successful in 2m42s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 43s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 8m43s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 9m31s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 4m11s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m23s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m48s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 13m27s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 11m49s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 6m31s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 5m44s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 11m48s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 16m46s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 5m41s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 7m9s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m3s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m42s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m56s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 20s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 10m41s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m20s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 16m10s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 12m55s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Failing after 12m51s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m31s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 22m25s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 6m55s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
5d0fc19cb1
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai_video_channel: the receipt's JSON carriage is the one JSON form
All checks were successful
WAI energy receipts / energy receipts · linux (pull_request) Successful in 10m42s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 15s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 8m18s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 10m4s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 36s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 6m51s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 6m15s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m28s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 13m24s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 8m21s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 14m46s
wai-pack / wai-pack · macos (pull_request) Successful in 3m46s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 2m58s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m38s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 18m3s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m3s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 5m12s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 18m46s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 11m3s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 6m34s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 11m56s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m55s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 26s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 25m34s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m32s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m31s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 18m1s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m13s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 36m12s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h4m5s
879e94957a
ChannelReceipt::to_json and from_json are the JSON form any record or tool that carries a
channel receipt uses, so the channel family has one carriage, not one per extension.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
extensions/opportunity-report.md: the ad breaks a channel's own signed records
prove, per owner and period (WOR1): the cues of a room a share contract names,
made into breaks by live-ads and their SCTE 35 sections read for slots, and the
program-as-run's ad entries no cue covers, each attributed by its start to the
programme on air; a documented JSON and CSV form for a platform's reported
figures, never evidence; and the check (WCK1) setting them side by side, with
the operator's signed revenue-share statement where given.

wai-rs: the opportunity_report module (feature opportunity_report), its SCTE 35
subset reader, the reported statement's reader, the corpus generator
wai_opportunity_vectors and tests/opportunity_report.rs with the worked example.
revenue_share's the_runs and asset_at become pub(crate), unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Written from extensions/opportunity-report.md and sharing no code with wai-rs:
it reads every report, check, SCTE 35 section and reported statement itself,
verifies contracts, runs and signed statements with revenue_share_verify.py and
rooms with live_ads_verify.py, recomputes every break, attribution, line,
citation and flag, requires every mutated copy of the corpus to fail and drops
each of its own checks in turn. The corpus gains the vectors those checks need:
a run of another channel, runs overlapping, an overlapping contract, a report
of the first hour alone, and the first hour split across two windows that both
air its ad slot.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
opportunity.create (wai opportunity create), opportunity.verify (wai
opportunity verify, a report's or a check's document) and statement.check (wai
statement check), under the agent rules, in a build with opportunity_report;
tests/cli_ops.rs holds --dry-run on the two that write. The catalogue export,
Studio's generated actions and the registry export are regenerated. REGISTRY.md
registers wai.delivery.opportunity and the magics WOR1 and WCK1; SPEC.md §5 and
CHANGELOG.md describe it. The conformance workflow runs the module's tests,
tests/opportunity_report.rs and opportunity_report_verify.py; the catalogue
workflow runs cli_ops with the feature.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
So a reason left out of §13's table is caught on this side too, as the Rust test
that §13 lists exactly the reference's codes catches it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge #539's branch (wai/fast-revenue-share) into wai/fast-statement-check
Some checks failed
wai-quantum docs, course and locales / the course and the command line's languages · linux (pull_request) Successful in 5m12s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 2m44s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 4m15s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 16m54s
wai-pack / wai-pack · macos (pull_request) Successful in 3m46s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 11m43s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 13m28s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 8m6s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 6m15s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 11s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m59s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 30s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 18m34s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 1m42s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 17m4s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 8m25s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 16m3s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 7m13s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m10s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 11m17s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 24m23s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 6m25s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m57s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 26s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 11m24s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m18s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 22m6s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m12s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 6m36s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
026e541640
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge remote-tracking branch 'origin/main' into wai/fast-statement-check
All checks were successful
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 49s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 11m47s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m52s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 10m4s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 31s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 4m12s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 10m52s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 5m53s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m41s
wai-fleet service / service · macos (pull_request) Successful in 42s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 9m47s
wai-ledger service / service · macos (pull_request) Successful in 54s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 6m49s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 6m13s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 3m15s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 16m10s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 8m7s
wai-pack / wai-pack · macos (pull_request) Successful in 2m15s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 11m42s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 22m43s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 14m55s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m42s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 13m54s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 5m17s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 12m12s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 23m28s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 11m35s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 11m3s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 41m58s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h2m13s
82e56aab72
Merge remote-tracking branch 'origin/main' into wai/fast-statement-check
All checks were successful
WAI energy receipts / energy receipts · macos (pull_request) Successful in 7m22s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 11s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 11m40s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 8m55s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 37s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 4m2s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 13m7s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 9m21s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m38s
wai-pack / wai-pack · macos (pull_request) Successful in 3m22s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 2m58s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m6s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 18m38s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 5m16s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 11m58s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 21m34s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 5m49s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 7m39s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 15m10s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 10m54s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 2m4s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 24m12s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 28s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m42s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m25s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 17m16s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m30s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 26m5s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 39m35s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h2m24s
447a8efb57
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!541
No description provided.