open-standards/.github/workflows/energy-hardware.yml
Transaction Science 8b39a21e9a
Some checks failed
energy meters on real hardware / RAPL and NVML on jetson-hub (pull_request) Successful in 32s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 1m54s
standards workspaces build + test / aac-rs (pull_request) Successful in 53s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 48s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 32s
standards workspaces build + test / map-rs (pull_request) Successful in 29s
standards workspaces build + test / mesh-rs (pull_request) Successful in 25s
standards workspaces build + test / openpay (pull_request) Successful in 1m33s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Successful in 29s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 4m43s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 27s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 1m48s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 52s
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 3s
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 1m7s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m53s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m26s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 1m8s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 1m9s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m12s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m18s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m4s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 3m39s
wai cross-architecture byte-equality / linux-x86_64 (pull_request) Successful in 27s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 4m42s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 13s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 2m11s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 23s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 45s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 1m31s
wai formal verification (integer core) / kani (pull_request) Successful in 5m25s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 3m50s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m0s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m1s
wai-pack / wai-pack · linux (pull_request) Successful in 42s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 59s
standards workspaces build + test / macOS energy backends (pull_request) Failing after 4m31s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m9s
WAI section references / cited sections exist (pull_request) Successful in 9s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 34s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 3m52s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 1m59s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 3s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 8m24s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 34s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m7s
wai-pack / wai-pack · macos (pull_request) Successful in 1m20s
ci: energy-hardware.yml declares its concurrency group
It reached main without one just before the guard did, so main's own guard run
fails on it. The same block every other workflow carries.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 02:30:35 -04:00

127 lines
6.1 KiB
YAML

name: energy meters on real hardware
# The Linux RAPL and NVML meters, run against real counters.
#
# Every other job runs in a container, where Docker masks
# /sys/devices/virtual/powercap and there is no GPU, so the energy crates'
# hardware tests only ever take their "unavailable, and the oracle agrees"
# branch there. This job runs on `linux-hw`: a host executor on jetson-hub
# (Intel i9-13900H: package-0, a core sub-zone, psys, an mmio package; NVIDIA
# RTX 4050 Laptop GPU), as an unprivileged user that can read
# /sys/class/powercap and open /dev/nvidia*. Here the live branch runs, and each
# step fails unless it did:
#
# - RAPL: the test printed the oracle's package-only bracket ("package-only
# inner ... outer ..."), which only the live path prints, after asserting the
# meter read inside it, below package+psys and below package+core.
# - NVML: the test saw the GPU ("nvml hardware: 1 GPU"). On this GPU the
# counter runs past the board while it is polled, so the test asserts the
# meter calls it Implausible and never grades it as hardware.
#
# The host has no Node, so there are no JavaScript actions: the source is
# fetched with plain git, and each workspace keeps its target directory in the
# runner's home between runs.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
pull_request:
paths:
- 'jcp/jcp-rs/crates/jcp-energy/**'
- 'eoc/eoc-rs/crates/eoc-meter/**'
- 'sandbox/sandbox-rs/crates/sandbox-meter/**'
- 'sandbox/sandbox-rs/crates/sandbox-exec-microvm/**'
- 'proof/proof-rs/crates/proof-cascade/**'
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-energy/**'
- '.github/workflows/energy-hardware.yml'
push:
branches:
- main
paths:
- 'jcp/jcp-rs/crates/jcp-energy/**'
- 'eoc/eoc-rs/crates/eoc-meter/**'
- 'sandbox/sandbox-rs/crates/sandbox-meter/**'
- 'sandbox/sandbox-rs/crates/sandbox-exec-microvm/**'
- 'proof/proof-rs/crates/proof-cascade/**'
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-energy/**'
- '.github/workflows/energy-hardware.yml'
jobs:
hardware:
name: RAPL and NVML on jetson-hub
runs-on: linux-hw
timeout-minutes: 150
env:
CARGO_PROFILE_DEV_DEBUG: '0'
CARGO_BUILD_JOBS: '8'
steps:
- name: Fetch the source
shell: bash
run: |
set -euo pipefail
ref="${{ github.event_name == 'pull_request' && format('refs/pull/{0}/head', github.event.pull_request.number) || github.ref }}"
want="${{ github.event.pull_request.head.sha || github.sha }}"
rm -rf src && mkdir src && cd src
git init -q
git fetch -q --depth 1 http://100.64.224.0:3400/Transaction-Science/open-standards.git "$ref"
git checkout -q FETCH_HEAD
got="$(git rev-parse HEAD)"
echo "fetched $ref at $got"
if [ "$got" != "$want" ]; then
echo "::error::$ref is at $got, not $want: it moved after this run started, and a newer run tests it"
exit 1
fi
- name: jcp-energy (RAPL, NVML)
shell: bash
working-directory: src/jcp/jcp-rs
run: |
set -euo pipefail
log=$(mktemp)
CARGO_TARGET_DIR="$HOME/hw-target/jcp-rs" nice -n 10 cargo test -p jcp-energy --features nvml --test rapl_hardware --test nvml_hardware -- --nocapture --test-threads=1 2>&1 | tee "$log"
grep -q 'package-only inner' "$log" || { echo "::error::the RAPL live path never ran"; exit 1; }
grep -q 'nvml hardware: 1 GPU' "$log" || { echo "::error::NVML saw no GPU"; exit 1; }
- name: eoc-meter (RAPL, NVML)
shell: bash
working-directory: src/eoc/eoc-rs
run: |
set -euo pipefail
log=$(mktemp)
CARGO_TARGET_DIR="$HOME/hw-target/eoc-rs" nice -n 10 cargo test -p eoc-meter --features cuda --test rapl_hardware --test nvml_hardware -- --nocapture --test-threads=1 2>&1 | tee "$log"
grep -q 'package-only inner' "$log" || { echo "::error::the RAPL live path never ran"; exit 1; }
grep -q 'nvml hardware: 1 GPU' "$log" || { echo "::error::NVML saw no GPU"; exit 1; }
- name: sandbox-meter (RAPL, NVML) and sandbox-exec-microvm (RAPL)
shell: bash
working-directory: src/sandbox/sandbox-rs
run: |
set -euo pipefail
log=$(mktemp)
CARGO_TARGET_DIR="$HOME/hw-target/sandbox-rs" nice -n 10 cargo test -p sandbox-meter --test rapl_hardware --test nvml_hardware -- --nocapture --test-threads=1 2>&1 | tee "$log"
grep -q 'package-only inner' "$log" || { echo "::error::sandbox-meter: the RAPL live path never ran"; exit 1; }
grep -q 'nvml hardware: 1 GPU' "$log" || { echo "::error::sandbox-meter: NVML saw no GPU"; exit 1; }
log=$(mktemp)
CARGO_TARGET_DIR="$HOME/hw-target/sandbox-rs" nice -n 10 cargo test -p sandbox-exec-microvm --test rapl_hardware -- --nocapture --test-threads=1 2>&1 | tee "$log"
grep -q 'package-only inner' "$log" || { echo "::error::sandbox-exec-microvm: the RAPL live path never ran"; exit 1; }
- name: proof-cascade (RAPL)
shell: bash
working-directory: src/proof/proof-rs
run: |
set -euo pipefail
log=$(mktemp)
CARGO_TARGET_DIR="$HOME/hw-target/proof-rs" nice -n 10 cargo test -p proof-cascade --test rapl_hardware -- --nocapture --test-threads=1 2>&1 | tee "$log"
grep -q 'rapl hardware:.*oracle Live' "$log" || { echo "::error::the RAPL counter was not live to the oracle"; exit 1; }
- name: jouleclaw-energy (RAPL, NVML)
shell: bash
working-directory: src/jouleclaw/jouleclaw-rs
run: |
set -euo pipefail
log=$(mktemp)
CARGO_TARGET_DIR="$HOME/hw-target/jouleclaw-rs" nice -n 10 cargo test -p jouleclaw-energy --features rapl,nvml --test rapl_hardware --test nvml_hardware -- --nocapture --test-threads=1 2>&1 | tee "$log"
grep -q 'package-only inner' "$log" || { echo "::error::the RAPL live path never ran"; exit 1; }
grep -q 'nvml hardware: 1 GPU' "$log" || { echo "::error::NVML saw no GPU"; exit 1; }