route-record: a third party's hop has a signed record of what was sent, what came back, and what the provider bills #572
Merged
dcharlot
merged 3 commits from 2026-11-02 11:04:26 -05:00
wai/third-party-hop into main 2026-11-02
CHANGELOG: Reason::ALL's length is acknowledged as breaking
All checks were successful
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 16m11s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 1m47s
wai-quantum studio and desktop / desktop app · linux (pull_request) Successful in 5m26s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 7m50s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 15m6s
wai-pack / wai-pack · macos (pull_request) Successful in 6m39s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 13m19s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 7m57s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m32s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 5m20s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 18m12s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 12m31s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 7m54s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 19m27s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 24m48s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 1m19s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 14m57s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 30m0s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 18m39s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 1m51s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 1m3s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 3m4s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 10m32s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 15m17s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 2m34s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 1m22s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m47s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 3m18s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 8m25s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h18m30s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
route-record §6.2: every form and bound of the third-party hop record has its control
The Rust mutations showed a usage's quantity of the wrong type went uncaught, and the same held of other forms and bounds the text states. Each now has a control, at its first value past the limit, so the two implementations are held to the same limits. A clause `unhex` already made redundant is gone. The document kind is in the registry. The Python verifier stops a mutated copy at its first failure: it only asks whether one fails. routes corpus: 236 vectors. route_record_verify.py: 103 checks, 1,119 mutated copies. Co-Authored-By: Claude Opus 5.5 <[email protected]>
route-record §6.2: a third party's hop has a signed record of what was sent, what came back, and what the provider bills
A hop sent to a third party's endpoint is work the router did not do. Its OER/2 receipt says the hop served or failed; nothing WAI defines says what was sent, to whom, what came back, or what the provider bills, so an implementation carries that in a record of its own that WAI's verifier cannot read. `wai-route-third-party-hop`, signed by the router and named by its digest: the provider and its API origin, whose account the hop ran on (never the key), the provider's id for the work, each exchange (method, URL without its query, times, status, the bodies by SHA-256 and length, the response where it was JSON, with links' queries removed), the outputs by name and content hash, the usage the provider bills, in the endpoint's unit, and what it reported charging, in its own terms. A verification document may carry the records beside its receipts (§7.2 step 9). Each is held to the route record's signer and job, to its attempt and that attempt's candidate, and when it served, its outputs to what the hop's receipt names and the attempt's count. No route record changes, since the record names the receipt the route record already names. routes corpus: 126 -> 202 vectors, from fixed seeds, every control refused at its own place. route_record_verify.py verifies each from the text, shares no code with wai-rs, and catches each of its 85 checks dropped and all 1,051 mutated copies. Co-Authored-By: Claude Opus 5.5 <[email protected]>