wai: the route record, OER/2 minor version 1, and the operations a routed job names #542

Closed
dcharlot wants to merge 0 commits from wai/routed-jobs into main
Owner

Open WAI records for routed media jobs, first half: the route record, OER/2 minor version 1, the operations a job names, and two small reader and threading additions. A routing service that carries these today as provisional signed sidecars can fill in WAI's own records instead, and its customers check every routing decision with WAI's open tools alone.

The second half (a job unit in the receipt ledger, and the encode profile of the int_motion receipt) follows in a stacked PR. This half was complete and checked well before the ledger extension, which is the larger piece, so it can be reviewed and merged on its own.

Updated 2026-10-30: main merged through 2666f8468 (the opportunity report #541 and #545, which puts the OER/2 files under the public-text checks). Rerun after the merge: ops export --check, registry export --check, --lib catalogue (6), --lib codecs::registry (14), cli_ops under quickstart (10, with 47 bin tests), --test route_record (6), wai_oer_vectors (all pass), wai breaking --against 2666f8468 (no unacknowledged break), and the public-name and comparative-prose checks over the whole tree, the OER/2 files included (clean). wfsteps.py flags the two steps both sides edited, and each is exactly the union of the two edits.

What is in it

wai.route.record (extensions/route-record.md): the full spec-slice bar

What a router considered for one media job and why it chose.

  • Three documents, each pinned by SHA-256 over its RFC 8785 form:
    • the request (wai-route-request): an operation of the catalogue, a capability and a fallback, quantities by unit, hard limits (regions, residency, no training, zero retention, GA only, consent on file, a max price per unit, a spend ceiling), soft preferences (sort, a ttfb target, a quality floor) and a deadline;
    • the price book (wai-route-pricebook): per endpoint, its provider, capability, policy tags, unit, divisor, price, ttfb, energy per unit with its class, and quality;
    • the routing policy (wai-route-policy): name, version, the order of the four ranking keys, max attempts, excluded providers.
  • Routing (§4) is computed from those alone. It yields the candidates, their cost and energy estimates, and every hard limit that removes each, in a fixed order, each with the value it read. A value the price book does not know counts as the most restrictive, as the requirements state. It then gives the key list (targets, then the request's sort, then the policy's keys, then the endpoint), the order, the decision (the first key on which the first two survivors differ) and the allowed attempts.
  • The record (wai-route-record), signed by the router over wai:route-record\x01 ‖ JCS (strict, SPEC §7), holds:
    • the binding to the three documents;
    • every candidate as the price book stated it, with its removals and rank;
    • the order and the decision;
    • the attempts: hop, endpoint, outcome, error, times, billed, not_billed (failed or deadline_missed), and the OER/2 receipt_id of the hop.
  • Rules on the attempts. They follow the order. No attempt names a removed candidate. Only the last may serve. A failed job tried every allowed survivor. A failed hop is not billed, and neither is a hop that served past the declared deadline.
  • Hop receipts (§6). When they are given, each attempt is held to its OER/2 job receipt of oer.job.<operation>, its work.status matching the outcome. The outcome lists the hops whose receipts state the unmetered marker.
  • Reasons. 21 are added: request_invalid, pricebook_invalid, policy_invalid, record_invalid, request_mismatch, policy_mismatch, pricebook_mismatch, candidate_mismatch, removal_mismatch, rank_mismatch, decision_mismatch, attempts_exceeded, attempt_removed, attempt_out_of_order, served_not_last, times_invalid, billing_invalid, attempts_incomplete, receipt_missing, receipt_invalid, receipt_mismatch. Four are reused: malformed, unknown_version, bad_key, bad_signature.
  • Code. The wai-rs module route_record (feature route_record = ["oer"], no new dependency) provides route, seal (a router's signed record from its attempts) and verify.
  • Corpus. live-conformance/routes/vectors.json is written by wai_route_record_vectors gen.
    • It holds 16 accepted vectors: a billed first try; a failover whose failed hop is unmetered and not billed; a late hop not billed; every allowed survivor failed under max_attempts; no survivor; a ceiling in another currency; decisions by targets, sort, quality, the policy's second key and the endpoint; an unknown energy ranked last; consent on file; receipts not given.
    • Every limit of §4.3 removes a candidate, null values among them.
    • It holds 55 controls, each with one defect. The generator refuses to write a control that is refused for any reason, or at any place, other than the ones it declares.
  • Second implementation. live-conformance/route_record_verify.py is written from the text and shares no code with wai-rs. It checks the signature with claim-conformance/_ed25519.py and the hop receipts with oer-conformance/oer2_verify.py. It compares values by canonical form, so 0 is not false. Mutated copies of the corpus and checks dropped in turn are self-tests.
  • Registration. REGISTRY entry and wire identifiers (the four document kinds), the export regenerated, a SPEC §5 paragraph, a CHANGELOG entry, a CI step in wai-conformance.yml (feature lists, test list, features-alone).

OER/2 minor version 1 (extensions/oer-receipts.md §3.1)

  • A receipt whose oer is exactly "2.1" may state:
    • energy.joules_total: null, the unmetered marker. A verifier reports it as unmetered and never as a figure; every breakdown term is null, the grade is projected, there is no class and it is not a bundle.
    • energy.class ({label, relative_ppm, window_us, filtering | calibration_ref}, never HwShunt). The class must support exactly the grade (OnChipCounter/CalibratedInstrument → measured, ModelBased → derived, Estimator → projected).
  • A receipt of minor version 0 reads exactly as before. Under "2.0" a class is canonical_failure and a null figure malformed, so a verifier that knows only minor version 0 refuses rather than misreads.
  • New reasons: unmetered_invalid, class_invalid, class_grade_mismatch. A vector may declare unmetered, and it passes only when exactly those receipts are reported unmetered.
  • oer.job.<operation> is registered as the capability namespace of job receipts.
  • A third canonical fixture (literal bytes and id, plus the same input refused under "2.0").
  • oer-conformance/job_vectors.json: 38 vectors from generate_job_vectors.py, every expectation written by hand. Reference (oer2_verify.py) and wai-rs (oer) both changed; the differential fuzzer now mutates minor-1 job receipts too.

The catalogue

  • route.verify (wai route verify <document>, needs route_record, reads): prints the §7.3 outcome and exits 1 on a refusal.
  • package.build and package.verify (wai package build|verify): run the reference packager wai-pack as itself (--packer, $WAI_PACK_BIN, beside wai, PATH), with its inputs (policy, a source per component, supplied floor, key, meter) as the input schema and its package receipt as the receipt. --dry-run names the directory and runs nothing.
  • wai/catalogue/ops.json and Studio's actions.generated.js are regenerated.

Small ones

  • VideoReceipt::from_json, the inverse of to_json. It reads strictly, takes exactly the members to_json writes for the class, reads the class through energy_class::label_from_json, holds the derived uj_per_kilopixel_op (its spelling) and receipt_hash to the receipt, and returns ReadError. to_json now escapes the signer id; output is unchanged for any id that needs no escape, and the pinned renderings are unchanged.
  • wai-pack's meter slot is Send: PackOpts::meter: Option<Box<dyn Meter + Send>>, and the meters' read and clock closures are bounded + Send.

Design decisions (and why)

  • JSON documents, not a new binary magic. The route record carries tokens, capability strings and lists. RFC 8785 over WAI's integer subset (wai::jcs) gives one canonical form both implementations reproduce.
  • The record restates every candidate, flat, so a reader sees every price and tag the decision rests on. The verifier refuses any restatement that is not the price book's (candidate_mismatch).
  • Removals are {limit, value}, not free-text reasons, so they recompute exactly in both implementations; null marks an unknown value.
  • explanation (free text) left out of the record. An unchecked sentence in a signed record would be a claim no verifier holds; the decision states the key that decided.
  • The deadline is a request field, restated in the record as an instant, and billing follows from it. The ledger half will read billed hops from the record.
  • Document kinds are hyphenated (wai-route-*). SPEC's registry test requires every backticked wai.* string to be registered, and the unregistered-labels table is pinned to the quantum labels, so a dotted kind would read as an unregistered capability. The record stays registered as wai.route.record.
  • OER additions are gated on the minor version ("2.1") rather than admitted in 2.0, so no existing receipt or vector changes its verdict.
  • The package operations run wai-pack rather than reimplement packing in wai: wai-rs cannot depend on wai-pack (the dependency runs the other way), and running the reference packer keeps the package byte-identical.

Checks

check command result host
route record lib tests cargo test --locked --no-default-features --features route_record --lib route_record:: 5 passed Framework
route record tests cargo test --locked --no-default-features --features route_record --test route_record 6 passed Framework
corpus regenerates + outcomes wai_route_record_vectors verify ../live-conformance/routes PASS, PASS Framework
second implementation python3 -I live-conformance/route_record_verify.py live-conformance/routes every vector; 21+4 reasons; 341 mutated copies fail; 34 dropped checks caught local (needs cryptography)
differential, 3000 mutated documents (half re-signed) wai route verify vs route_record_verify.verify 0 diverged (26 distinct outcomes) Framework + local
OER lib tests cargo test --locked --no-default-features --features oer --lib oer:: 17 passed Framework
OER corpus (all files, fixtures, unreadable) wai_oer_vectors verify ../oer-conformance all pass (incl. job_vectors.json, 38) Framework
OER reference python3 oer2_verify.py {vectors,firmware_vectors,edge_vectors,job_vectors}.json, --unreadable all pass; generators reproduce all three files byte for byte local
OER differential fuzz fuzz_differential.py --seed 1/2 --cases 20000 (split: texts local, wai_oer_diff remote) 0 diverged, 0 crashed, both seeds local + Framework
claim verifier (imports OER reference) claim_verify.py vectors / consumption / bearer 636 / 27 / 72, 0 failures local
video receipt cargo test --locked --no-default-features --features video_receipt --test video_receipt --lib video_receipt 14 + 1 passed Framework
meters cargo test --locked --no-default-features --features energy_meter --lib energy_meter 20 passed Framework
wai-pack cargo test --release --locked --test packs --test refusals --test fabric; clippy --all-targets -D warnings pass; exit 0 Framework
wai-pack, macOS fabric meter cargo clippy --locked --all-targets --features fabric-meter -D warnings; worker-thread test exit 0; pass Studio
package doors end to end wai package build (dry run writes nothing; real run = golden video-base-01 byte for byte), wai package verify (0; edited receipt → 1) pass Framework
catalogue + CLI --lib catalogue; cli_ops under quickstart, quickstart,generate,score,staged,video_int,audio_int,splat_int, quickstart,app; ops export --check 6; 10/10/10 (+47 bin tests); up to date Framework
registry --lib codecs::registry; registry export --check 14 passed; up to date Framework
CI feature list --features "$WAI_FEATURES" (incl. revenue_share, route_record): route_record lib+test, fleet, receipt_ledger pass Framework
features alone cargo check --features X --tests for route_record, video_receipt, energy_meter, oer no note in a touched file Framework
clippy --all-targets, features route_record,video_receipt,energy_meter,quickstart no new note (two collapsible_if in oer.rs predate this branch) Framework
header rebuild with src/ffi.rs touched include/wai.h unchanged Framework
wai breaking --against 7473e6d7e no unacknowledged break (three energy_meter constructors acknowledged: their closures are Send) Framework
Studio actions node scripts/actions.mjs --check holds local
repo checks check-tests-in-ci, workflow-concurrency, spec-refs, wai-section-refs, vanity, public-text self-test, comparative-prose, orphan-sources, wai-ops-doors all 0 local
workflows ruby -ryaml all; wfsteps.py HEAD 06523c0c1 7473e6d7e parse; 2 findings, both steps edited on both sides, each differing from each side by exactly the other side's added token (a union, not a cross-wire) local
public names check-public-names.sh on changed files; messages and this body against the patterns clean local

Falsifications (committed first, each restored)

  • Route record, wai-rs (each mutant, wai_route_record_vectors verify, exit 1):
    • an attempt may name a removed candidate (4 fails);
    • an unknown training policy admitted (41);
    • billing not checked (5);
    • a late hop billed (4);
    • a served hop may be followed (3);
    • a job may give up early (4);
    • receipt status not checked (3);
    • the max_attempts bound ignored (4);
    • the policy's exclude ignored (46);
    • quality ranked low first (4);
    • the policy key order ignored (3);
    • a null ranked first (3);
    • targets ignored (3).
  • Two gaps the falsification found. Before two vectors were added, reversing the quality order and ignoring the policy's key order both passed the corpus. Both are now caught.
  • Route record, Python. 34 checks each dropped are caught by the corpus, and 341 mutated copies all fail.
  • OER, wai-rs (wai_oer_vectors, exit 1):
    • drop class_grade_mismatch (4 fails);
    • drop unmetered_invalid (4);
    • drop class_invalid (14);
    • class members unlisted (19);
    • extra class members admitted (1);
    • is_unmetered always false (8).
  • OER unmetered declaration. Dropping the comparison is not visible to the corpus (every declaration matches); the unit test that alters a declaration fails on it (exit 101).
  • OER, Python (same mutants): 4 / 4 / 14 / 19 / 8 fails. The harness comparison is the same corpus-invisible case.

Not in this PR

  • A job unit in the receipt ledger, and the int_motion encode receipt profile (next PR, stacked).
  • jwp-receipts §2.4.5's energy claim is not yet held to a minor-1 receipt's energy.class.
  • A router's own service (accounts, prices, routing across third parties) is out of WAI's scope.

For the lead / owner

  • The OER/2 files are the ones the public-text scripts call settled and skip (check-public-names.sh and check-comparative-prose.sh: "which no change may edit"). Nothing enforces that, and recent commits edited them; minor version 1 is additive and gated so no existing receipt reads differently. Confirm that this ingest may grow.
  • The route record's hard limits and ranking keys are a closed set in this revision. Adding a limit or key is a new record version.
  • package.build's CLI test sample passes this binary as --packer (writes: false). The real pack through the door runs in wai-pack.yml's new step.

🤖 Generated with Claude Code


Closed: merged into main through #544, which was stacked on it: main 20f9d95c01 contains this PR's head 920a037c6a. Every check was green on #544's head (91 passed, 6 skipped).

Open WAI records for routed media jobs, first half: the route record, OER/2 minor version 1, the operations a job names, and two small reader and threading additions. A routing service that carries these today as provisional signed sidecars can fill in WAI's own records instead, and its customers check every routing decision with WAI's open tools alone. The second half (a job unit in the receipt ledger, and the encode profile of the `int_motion` receipt) follows in a stacked PR. This half was complete and checked well before the ledger extension, which is the larger piece, so it can be reviewed and merged on its own. **Updated 2026-10-30:** main merged through `2666f8468` (the opportunity report #541 and #545, which puts the OER/2 files under the public-text checks). Rerun after the merge: `ops export --check`, `registry export --check`, `--lib catalogue` (6), `--lib codecs::registry` (14), `cli_ops` under `quickstart` (10, with 47 bin tests), `--test route_record` (6), `wai_oer_vectors` (all pass), `wai breaking --against 2666f8468` (no unacknowledged break), and the public-name and comparative-prose checks over the whole tree, the OER/2 files included (clean). `wfsteps.py` flags the two steps both sides edited, and each is exactly the union of the two edits. ## What is in it ### `wai.route.record` (extensions/route-record.md): the full spec-slice bar What a router considered for one media job and why it chose. - **Three documents, each pinned by SHA-256 over its RFC 8785 form**: - the **request** (`wai-route-request`): an operation of the catalogue, a capability and a fallback, quantities by unit, hard limits (regions, residency, no training, zero retention, GA only, consent on file, a max price per unit, a spend ceiling), soft preferences (sort, a ttfb target, a quality floor) and a deadline; - the **price book** (`wai-route-pricebook`): per endpoint, its provider, capability, policy tags, unit, divisor, price, ttfb, energy per unit with its class, and quality; - the **routing policy** (`wai-route-policy`): name, version, the order of the four ranking keys, max attempts, excluded providers. - **Routing (§4) is computed from those alone.** It yields the candidates, their cost and energy estimates, and every hard limit that removes each, in a fixed order, each with the value it read. A value the price book does not know counts as the most restrictive, as the requirements state. It then gives the key list (targets, then the request's sort, then the policy's keys, then the endpoint), the order, the decision (the first key on which the first two survivors differ) and the allowed attempts. - **The record (`wai-route-record`)**, signed by the router over `wai:route-record\x01` ‖ JCS (strict, SPEC §7), holds: - the binding to the three documents; - every candidate as the price book stated it, with its removals and rank; - the order and the decision; - the attempts: hop, endpoint, outcome, error, times, `billed`, `not_billed` (`failed` or `deadline_missed`), and the OER/2 `receipt_id` of the hop. - **Rules on the attempts.** They follow the order. No attempt names a removed candidate. Only the last may serve. A failed job tried every allowed survivor. A failed hop is not billed, and neither is a hop that served past the declared deadline. - **Hop receipts (§6).** When they are given, each attempt is held to its OER/2 `job` receipt of `oer.job.<operation>`, its `work.status` matching the outcome. The outcome lists the hops whose receipts state the unmetered marker. - **Reasons.** 21 are added: `request_invalid`, `pricebook_invalid`, `policy_invalid`, `record_invalid`, `request_mismatch`, `policy_mismatch`, `pricebook_mismatch`, `candidate_mismatch`, `removal_mismatch`, `rank_mismatch`, `decision_mismatch`, `attempts_exceeded`, `attempt_removed`, `attempt_out_of_order`, `served_not_last`, `times_invalid`, `billing_invalid`, `attempts_incomplete`, `receipt_missing`, `receipt_invalid`, `receipt_mismatch`. Four are reused: `malformed`, `unknown_version`, `bad_key`, `bad_signature`. - **Code.** The `wai-rs` module `route_record` (feature `route_record` = `["oer"]`, no new dependency) provides `route`, `seal` (a router's signed record from its attempts) and `verify`. - **Corpus.** `live-conformance/routes/vectors.json` is written by `wai_route_record_vectors gen`. - It holds 16 accepted vectors: a billed first try; a failover whose failed hop is unmetered and not billed; a late hop not billed; every allowed survivor failed under `max_attempts`; no survivor; a ceiling in another currency; decisions by targets, sort, quality, the policy's second key and the endpoint; an unknown energy ranked last; consent on file; receipts not given. - Every limit of §4.3 removes a candidate, `null` values among them. - It holds 55 controls, each with one defect. The generator refuses to write a control that is refused for any reason, or at any place, other than the ones it declares. - **Second implementation.** `live-conformance/route_record_verify.py` is written from the text and shares no code with wai-rs. It checks the signature with `claim-conformance/_ed25519.py` and the hop receipts with `oer-conformance/oer2_verify.py`. It compares values by canonical form, so `0` is not `false`. Mutated copies of the corpus and checks dropped in turn are self-tests. - **Registration.** REGISTRY entry and wire identifiers (the four document kinds), the export regenerated, a SPEC §5 paragraph, a CHANGELOG entry, a CI step in `wai-conformance.yml` (feature lists, test list, features-alone). ### OER/2 minor version 1 (extensions/oer-receipts.md §3.1) - A receipt whose `oer` is exactly `"2.1"` may state: - `energy.joules_total: null`, the **unmetered marker**. A verifier reports it as unmetered and never as a figure; every breakdown term is null, the grade is `projected`, there is no class and it is not a bundle. - `energy.class` (`{label, relative_ppm, window_us, filtering | calibration_ref}`, never `HwShunt`). The class must support exactly the grade (`OnChipCounter`/`CalibratedInstrument` → `measured`, `ModelBased` → `derived`, `Estimator` → `projected`). - A receipt of minor version 0 reads exactly as before. Under `"2.0"` a class is `canonical_failure` and a null figure `malformed`, so a verifier that knows only minor version 0 refuses rather than misreads. - New reasons: `unmetered_invalid`, `class_invalid`, `class_grade_mismatch`. A vector may declare `unmetered`, and it passes only when exactly those receipts are reported unmetered. - `oer.job.<operation>` is registered as the capability namespace of `job` receipts. - A third canonical fixture (literal bytes and id, plus the same input refused under `"2.0"`). - `oer-conformance/job_vectors.json`: 38 vectors from `generate_job_vectors.py`, every expectation written by hand. Reference (`oer2_verify.py`) and wai-rs (`oer`) both changed; the differential fuzzer now mutates minor-1 job receipts too. ### The catalogue - `route.verify` (`wai route verify <document>`, needs `route_record`, reads): prints the §7.3 outcome and exits 1 on a refusal. - `package.build` and `package.verify` (`wai package build|verify`): run the reference packager `wai-pack` as itself (`--packer`, `$WAI_PACK_BIN`, beside `wai`, `PATH`), with its inputs (policy, a source per component, supplied floor, key, meter) as the input schema and its package receipt as the receipt. `--dry-run` names the directory and runs nothing. - `wai/catalogue/ops.json` and Studio's `actions.generated.js` are regenerated. ### Small ones - `VideoReceipt::from_json`, the inverse of `to_json`. It reads strictly, takes exactly the members `to_json` writes for the class, reads the class through `energy_class::label_from_json`, holds the derived `uj_per_kilopixel_op` (its spelling) and `receipt_hash` to the receipt, and returns `ReadError`. `to_json` now escapes the signer id; output is unchanged for any id that needs no escape, and the pinned renderings are unchanged. - `wai-pack`'s meter slot is `Send`: `PackOpts::meter: Option<Box<dyn Meter + Send>>`, and the meters' read and clock closures are bounded `+ Send`. ## Design decisions (and why) - **JSON documents, not a new binary magic.** The route record carries tokens, capability strings and lists. RFC 8785 over WAI's integer subset (`wai::jcs`) gives one canonical form both implementations reproduce. - **The record restates every candidate, flat**, so a reader sees every price and tag the decision rests on. The verifier refuses any restatement that is not the price book's (`candidate_mismatch`). - **Removals are `{limit, value}`, not free-text reasons**, so they recompute exactly in both implementations; `null` marks an unknown value. - **`explanation` (free text) left out of the record.** An unchecked sentence in a signed record would be a claim no verifier holds; the decision states the key that decided. - **The deadline is a request field**, restated in the record as an instant, and billing follows from it. The ledger half will read billed hops from the record. - **Document kinds are hyphenated** (`wai-route-*`). SPEC's registry test requires every backticked `wai.*` string to be registered, and the unregistered-labels table is pinned to the quantum labels, so a dotted kind would read as an unregistered capability. The record stays registered as `wai.route.record`. - **OER additions are gated on the minor version (`"2.1"`)** rather than admitted in `2.0`, so no existing receipt or vector changes its verdict. - **The package operations run `wai-pack`** rather than reimplement packing in `wai`: wai-rs cannot depend on wai-pack (the dependency runs the other way), and running the reference packer keeps the package byte-identical. ## Checks | check | command | result | host | |---|---|---|---| | route record lib tests | `cargo test --locked --no-default-features --features route_record --lib route_record::` | 5 passed | Framework | | route record tests | `cargo test --locked --no-default-features --features route_record --test route_record` | 6 passed | Framework | | corpus regenerates + outcomes | `wai_route_record_vectors verify ../live-conformance/routes` | PASS, PASS | Framework | | second implementation | `python3 -I live-conformance/route_record_verify.py live-conformance/routes` | every vector; 21+4 reasons; 341 mutated copies fail; 34 dropped checks caught | local (needs `cryptography`) | | differential, 3000 mutated documents (half re-signed) | `wai route verify` vs `route_record_verify.verify` | 0 diverged (26 distinct outcomes) | Framework + local | | OER lib tests | `cargo test --locked --no-default-features --features oer --lib oer::` | 17 passed | Framework | | OER corpus (all files, fixtures, unreadable) | `wai_oer_vectors verify ../oer-conformance` | all pass (incl. job_vectors.json, 38) | Framework | | OER reference | `python3 oer2_verify.py {vectors,firmware_vectors,edge_vectors,job_vectors}.json`, `--unreadable` | all pass; generators reproduce all three files byte for byte | local | | OER differential fuzz | `fuzz_differential.py --seed 1/2 --cases 20000` (split: texts local, `wai_oer_diff` remote) | 0 diverged, 0 crashed, both seeds | local + Framework | | claim verifier (imports OER reference) | `claim_verify.py` vectors / consumption / bearer | 636 / 27 / 72, 0 failures | local | | video receipt | `cargo test --locked --no-default-features --features video_receipt --test video_receipt --lib video_receipt` | 14 + 1 passed | Framework | | meters | `cargo test --locked --no-default-features --features energy_meter --lib energy_meter` | 20 passed | Framework | | wai-pack | `cargo test --release --locked --test packs --test refusals --test fabric`; clippy `--all-targets -D warnings` | pass; exit 0 | Framework | | wai-pack, macOS fabric meter | `cargo clippy --locked --all-targets --features fabric-meter -D warnings`; worker-thread test | exit 0; pass | Studio | | package doors end to end | `wai package build` (dry run writes nothing; real run = golden `video-base-01` byte for byte), `wai package verify` (0; edited receipt → 1) | pass | Framework | | catalogue + CLI | `--lib catalogue`; `cli_ops` under `quickstart`, `quickstart,generate,score,staged,video_int,audio_int,splat_int`, `quickstart,app`; `ops export --check` | 6; 10/10/10 (+47 bin tests); up to date | Framework | | registry | `--lib codecs::registry`; `registry export --check` | 14 passed; up to date | Framework | | CI feature list | `--features "$WAI_FEATURES"` (incl. revenue_share, route_record): route_record lib+test, fleet, receipt_ledger | pass | Framework | | features alone | `cargo check --features X --tests` for route_record, video_receipt, energy_meter, oer | no note in a touched file | Framework | | clippy | `--all-targets`, features route_record,video_receipt,energy_meter,quickstart | no new note (two `collapsible_if` in `oer.rs` predate this branch) | Framework | | header | rebuild with `src/ffi.rs` touched | `include/wai.h` unchanged | Framework | | `wai breaking --against 7473e6d7e` | | no unacknowledged break (three `energy_meter` constructors acknowledged: their closures are `Send`) | Framework | | Studio actions | `node scripts/actions.mjs --check` | holds | local | | repo checks | check-tests-in-ci, workflow-concurrency, spec-refs, wai-section-refs, vanity, public-text self-test, comparative-prose, orphan-sources, wai-ops-doors | all 0 | local | | workflows | `ruby -ryaml` all; `wfsteps.py HEAD 06523c0c1 7473e6d7e` | parse; 2 findings, both steps edited on both sides, each differing from each side by exactly the other side's added token (a union, not a cross-wire) | local | | public names | `check-public-names.sh` on changed files; messages and this body against the patterns | clean | local | ## Falsifications (committed first, each restored) - **Route record, wai-rs** (each mutant, `wai_route_record_vectors verify`, exit 1): - an attempt may name a removed candidate (4 fails); - an unknown training policy admitted (41); - billing not checked (5); - a late hop billed (4); - a served hop may be followed (3); - a job may give up early (4); - receipt status not checked (3); - the `max_attempts` bound ignored (4); - the policy's `exclude` ignored (46); - quality ranked low first (4); - the policy key order ignored (3); - a null ranked first (3); - targets ignored (3). - **Two gaps the falsification found.** Before two vectors were added, reversing the quality order and ignoring the policy's key order both passed the corpus. Both are now caught. - **Route record, Python.** 34 checks each dropped are caught by the corpus, and 341 mutated copies all fail. - **OER, wai-rs** (`wai_oer_vectors`, exit 1): - drop `class_grade_mismatch` (4 fails); - drop `unmetered_invalid` (4); - drop `class_invalid` (14); - class members unlisted (19); - extra class members admitted (1); - `is_unmetered` always false (8). - **OER unmetered declaration.** Dropping the comparison is not visible to the corpus (every declaration matches); the unit test that alters a declaration fails on it (exit 101). - **OER, Python** (same mutants): 4 / 4 / 14 / 19 / 8 fails. The harness comparison is the same corpus-invisible case. ## Not in this PR - A job unit in the receipt ledger, and the `int_motion` encode receipt profile (next PR, stacked). - `jwp-receipts` §2.4.5's `energy` claim is not yet held to a minor-1 receipt's `energy.class`. - A router's own service (accounts, prices, routing across third parties) is out of WAI's scope. ## For the lead / owner - The OER/2 files are the ones the public-text scripts call settled and skip (`check-public-names.sh` and `check-comparative-prose.sh`: "which no change may edit"). Nothing enforces that, and recent commits edited them; minor version 1 is additive and gated so no existing receipt reads differently. Confirm that this ingest may grow. - The route record's hard limits and ranking keys are a closed set in this revision. Adding a limit or key is a new record version. - `package.build`'s CLI test sample passes this binary as `--packer` (`writes: false`). The real pack through the door runs in `wai-pack.yml`'s new step. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- **Closed:** merged into main through #544, which was stacked on it: main 20f9d95c015f281546cfc7dd139473ea6fc2581f contains this PR's head 920a037c6af265cf55e3bc1c5f621f68fd0e1d1d. Every check was green on #544's head (91 passed, 6 skipped).
A receipt whose oer is exactly "2.1" may state a null energy.joules_total, the
unmetered marker, reported as unmetered and never as a figure, and energy.class,
the figure's acquisition class with its evidence, held to the grade it supports.
Minor version 0 keeps its members, so no 2.0 receipt reads differently. Three
reasons (unmetered_invalid, class_invalid, class_grade_mismatch), the oer.job.*
namespace for job receipts, a third canonical fixture, job_vectors.json written by
hand-declared generate_job_vectors.py, and the differential fuzzer over both forms.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
A holder of a wai.video.int_motion receipt's JSON reads it back with WAI's own
code and runs verify and verify_reconstruction_wiv1 on it. The text is read
strictly, holds exactly the members to_json writes for the receipt's class, the
class read by energy_class::label_from_json, and the two derived members
(uj_per_kilopixel_op, receipt_hash) held to the receipt. to_json now writes the
signer id as an escaped JSON string, which changes nothing for an id that needs
no escape (the pinned renderings are unchanged).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The meters of wai::energy_meter hold Send closures (their read and clock are
bounded + Send), and PackOpts::meter is Option<Box<dyn Meter + Send>>, so a host
that runs a pack on a worker thread hands the packer its meter and the package
receipt states the figure. Tests: a span sampled on a worker thread, and a
metered pack on a worker thread that writes the package this thread writes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The request, the price book and the routing policy are documents pinned by
digest; from them alone the candidates, every hard limit that removes one (an
unknown value counted as the most restrictive), the ranking under the policy's
keys and the request's preferences, the order and the decision are computed,
and a verifier recomputes them. The attempts follow the order, only the last
serves, a failed hop or one past the declared deadline is not billed, and each
is held to its hop's OER/2 job receipt of the record's operation. Extension
text, the route_record module (seal, verify), the corpus written by
wai_route_record_vectors with each control refused at its declared reason and
place, and tests/route_record.rs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
route_record_verify.py, written from the extension's text, verifies the router's
signature with WAI's strict Ed25519 rule and the hop receipts with the OER/2
reference verifier, recomputes every candidate, removal, rank, order, decision
and attempt, gives every vector its outcome, requires every mutated copy of the
corpus to fail and catches each of its own checks dropped. The document kinds
are wai-route-request, -pricebook, -policy and -record, registered as wire
identifiers; wai.route.record is a registered record (SPEC §5, the export
regenerated). CI runs the module's tests, tests/route_record.rs and the
verifier, and checks the feature alone.

The catalogue gains route.verify (wai route verify) and package.build and
package.verify (wai package build|verify), which run the reference packager
wai-pack as itself; wai-pack.yml packs the golden package through the door and
verifies it, and a copy with an edited receipt is refused. CHANGELOG entry,
with the meters' Send bound acknowledged as an API break.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
A sort by quality, and a price tie the policy's second key (quality) decides
against the time to first byte: a verifier that ranked quality low first, or
ignored the policy's order of its keys, passed the corpus before.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The reader now compiles for the int_motion receipt's from_json too, which reads
neither; the attribute keeps that build free of a dead-code note.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge origin/main into wai/routed-jobs
All checks were successful
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m13s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 18m38s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 12m28s
wai-fleet service / service · macos (pull_request) Successful in 34s
wai-ledger service / service · macos (pull_request) Successful in 41s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m54s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 11m50s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 16m49s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 11m51s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 6s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 7m9s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 11m23s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 8m42s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 23m23s
wai-pack / wai-pack · macos (pull_request) Successful in 4m45s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m57s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m23s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 26s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m55s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 8m0s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m25s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 13m19s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m0s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m40s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 6m59s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 6m56s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 17m9s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 7m17s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 11m30s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h2m44s
686adad33e
The revenue share (#539) beside the route record: both features, both records,
both catalogue features and both SPEC paragraphs; the CHANGELOG with this
branch's entry on top. Studio's generated actions regenerated from the merged
catalogue export.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge origin/main into wai/routed-jobs
All checks were successful
wai-ledger service / service · macos (pull_request) Successful in 47s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 7m54s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 6m36s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 11m42s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 15m42s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 5m31s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 6s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 14m44s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 12m27s
wai-pack / wai-pack · macos (pull_request) Successful in 3m36s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 18m14s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 11m17s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m41s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m27s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 3m4s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 10m11s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 7m59s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m52s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 20s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 16m21s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m19s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 12m55s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m30s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 22m50s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 7m48s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 21m55s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m22s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 7m13s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 11m31s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h1m39s
bc500a9eb9
The opportunity report (#541) beside the route record: both features, records
and SPEC paragraphs, the CHANGELOG with this branch's entry on top; Studio's
generated actions regenerated from the merged catalogue. The OER/2 files are
now under the public-text checks (#545).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge origin/main into wai/routed-jobs
All checks were successful
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 1m54s
wai-fleet service / service · macos (pull_request) Successful in 47s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 6m11s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 7m58s
wai-ledger service / service · macos (pull_request) Successful in 1m5s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m43s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 13m10s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 18m27s
wai-pack / wai-pack · macos (pull_request) Successful in 3m58s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m39s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m45s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 15m20s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 8m10s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 14m49s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m19s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 7s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 11m24s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 6m5s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m33s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m28s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 8m11s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 24s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 25m16s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 7m8s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m57s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m27s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 3m8s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 9m3s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 35m1s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 21m57s
920a037c6a
Takes #540's channel lineup beside the route record: the conformance
workflow's feature list, test list and per-feature check name both
(channel_lineup, route_record); the catalogue keeps channel.import,
channel.guide, channel.verify and route.verify; strict_json is built
for video_receipt or channel_lineup. ops.json and Studio's actions are
regenerated from the merged table; the registry export is up to date.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
dcharlot closed this pull request 2026-10-30 05:30:45 -04:00
Some checks failed
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Successful in 22s
wai-app and Create / wai-app · does this change touch it (pull_request) Successful in 9s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 7s
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Successful in 15s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (pull_request) Successful in 28s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (pull_request) Successful in 30s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (pull_request) Successful in 51s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 2m48s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 7s
wai-audit collector and player integration / does this change touch it (pull_request) Successful in 7s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 7s
WAI operation catalogue / does this change touch it (pull_request) Successful in 6s
WAI conformance / does this change touch it (pull_request) Successful in 7s
WAI energy receipts / does this change touch it (pull_request) Successful in 6s
WAI examples / WAI examples · does this change touch them (pull_request) Successful in 7s
wai-fleet service / does this change touch it (pull_request) Successful in 7s
WAI HTTP delivery / WAI HTTP · does this change touch it (pull_request) Successful in 7s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Has been skipped
wai-key-proxy / does this change touch it (pull_request) Successful in 7s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Has been skipped
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m42s
wai-ledger service / does this change touch it (pull_request) Successful in 6s
wai-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Successful in 6s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 6s
wai-quantum docs, course and locales / does this change touch it (pull_request) Successful in 6s
wai-quantum for JavaScript / does this change touch it (pull_request) Successful in 6s
wai-quantum studio and desktop / does this change touch it (pull_request) Successful in 6s
wai-sink-android native sink library / does this change touch it (pull_request) Successful in 6s
wai-sink-swift native sink package / does this change touch it (pull_request) Successful in 6s
WAI Studio / does this change touch it (pull_request) Successful in 6s
wai-web wasm32 / does this change touch it (pull_request) Successful in 6s
wai-audit collector and player integration / collector · linux (pull_request) Successful in 1m13s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Successful in 1m31s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 6m37s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (pull_request) Successful in 1m37s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (pull_request) Successful in 2m50s
WAI conformance / fast integer kernels, every x86_64 kernel set (AVX-512 silicon) (pull_request) Successful in 3m4s
WAI conformance / faces from keypoints under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m44s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 1m19s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 8m20s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 3m14s
joule-moq-room room service / joule-moq-room, every target (pull_request) Successful in 3m56s
wai-key-proxy / proxy · linux (pull_request) Successful in 1m9s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 20s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 12m32s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 1m38s
wai-ledger service / service · linux (pull_request) Successful in 4m17s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 3m50s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 55s
wai-fleet service / service · linux (pull_request) Successful in 6m15s
wai-pack / wai-pack · linux (pull_request) Successful in 1m50s
wai-quantum docs, course and locales / the Studio's words in every locale · linux (pull_request) Successful in 22s
WAI operation catalogue / the catalogue and every door · linux (pull_request) Successful in 10m53s
wai-quantum docs, course and locales / the course and the command line's languages · linux (pull_request) Successful in 2m6s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 2m5s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 2m53s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 10m3s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 2m20s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 9m15s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 11m18s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Failing after 7m20s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 17s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 33s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 1m54s
wai-fleet service / service · macos (pull_request) Successful in 47s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 6m11s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 7m58s
wai-ledger service / service · macos (pull_request) Successful in 1m5s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m43s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 13m10s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 18m27s
wai-pack / wai-pack · macos (pull_request) Successful in 3m58s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m39s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m45s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 15m20s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 8m10s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 14m49s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m19s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 7s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 11m24s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 6m5s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m33s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m28s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 8m11s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 24s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 25m16s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 7m8s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m57s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m27s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 3m8s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 9m3s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 35m1s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 21m57s

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!542
No description provided.