wai breaking and wai conform: the compatibility gate on every WAI pull request, and conformance runs with signed results #507
Merged
dcharlot
merged 11 commits from 2026-10-28 05:08:42 -04:00
wai/breaking-conform into main 2026-10-28
Merge remote-tracking branch 'origin/main' into wai/breaking-conform
All checks were successful
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 6m16s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m52s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 5m16s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 21s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m46s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 17m51s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m26s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 11m38s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 23m53s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 3m14s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m35s
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (pull_request) Successful in 39s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 7m11s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (pull_request) Successful in 1m0s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 6m59s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h2m53s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 10m16s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 27s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m8s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 21m2s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 4m55s
wai-fleet service / service · macos (pull_request) Successful in 39s
wai-ledger service / service · macos (pull_request) Successful in 51s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 19m13s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 13m40s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 10m49s
wai-pack / wai-pack · macos (pull_request) Successful in 2m54s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 3m35s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 7m5s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 15m37s
Merge remote-tracking branch 'origin/main' into wai/breaking-conform
All checks were successful
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (pull_request) Successful in 47s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m59s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (pull_request) Successful in 2m10s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m35s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 20m52s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 12m41s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m49s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 8m26s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 6m19s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 26s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 1m43s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m43s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 26m49s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m35s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m9s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 18m3s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 28s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 9m49s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m7s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 9m29s
wai-fleet service / service · macos (pull_request) Successful in 54s
wai-ledger service / service · macos (pull_request) Successful in 58s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 23m25s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 19m4s
wai-pack / wai-pack · macos (pull_request) Successful in 3m14s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 10m52s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 2m57s
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 / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h7m13s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 18m4s
# Conflicts: # .github/workflows/wai-conformance.yml # wai/CHANGELOG.md # wai/wai-rs/Cargo.toml # wai/wai-rs/src/bin/wai_cli/dx/mod.rs # wai/wai-rs/src/bin/wai_cli/dx/verify.rs # wai/wai-rs/src/lib.rs
2026-10-27
Merge remote-tracking branch 'origin/main' into wai/breaking-conform
Some checks failed
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 3m7s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 3m26s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m25s
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 2m21s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 1m3s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 31s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 2m40s
WAI conformance / faces from keypoints under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m42s
wai-key-proxy / proxy · linux (pull_request) Successful in 1m11s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 2m25s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 13m13s
wai-ledger service / service · linux (pull_request) Successful in 1m30s
wai-pack / wai-pack · linux (pull_request) Successful in 1m49s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 3m13s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 3m51s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 3m57s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 10m31s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 28m56s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 27m53s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 20m20s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 6m24s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 10m22s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 12m16s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 15m44s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m27s
wai-pack / wai-pack · macos (pull_request) Successful in 4m37s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 20m14s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 8m1s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 18m42s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Failing after 1h6m41s
wai breaking: the base holds every standard its crate reaches by path
The Rust surface extracted only wai/ from the base. Once wai depended by path on joule-ui's crates (wai-app), documenting the base failed: the dependency's directory was missing, and a crate in another workspace also needs that workspace's root manifest for the fields it inherits. Each top-level directory in the base crate's path closure is now extracted whole, once. Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai conform: no process-group kill; the sidecar test names the record corpus
All checks were successful
WAI energy receipts / energy receipts · linux (pull_request) Successful in 11m14s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 12m22s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 5m32s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m37s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 16m41s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m53s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 23s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 9m46s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m28s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m54s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m24s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 23m38s
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (pull_request) Successful in 36s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (pull_request) Successful in 59s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 6m35s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 1m30s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 8m50s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 25s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m2s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 14m55s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 4m37s
wai-ledger service / service · macos (pull_request) Successful in 50s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 16m51s
wai-pack / wai-pack · macos (pull_request) Successful in 2m47s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 59m13s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 2m42s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 11m53s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 9m54s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 6m39s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 14m50s
The runner job died with exit 137 the moment the adapter test's 200 ms timeout fired. In the CI image (Ubuntu 22.04's procps kill), `kill -KILL -<pgid>` signals the caller's own process group, not the one named: the test, cargo and the step's shell were killed, and the timed-out `sh` and `sleep` survived. Reproduced in that image with a small program; the same call with no such group also killed the caller. It was not memory: the step, built cold and run in that image under a 16 GB cap, peaks at 4.6 GB. The adapter now kills the shell alone, as before, and reads output for at most two seconds after it exits, so a child that keeps the output open no longer holds the run; the command stays in the caller's process group. tests/int_kernels_vectors.rs walks every wai/*-conformance/ directory and requires a sha256.json sidecar of decoded outputs, or an exclusion with its reason. conform-result-conformance holds signed records and no decoded output, so it is listed with that reason, as the other record corpora are. Co-Authored-By: Claude Opus 5.5 <[email protected]>
conform-result-conformance: each summary count wrong alone, its other counts right
The falsification of the reference found that leaving out the check of summary.cases alone left the corpus passing: every summary vector had passed and failed wrong too. Three vectors now carry each count wrong alone. Co-Authored-By: Claude Opus 5.5 <[email protected]>
conformance-results: conform-result/1 in the standard, its corpus and a second verifier
extensions/conformance-results.md specifies the record a conformance run signs: its members (§2) and corpus digest (§2.1), its signing input (the domain `wai:conform-result` and 0x01, then the record without `sig` in RFC 8785 form) and Ed25519 signature under SPEC §7's strict rule (§3), what a verifier checks and in what order (§4: it reads, its version, its members, its signature, its summary, its verdict) and the codes of each refusal (§5). conform-result/1 is registered as a document kind (registry export and REGISTRY.md regenerated); SPEC §7 points to it. wai-rs gains the module conform_result (feature conform_result, in quickstart): sign, check and verdict, the corpus digest, and the corpus of §7, whose outcomes are stated from the text and asserted before anything is written. `wai conform` signs with it and `wai verify` checks with it. conform-result-conformance/ holds accepted records and refused ones (a case flipped, the corpus digest changed, the summary alone changed, a bad signature, S past L, a small-order key, a summary or verdict that disagrees though signed, an unknown version, members missing, added or named twice, a fractional count, a digest out of form, bytes that are not JSON); wai_conform_result_vectors generates and verifies it, and conform_result_verify.py, written from the text and sharing no code with wai-rs, reaches every outcome and fails the corpus with each check of §4 left out. `wai conform` gains the verifier suite conform-result. `wai breaking` leaves out an explicit list of corpus files that record a measured run (the format probes' external decodes, the relay's recorded metering run), each with its reason, and says so in a note; the vectors built from them stay compared. A command `wai conform` runs is put in a process group of its own, so a timed-out command's children are stopped too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
tests/cli_conform.rs: the origin picks its own port and says which
Co-Authored-By: Claude Opus 5.5 <[email protected]>
CI: wai breaking reads the checkout as its owner and fetches main's tip into origin/main
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai breaking: a registry string reads as itself in a finding; CI builds the tools unoptimised
Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai breaking and wai conform: the compatibility gate, and conformance anyone can run
`wai breaking --against <git-ref>` (operation compat.check) reports what the working tree breaks against the merge base of a ref, in three cumulative categories: wire (the registry export, the media and delivery corpora), record (the signing domains, magics and versions in the WAI crates' sources, the record corpora, the published JSON Schemas) and API (the Rust public API of wai and wai-quantum from rustdoc's JSON, the C header, the room service's OpenAPI document). Each finding names its item, category, what changed and why it breaks; additions are compatible. A break passes only when a line the change adds to wai/CHANGELOG.md, in an entry that says Breaking, names its id. `wai conform <kind> --suite <suite> --impl <command or URL>` (operation conformance.run) runs a corpus against another implementation through a command-line or an HTTP adapter: verifiers (claim, jwp, signer), a decoder (score), a packager (policy) and an origin (http). The result is a signed conform-result/1 record that `wai verify` checks. Both follow the agent rules: the envelope/1 JSON output, the exit statuses, --dry-run. .github/workflows/wai-breaking.yml runs the gate on every pull request that touches WAI, the tests of both commands, and the corpora's independent Python verifiers and the reference packager through wai conform. Co-Authored-By: Claude Opus 5.5 <[email protected]>