WAI energy truth: sink measurement profiles, one measured figure per capability, stream energy per hop, display capability #459

Closed
dcharlot wants to merge 12 commits from wai/energy-truth into wai/gpu-int-tier

2026-10-24

Transaction Science
docs/research: the HDR metadata companions named by their standard
Some checks failed
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 6m32s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 3m19s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m11s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Failing after 3m37s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m44s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 3m28s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 17s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Failing after 2m29s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 14s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 23s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 1m43s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 9m5s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 7m1s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 4s
WAI conformance / cargo-class corpora · macos (pull_request) Failing after 2m5s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 23s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 53s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m11s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m12s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m46s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 4m55s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 2m38s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 6m28s
wai-pack / wai-pack · macos (pull_request) Successful in 2m40s
wai-pack / wai-pack · the floor through a media prober (pull_request) Failing after 30s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m12s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 2m8s
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Successful in 2m40s
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Successful in 1m48s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 29m28s
The research note named a trade name for one of the two SMPTE ST 2094
dynamic-metadata companions. It now names the standard and the two
registered capability strings, as SPEC §5 does.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 21:00:36 -04:00
Transaction Science
wai-conformance: the OER C kernel's modelled corpus reproduces byte for byte
The C kernel step rebuilds firmware_vectors_modelled.json from source with
the harness's modelled mode and compares it with the pinned copy, as it does
the issued corpus. The same run requires the kernel to refuse a modelled
figure graded measured (the harness exits 4 otherwise), so that refusal is
checked on every unix leg.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 21:00:36 -04:00
Transaction Science
wai-conformance: stream energy and display capability run in CI
The independent-verifiers job gains two steps in the pattern of the live
extensions: wai-rs's unit tests and integration test for wai.stream.energy
(with the sink profiles of energy-measurement §9 and the reference budgets
of §9.5) and stream_energy_verify.py; then display capability
(capability-constraints §6), its tests and display_verify.py. The workflow
fires on an edit of stream-energy.md, whose §7 the test and the verifier
read, and of the raw spans the reference budgets recompute from. Both tests
leave tests/NOT-IN-CI.txt.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 21:00:36 -04:00
Transaction Science
wai CHANGELOG: energy a stream spends, measured where it can be, bounded where it cannot
Some checks failed
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 8m12s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 3m40s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m7s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 5s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 9m37s
wai-pack / wai-pack · linux (pull_request) Successful in 3m14s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 10m59s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 4m37s
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
wai-quantum studio and desktop / desktop app · macos (pull_request) Has been cancelled
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
wai-quantum studio and desktop / studio · browser (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Has been cancelled
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:19:40 -04:00
Transaction Science
wai-pack-gpu: the packer's WGSL kernels computed in integers
packaging §11.6 item 1 forbids running a step in floating point where the step is
defined in integers. The packer's kernels (the motion search, SSE and BLAKE3)
are now held to conditions 1 and 2 of determinism-tiers §5, Claiming the tier on
a GPU, which wai-ops-gpu/tests/wgsl_rules.rs checks for the decoders' kernels on
naga's IR: a source check refuses a floating-point type or literal, an enable
directive and a subgroup or quad built-in, with a self-test of the scanner on
each form it refuses and on the integer forms the kernels use.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:19:40 -04:00
Transaction Science
oer-conformance/settle: the C kernel takes its grade from its meter
The portable kernel wrote "how":"measured" and "device":"hardware" into every
receipt, whatever its meter was, and the host harness's meter is a model: a
cycle count times the kernel's projected cycle energy, and constant idle and
shared powers nobody measured. Those receipts graded a modelled figure
measured, which oer-receipts §2 does not support.

The kernel now writes the grade and device its meter states, and refuses
(returns -3) a meter graded measured whose method names no instrument
(hardware_meter). The harness's new `modelled` mode grades its meter
model_estimated / projected and checks that the kernel refuses the same meter
graded measured; its default `issued` mode recreates the pinned
firmware_vectors.json byte for byte, which the existing CI step compares, so no
issued receipt changes. firmware_vectors_modelled.json is the modelled run,
verified by oer2_verify.py and by wai_oer_vectors. The Zephyr skeleton grades
its calibrated model projected.

This touches oer-conformance/, which the public-text scripts describe as settled
OER/2 material; the brief asked for the kernel's receipts to state their class
truthfully. oer-receipts.md and wai-rs/src/oer.rs are unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:19:40 -04:00
Transaction Science
energy_class::Presented: unmetered work is never shown as zero joules; the world demo's estimate labelled
One rendering of a figure for every reader: the unmetered marker reads
"unmetered", a figure with no class says nothing states how it was obtained, a
Partial figure reads "at least", and a classed figure carries its class and its
declared uncertainty over its window, in integer arithmetic. A class beside a
zero figure is refused, as every verifier refuses it.

wai-web's world demo sealed its wall-time estimate (compute time at a declared
4 W) with no class, and printed "≈0.0 mJ est" for a session it had not timed.
It now labels a non-zero estimate Estimator, seals zero as the unmetered
marker, and shows the figure through energy_text, the wasm binding of
Presented. A native test seals both from a committed world vector.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:19:40 -04:00
Transaction Science
wai.stream.energy: each hop's figure for a segment, the stream-segment receipt, and termination records
A per-stream, per-segment figure that is measured or bounded, never modelled
from a bitrate table:

- WSH1, the hop figure record: origin, relay, sink decode or display, each
  signed by its hop, with the class of energy-measurement §2, its coverage
  (Partial is a lower bound), the deliveries an origin's or relay's figure is
  shared by, and for an estimate the declared power and time it is computed
  from. A display figure is always an Estimator from the panel's declared
  on-mode power (an EU energy label's, a manufacturer's or the sink's own); a
  decode figure is held to its sink measurement profile, and a Whole figure over
  an unmetered fabric is refused bound_overstated. HwShunt is refused first.
- WSE1, the sink's stream-segment receipt: each hop's share, a total per class
  and never one across classes, a delivery sum (origin, relays, decode) and a
  display sum each at its weakest class and Partial wherever a part is, and
  whether the rendition was above the panel (capability-constraints §6).
- WST1, the termination record: a stream stopped because its page was hidden,
  its player occluded, its display off, its autoplay not continued or its viewer
  idle, with the reason, the receipts it accounts for, and the joules spent by
  role and class, in all and while the condition held.

A verifier recomputes every share, total, sum and verdict from the records.
Registered as a record (SPEC §5, REGISTRY.md, the export). Reference
wai::stream_energy (feature stream_energy), corpus energy-conformance/stream/,
wai_stream_energy_vectors, tests/stream_energy.rs, and stream_energy_verify.py,
the second implementation written from the text. The integration tests are
listed in NOT-IN-CI.txt until a workflow step names them: this change edits no
workflow.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:19:40 -04:00
Transaction Science
capability-constraints §6: display capability, so no rendition above the panel is sent
WAI-authored register entries for the panel a sink presents on (wai-display:
sides, refresh, bit depth, transfers, diagonal, viewing distance) and for a
rendition (wai-video:), the exact test of whether a rendition is above a panel
in size (sides compared in the orientation that fits), rate, depth, transfer
and acuity, and selection: among the renditions a sink can pick, the first
within its panel; where none is, the first it can pick, recorded as above. The
acuity respect is ITU-R BT.1845-1's one-arc-minute criterion, applied only where
the sink declares its distance, in integers with tan(1') rounded down so it
never flags a rendition the exact value would not.

wai::display_caps, its corpus constraints-conformance/display/ (panels of common
devices against a 2160p60 HDR to 360p ladder, and the declaration refusals),
wai_display_vectors, tests/display_caps.rs, and display_verify.py, the second
implementation written from the text.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:16:20 -04:00
Transaction Science
energy-measurement §9.5: energy budgets of learned capabilities, as platform-decode §5 reads them
platform-decode §5 (wai/gpu-int-tier) reads a learned entry's energy budget and
leaves how one is carried and checked to energy-measurement. §9.5 says: an
OnChipCounter figure, coverage Whole, of a learned capability's decode with one
parameter set on a reference sink, under §9.4, per picture, frame or second of
output (a division that is not whole adds its rounding to the declaration),
bound to its parameter set by the digests a pin names, carried in the registry
and checked against its published spans.

wai::codecs::energy_budget holds the budgets of the learned capabilities
measured (int_codec audio and splat, int_hyper image and video, int_mlicpp,
int_synth) and budget_for(capability, pin), which gives the
platform_decode::EnergyBudget only to an entry pinned to the measured set. Its
tests recompute every budget from the published spans and every set digest from
the committed set, and show the default order of platform-decode §4 ranking the
measured set first and another set, or an unmeasured learned capability, last.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:16:03 -04:00
Transaction Science
wai_sink_meter and docs/research: one decode figure per capability, measured without privileges
wai_sink_meter runs energy-measurement §9.4 on the macos-task profile: in
process, each capability the reference sink decodes, from a committed vector or
a source made from a fixed seed, on one worker under the fast kernels; out of
process, an external decoder as a child read before it is reaped, its figure
its own energy and what the kernel billed to it.

Measured on the build host (M3 Ultra, macOS 27.0.1, one-minute load 30 to 88
from other work), five spans a case, no sudo. Every WAI capability row is
OnChipCounter, Whole; every VideoToolbox row is Partial, a lower bound, since no
counter covers the media engine. A decoder service's whole energy is never
attributed: on this shared host other clients start one at any moment (16 in
one 58 ms run of a decoder that used none), so only what the kernel bills
counts. The spans of every row are published as JSON lines, from which §9.4's
arithmetic gives each figure again. Times and energies are indicative; digests
and counts are exact.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:16:03 -04:00
Transaction Science
energy-measurement §9: sink measurement profiles per operating system, and the span protocol for a task counter
A sink measurement profile fixes, for one operating system, which counters an
unprivileged sink can read, the class each figure is sealed under, the fabrics
each covers and those none covers:

- macos-task: the kernel's per-task CPU energy (ri_energy_nj, from the CPU's own
  energy counters, with ri_billed_energy for work other processes did on the
  task's behalf), OnChipCounter, attribution task, filtering Unknown; the GPU
  rail under §6.3's sole-user rule; the media engine and the neural engine
  unmetered on macOS 27. No root.
- linux-rapl-nvml: RAPL, readable only by root since Linux 5.10 (an owner's
  grant opens a package rail, never a task figure); NVML for the GPU board.
- android-app, ios-app: an Estimator from a declared basis, or ModelBased.
  Android 15's power monitors refresh every 30 s with up to 10 J of deliberate
  noise; iOS declares task_energy but nobody has measured it.

§9.3: a figure over work on a fabric its profile does not meter is Partial, a
lower bound, and is shown as one. §9.4: a task counter needs no idle bracket;
spans of whole completions, threads started after the opening read, a settle
wait, liveness read during each span, and the figure and least declaration
from the spans' integers alone. §2.6: no profile names HwShunt.

wai::sink_energy holds the profiles and the arithmetic (pure std, unconditional,
hidden from cbindgen); its macOS reader is behind the new sink_meter feature.
energy_report's Nat is shared within the crate for the exact products.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-24 20:15:49 -04:00