open-standards/wai/wai-web/reach/test/vectors/provenance
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science ee44f1871c
Some checks failed
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 3s
no-vanity-metrics / WAI public text names no comparison (pull_request) Successful in 4s
no-vanity-metrics / WAI public text names no company or product (pull_request) Successful in 3s
standards workspaces build + test / arl-rs (pull_request) Successful in 1m16s
standards workspaces build + test / eoc-rs (pull_request) Successful in 2m9s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m32s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 1m11s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 1m13s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m16s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m13s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m21s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 4m6s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 17s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 7m25s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 8s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 25s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 46s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 1m53s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 4s
WAI section references / cited sections exist (pull_request) Successful in 10s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m30s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 14m56s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 5s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 2m48s
wai-pack / wai-pack · linux (pull_request) Successful in 1m6s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 23s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 2m4s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m23s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m44s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m1s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 4m36s
standards workspaces build + test / aac-rs (pull_request) Successful in 1m48s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 47s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 30s
standards workspaces build + test / map-rs (pull_request) Successful in 29s
standards workspaces build + test / mesh-rs (pull_request) Successful in 28s
standards workspaces build + test / openpay (pull_request) Successful in 1m30s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 5m46s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 24s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 1m54s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m6s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 2m52s
standards workspaces build + test / macOS energy backends (pull_request) Failing after 4m59s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 10m6s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 29s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m14s
wai-pack / wai-pack · macos (pull_request) Successful in 2m12s
wai-web reach: the provenance vector's signer id is a label
The reach receipt workloads verified a receipt copied from the site, written by
wai_prov before its signer id became a label: it named a domain under did:web,
which signer_ids_are_labels refuses (jwp-receipts §7.1, §7.8).

wai_prov gains --carry <receipt.json>: it measures nothing, carries each
step's figure and label from an earlier receipt for the same lineage, and signs
them with its published test seed (0x70 x 32) under its label
did:example:wai-prov. It refuses a receipt that does not verify or whose steps
are not this run's (operations, input and output hashes, work), and writes no
report. The vector is regenerated with it: the envelope is unchanged, the
figures are the ones wai_prov first measured for these bytes, and carrying the
receipt onto itself writes both files again byte for byte. The vector's README
states how it is made and the command.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 04:27:29 -04:00
..
captured.jpeg.wai wai-web: reach builds — L1 legalised, L2 MVP-lowered, J wasm2js, and an ES5 loader 2026-10-09 18:36:04 -04:00
captured.receipt.json wai-web reach: the provenance vector's signer id is a label 2026-10-10 04:27:29 -04:00
README.md wai-web reach: the provenance vector's signer id is a label 2026-10-10 04:27:29 -04:00

A provenance vector for the reach conformance runs

captured.jpeg.wai is a wai.image.jpeg envelope and captured.receipt.json its signed asset-provenance receipt (wai::provenance::AssetReceipt): three steps (origin.synthesize, encode.png, encode.jpeg), a Merkle root over them, the total joules, and an Ed25519 signature. Its pixels are a synthesized pattern (rings and a gradient), not a photograph.

Provenance. Both files are written by wai_prov (wai-rs/src/bin/wai_prov.rs), which synthesizes the pixels, encodes them to PNG and then to JPEG, wraps the JPEG and signs the lineage. The key is the tool's published test seed, the byte 0x70 repeated 32 times (public key 19204c8c…ef067791), and the signer_id is the tool's label, did:example:wai-prov: a key whose seed is published attests nothing, so its id names no origin (jwp-receipts §7.1, §7.8). The figures, 426844 µJ for encode.png and 140425 µJ for encode.jpeg (unlabelled; origin.synthesize is unmetered), are the ones wai_prov measured on the host's on-chip energy counters when it first wrote this asset, at an earlier revision that signed under an origin-bound id. --carry carries them onto the same bytes and signs them again under the label; nothing is measured again. wai_prov carries a figure only from a receipt that verifies and whose steps have this run's operations, input and output hashes and work.

To regenerate, from wai/wai-rs (the codecs feature links the system codec libraries):

cargo run --release --no-default-features --features provenance,codecs,receipt_claims --bin wai_prov -- \
  ../wai-web/reach/test/vectors/provenance \
  --carry ../wai-web/reach/test/vectors/provenance/captured.receipt.json

The receipt is carried onto itself, so the command writes both files again byte for byte; on a host whose synthesis or encoders give other bytes, the lineage differs and the command refuses. Without --carry, wai_prov measures each encode afresh (a usable figure is labelled OnChipCounter), and the receipt and its hash below change.

The receipt profile of the reach builds exists to check receipts like this one, so the conformance runs (../../conformance.js) verify it on every rung: the content hash and the signature must verify, a copy with one bit changed must fail the content check, and a copy with its joule total raised by one must fail the signature check. The receipt's hash, signer id, step count and joule total must read as the receipt states them; the total crosses the JavaScript boundary as a 64-bit integer, a BigInt where the engine has one and a Number where it does not.

file SHA-256
captured.jpeg.wai 4382082d2bbd1ef5358315afd578fc533d74bf973a57d4c45033c89c847a22a3
captured.receipt.json 97c5c24a03eae1c6a2d0e5374ad13c5ca00de00d696f40116f41c66b7097ff64