open-standards/.github/workflows/wai-quantum-webgpu.yml
Transaction Science 591becdac5
All checks were successful
energy meters on real hardware / RAPL and NVML on jetson-hub (pull_request) Successful in 38s
wai-quantum CUDA member / member · CUDA (jetson-hub) (pull_request) Successful in 16s
spec citations resolve / Code cites no section its SPEC lacks (pull_request) Successful in 6s
standards workspaces build + test / arl-rs (pull_request) Successful in 1m16s
wai-quantum WebGPU member / member · discrete GPU, Vulkan (jetson-hub) (pull_request) Successful in 11m7s
standards workspaces build + test / eoc-rs (pull_request) Successful in 2m19s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m37s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 1m16s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 1m13s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m29s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m27s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m39s
wai cross-architecture byte-equality / linux-x86_64 (pull_request) Successful in 39s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 4m24s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 2m29s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 15s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 9m59s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 11s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 30s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 56s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 2m11s
wai formal verification (integer core) / every harness in one shard (pull_request) Successful in 11s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 12m49s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 17m52s
wai formal verification (integer core) / kani (arith) (pull_request) Successful in 10m19s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 14m47s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 31s
wai formal verification (integer core) / kani (plan) (pull_request) Successful in 7m41s
wai formal verification (integer core) / kani (sound) (pull_request) Successful in 11m5s
wai formal verification (integer core) / kani (stage) (pull_request) Successful in 3m4s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 30m55s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 51s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 2m30s
wai formal verification (integer core) / kani (stage-long) (pull_request) Successful in 23m29s
wai formal verification (integer core) / kani (isqrt512) (pull_request) Successful in 52m3s
wai formal verification (integer core) / kani (integer-core) (pull_request) Successful in 6m1s
WAI HTTP delivery / WAI HTTP · does this change touch it (pull_request) Successful in 5s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Has been skipped
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Has been skipped
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been skipped
WAI energy receipts / energy receipts · macos (pull_request) Successful in 12m43s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m28s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m32s
wai-ops differential (nightly) / differential · debug (pull_request) Successful in 2m35s
wai-ops differential (nightly) / differential · release (pull_request) Successful in 3m1s
wai-ops integer operators / linux-x86_64 (pull_request) Successful in 53s
wai-ops integer operators / wasm32-wasip2 (wasmtime) (pull_request) Successful in 29s
wai-ops integer operators / independent checker (Python) (pull_request) Successful in 13s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 5s
wai-ops integer operators / wasm32 under Node (pull_request) Successful in 24s
wai-pack / wai-pack · linux (pull_request) Has been skipped
wai-pack / wai-pack · linux-arm64 (pull_request) Has been skipped
wai-pack / wai-pack · macos (pull_request) Has been skipped
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been skipped
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been skipped
wai-pack / wai-pack · dependency licences (pull_request) Has been skipped
wai-quantum CUDA member / member · CUDA absent (linux) (pull_request) Successful in 23s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m4s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 3m3s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 6s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Has been skipped
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Has been skipped
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m9s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m24s
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 11s
no-vanity-metrics / WAI public text names no comparison (pull_request) Successful in 6s
no-vanity-metrics / WAI public text names no company or product (pull_request) Successful in 5s
no-vanity-metrics / No new orphan source files (pull_request) Successful in 6s
lockfiles / every Cargo.lock is current (pull_request) Successful in 38s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 3m48s
standards workspaces build + test / aac-rs (pull_request) Successful in 4m0s
wai formal verification (integer core) / kani (rans64-t2) (pull_request) Successful in 29m7s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 1m8s
wai-ops integer operators / macos-arm64 (pull_request) Successful in 1m5s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 1m39s
standards workspaces build + test / map-rs (pull_request) Successful in 1m6s
standards workspaces build + test / mesh-rs (pull_request) Successful in 1m7s
tests in CI / every test file is run by a job or listed with its reason (pull_request) Successful in 5s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Successful in 36s
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Successful in 4m17s
standards workspaces build + test / openpay (pull_request) Successful in 4m38s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 32s
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Successful in 3m7s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 3m0s
wai-ops integer operators / linux-aarch64 (pull_request) Successful in 1m22s
WAI section references / cited sections exist (pull_request) Successful in 26s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 10s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 12m33s
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Successful in 13m41s
wai-quantum WebGPU: the windows member, five adapters certified bit-exact
The windows runner is back (cbio-device-0000), so the member the workflow had
only sketched in a comment is now a job. It replaces that comment.

One job, not one per backend. The member test enumerates every adapter wgpu
finds in the one process, and this host exposes five: both of its GPUs through
both backends, plus Microsoft's software adapter through DX12.

  gpu-dx12-10de    discrete NVIDIA, DX12
  gpu-dx12-8086    integrated Intel, DX12
  gpu-vulkan-10de  discrete NVIDIA, Vulkan
  gpu-vulkan-8086  integrated Intel, Vulkan
  swgpu-dx12-1414  WARP, class Cpu

The DX12 keys are the first coverage of the WGSL -> HLSL path (naga): every
other member reaches its adapter through Metal or Vulkan.

Run on the host before this was written, at this tree: 14 of 14 member tests
pass; the adapters found are exactly the declared five; 40 bit-exact
certificates, which is five adapters by four pinned corpus digests by both
implementations (the per-gate kernel and tile runs); 7 of 7 shader mutants and
3 of 3 tile mutants killed on every one of the five; and the conformance corpus
verifies through the member, statevector-equivalence holding, every reject file
refused as listed.

Two host facts the steps have to carry, both of which would otherwise fail in a
way that looks like a code defect:

  `bash` here resolves to the WindowsApps WSL stub, and the machine PATH holds
  Git\cmd (git.exe) but not Git\bin (bash.exe). Under WSL the steps would reach
  none of the Windows GPU drivers, so Git Bash is put on PATH first and the next
  step refuses to continue unless `uname -s` reports MINGW or MSYS.

  The runner writes an unsigned .ps1 per step, so the process execution policy
  is set to Bypass; pwsh rather than Windows PowerShell, whose 5.1 parser
  rejects the PS7 syntax this repo's scripts use.

Not a required status, per the note it replaces.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-14 08:56:05 -04:00

397 lines
20 KiB
YAML

name: wai-quantum WebGPU member
# The fabric's WebGPU member: one WGSL gate kernel, compiled for every adapter a
# runner has, certified against the CPU reference's pinned corpus digests. A
# second implementation, tile runs (the same kernel followed by apply_tile, which
# applies a run of gates tile by tile in one dispatch), is certified on its own
# against the same digests, on every adapter and in the browser.
#
# Each member job declares the adapters its runner must have in
# WAI_QUANTUM_WEBGPU_EXPECT. The device test fails if the adapters found differ,
# and scripts/wai-quantum-webgpu-member.sh fails unless all tests ran, every
# declared adapter earned one bit-exact certificate per pinned digest, and every
# declared adapter killed every shader mutant.
#
# The GPU jobs then run the quantum conformance corpus through each member
# (`wai_quantum_vectors verify --webgpu`). wai-rs is built there with
# --no-default-features: its default feature, `codecs`, links system codec
# libraries that neither GPU host has, and the corpus needs none of them.
#
# The browser job runs the same kernel through a browser's WebGPU, compiled by the
# browser's own WGSL compiler: wai-web's `quantum_webgpu` bundle in a headless page
# (wai/quantum-conformance/browser_webgpu.mjs), which must certify a GPU member with
# the four pinned digests, reproduce every vector and refuse every reject file with
# its class. It is not a required status until it has been green three runs in a row.
#
# The meter (wai/tools/quantum-meter) is wai-quantum's RunMeter over a process's own
# CPU and GPU energy counters. On the Metal host, where those counters exist, it meters
# a member's runs and the CPU reference's over windows they resolve, and its test must
# print what it read; on the software Vulkan host, where they do not, every window must
# come out unmetered.
#
# There is no windows job while the windows runner is offline: a job queued on an
# offline runner never settles. Add it back from the comment at the end when the
# runner has survived a reboot.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches: [main]
paths:
- 'wai/wai-quantum/**'
- 'wai/quantum-conformance/**'
- 'wai/tools/quantum-wgsl-check/**'
# The meter, and the counters it reads.
- 'wai/tools/quantum-meter/**'
- 'jouleclaw/jouleclaw-rs/Cargo.toml'
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-core/**'
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-energy/**'
- 'wai/wai-rs/src/bin/wai_quantum_vectors.rs'
# The GPU jobs build wai-rs with the forwarded feature, --locked.
- 'wai/wai-rs/Cargo.toml'
- 'wai/wai-rs/Cargo.lock'
- 'wai/wai-rs/src/lib.rs'
- 'rust-toolchain.toml'
# The checks and browser jobs build wai-web with its feature, --locked.
- 'wai/wai-web/Cargo.toml'
- 'wai/wai-web/Cargo.lock'
- 'wai/wai-web/src/quantum_webgpu.rs'
- 'wai/wai-web/src/lib.rs'
- 'wai/wai-web/demo/quantum_webgpu*'
- 'scripts/wai-quantum-webgpu-member.sh'
- '.github/workflows/wai-quantum-webgpu.yml'
pull_request:
paths:
- 'wai/wai-quantum/**'
- 'wai/quantum-conformance/**'
- 'wai/tools/quantum-wgsl-check/**'
# The meter, and the counters it reads.
- 'wai/tools/quantum-meter/**'
- 'jouleclaw/jouleclaw-rs/Cargo.toml'
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-core/**'
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-energy/**'
- 'wai/wai-rs/src/bin/wai_quantum_vectors.rs'
# The GPU jobs build wai-rs with the forwarded feature, --locked.
- 'wai/wai-rs/Cargo.toml'
- 'wai/wai-rs/Cargo.lock'
- 'wai/wai-rs/src/lib.rs'
- 'rust-toolchain.toml'
# The checks and browser jobs build wai-web with its feature, --locked.
- 'wai/wai-web/Cargo.toml'
- 'wai/wai-web/Cargo.lock'
- 'wai/wai-web/src/quantum_webgpu.rs'
- 'wai/wai-web/src/lib.rs'
- 'wai/wai-web/demo/quantum_webgpu*'
- 'scripts/wai-quantum-webgpu-member.sh'
- '.github/workflows/wai-quantum-webgpu.yml'
jobs:
checks:
name: shader checks · browser build · wasip2 inertness · MSRV
runs-on: linux
timeout-minutes: 60
steps:
- uses: actions/checkout@v5
- name: Install Rust 1.98.0 (wasm32 targets) and 1.97.0
shell: bash
run: |
export PATH="$HOME/.cargo/bin:$PATH"
command -v rustup >/dev/null 2>&1 || \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0
rustup toolchain install 1.98.0 --profile minimal
rustup toolchain install 1.97.0 --profile minimal
rustup default 1.98.0
rustup target add --toolchain 1.98.0 wasm32-unknown-unknown wasm32-wasip2
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: SPIR-V validator
shell: bash
run: |
set -euo pipefail
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
$SUDO apt-get update -qq
$SUDO apt-get install -y -qq --no-install-recommends spirv-tools
- name: The shaders under naga 30.0.1
shell: bash
working-directory: wai/tools/quantum-wgsl-check
run: |
set -euo pipefail
cargo run --locked --release -- "$RUNNER_TEMP" 2>&1 | tee "$RUNNER_TEMP/wgsl-check.log"
grep -qx "quantum-wgsl-check: ok" "$RUNNER_TEMP/wgsl-check.log"
spirv-val --target-env vulkan1.1 "$RUNNER_TEMP/lanes32.spv"
spirv-val --target-env vulkan1.1 "$RUNNER_TEMP/lanes32_tile.spv"
- name: The member builds for a browser
working-directory: wai/wai-quantum
run: cargo build --locked --lib --target wasm32-unknown-unknown --no-default-features --features quantum_fabric_webgpu
- name: The browser bundle builds with the member
working-directory: wai/wai-web
run: cargo build --locked --release --target wasm32-unknown-unknown --features quantum_webgpu
- name: On wasm32-wasip2 the feature is inert
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
cargo check --locked --lib --target wasm32-wasip2 --features full,quantum_fabric_webgpu
w="$RUNNER_TEMP/tree-wasip2.txt"; n="$RUNNER_TEMP/tree-native.txt"
cargo tree --locked --target wasm32-wasip2 --features full,quantum_fabric_webgpu -e normal --prefix none > "$w"
cargo tree --locked --target x86_64-unknown-linux-gnu --features quantum_fabric_webgpu -e normal --prefix none > "$n"
grep -q '^wai-quantum ' "$w" || { echo "::error::cargo tree printed no wasip2 tree"; exit 1; }
grep -q '^wgpu ' "$n" || { echo "::error::the native tree has no wgpu, so this check cannot see it"; exit 1; }
if grep -q '^wgpu' "$w"; then echo "::error::wgpu is in the wasm32-wasip2 tree"; exit 1; fi
- name: The package carries the shader
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
cargo package --locked --list --allow-dirty > "$RUNNER_TEMP/package.txt"
grep -qx 'src/quantum_fabric/lanes32.wgsl' "$RUNNER_TEMP/package.txt"
grep -qx 'src/quantum_fabric/lanes32_tile.wgsl' "$RUNNER_TEMP/package.txt"
- name: MSRV 1.97.0
working-directory: wai/wai-quantum
run: cargo +1.97.0 check --locked --lib --features quantum_fabric_webgpu
# The member's unit tests need no GPU (a failed native wait is fed to the
# guard as a panicking closure), and only the feature build compiles them.
- name: The member's unit tests, without a device
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
cargo test --locked --lib --features quantum_fabric_webgpu -- quantum_fabric_webgpu:: 2>&1 \
| tee "$RUNNER_TEMP/member-unit.log"
grep -q '^test quantum_fabric_webgpu::tests::a_failed_native_wait_is_a_typed_loss \.\.\. ok$' \
"$RUNNER_TEMP/member-unit.log" \
|| { echo "::error::the member's unit test did not run"; exit 1; }
member-software:
name: member · software Vulkan (linux)
runs-on: linux
timeout-minutes: 120
env:
WAI_QUANTUM_WEBGPU_EXPECT: swgpu-vulkan-10005
steps:
- uses: actions/checkout@v5
- name: Install Rust 1.98.0
shell: bash
run: |
export PATH="$HOME/.cargo/bin:$PATH"
command -v rustup >/dev/null 2>&1 || \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0
rustup toolchain install 1.98.0 --profile minimal
rustup default 1.98.0
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: The Vulkan loader and a software Vulkan driver
shell: bash
run: |
set -euo pipefail
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
$SUDO apt-get update -qq
$SUDO apt-get install -y -qq --no-install-recommends libvulkan1 mesa-vulkan-drivers
- name: The member's tests
shell: bash
run: scripts/wai-quantum-webgpu-member.sh
# No per-process energy counter exists here: the meter must find none, and a
# run of the member through it must be unmetered.
- name: The meter, where its counters do not exist
shell: bash
working-directory: wai/tools/quantum-meter
run: |
set -euo pipefail
cargo test --locked -- --nocapture 2>&1 | tee "$RUNNER_TEMP/meter.log"
grep -q '^test a_members_runs_are_metered_over_a_window_the_counters_resolve \.\.\. ok$' "$RUNNER_TEMP/meter.log" \
|| { echo "::error::the meter's device test did not run"; exit 1; }
grep -q '^quantum-meter: the counters are not live here' "$RUNNER_TEMP/meter.log" \
|| { echo "::error::the meter's device test found no adapter, so it checked nothing"; exit 1; }
member-metal:
name: member · Metal (macos)
runs-on: macos
timeout-minutes: 90
env:
WAI_QUANTUM_WEBGPU_EXPECT: gpu-metal-0
steps:
- uses: actions/checkout@v5
# launchd's PATH omits cargo on the macOS host runner.
- name: Put cargo on PATH
shell: bash
run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: The member's tests
shell: bash
run: nice -n 10 scripts/wai-quantum-webgpu-member.sh
- name: The conformance corpus through the member
shell: bash
working-directory: wai/wai-rs
run: nice -n 10 cargo run --locked --no-default-features --features quantum_fabric_webgpu --bin wai_quantum_vectors -- verify ../quantum-conformance --webgpu
# The counters exist here. The device test prints a `quantum-meter hardware:` line
# for each window it read: a figure, or why another process's GPU use left it
# none. The tool then calibrates both members on one circuit and, where both
# windows earn a figure, places it.
- name: The meter on this process's counters
shell: bash
working-directory: wai/tools/quantum-meter
run: |
set -euo pipefail
nice -n 10 cargo test --locked --release -- --nocapture 2>&1 | tee "$RUNNER_TEMP/meter.log"
grep -q '^test a_members_runs_are_metered_over_a_window_the_counters_resolve \.\.\. ok$' "$RUNNER_TEMP/meter.log" \
|| { echo "::error::the meter's device test did not run"; exit 1; }
grep -q '^quantum-meter hardware: ' "$RUNNER_TEMP/meter.log" \
|| { echo "::error::the meter read no window: its counters are not live on this host"; exit 1; }
nice -n 10 cargo run --locked --release -- --counter-ppm 50000 2>&1 | tee "$RUNNER_TEMP/meter-tool.log"
grep -q '^quantum-meter: local/cpu-' "$RUNNER_TEMP/meter-tool.log" \
|| { echo "::error::the tool ran no window on the CPU reference"; exit 1; }
member-hw:
name: member · discrete GPU, Vulkan (jetson-hub)
runs-on: linux-hw
timeout-minutes: 150
env:
# Set from the key list the first run prints; add any other ICD the host
# exposes (an integrated GPU, a software driver) as it reports them.
# The discrete GPU, and the software Vulkan driver the host also has. The wide
# sizes run on the GPU only.
WAI_QUANTUM_WEBGPU_EXPECT: gpu-vulkan-10de,swgpu-vulkan-10005
WAI_QUANTUM_WEBGPU_WIDE: '1'
CARGO_PROFILE_DEV_DEBUG: '0'
CARGO_BUILD_JOBS: '8'
steps:
- name: Fetch the source
shell: bash
run: |
set -euo pipefail
want="${{ github.event.pull_request.head.sha || github.sha }}"
rm -rf src && mkdir src && cd src
git init -q
# Fetch the commit itself, not the ref: a later commit on the ref that this
# workflow's paths do not match would otherwise be fetched instead.
git fetch -q --depth 1 http://100.64.224.0:3400/Transaction-Science/open-standards.git "$want"
git checkout -q FETCH_HEAD
got="$(git rev-parse HEAD)"
[ "$got" = "$want" ] || { echo "::error::fetched $got, not $want"; exit 1; }
- name: The member's tests
shell: bash
working-directory: src
run: CARGO_TARGET_DIR="$HOME/hw-target/wai-quantum" nice -n 10 scripts/wai-quantum-webgpu-member.sh
- name: The conformance corpus through the member
shell: bash
working-directory: src/wai/wai-rs
run: CARGO_TARGET_DIR="$HOME/hw-target/wai-rs" nice -n 10 cargo run --locked --no-default-features --features quantum_fabric_webgpu --bin wai_quantum_vectors -- verify ../quantum-conformance --webgpu
browser:
name: member · browser WebGPU (macos)
runs-on: macos
timeout-minutes: 60
steps:
- uses: actions/checkout@v5
# launchd's PATH omits cargo on the macOS host runner.
- name: Put cargo on PATH
shell: bash
run: echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
# The page's file is held to the crate by wai-quantum's tests/fabric_expected.rs:
# exactly the four certificates of the pinned corpora (gateset, corpus, seed,
# cases, wide circuits and the digest the CPU computes) and both implementation
# ids. Editing the file alone, say giving fabric-v1 random-v1's digests so that
# no circuit wider than one tile runs, fails here.
- name: The page's pins are the crate's
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
nice -n 10 cargo test --locked --features quantum_fabric --test fabric_expected 2>&1 | tee "$RUNNER_TEMP/fabric-expected.log"
grep -q '^test the_browser_legs_pins_are_the_crates \.\.\. ok$' "$RUNNER_TEMP/fabric-expected.log" \
|| { echo "::error::the pins test did not run"; exit 1; }
# Pinned to the wasm-bindgen version in wai-web/Cargo.lock: the CLI and the crate
# must match exactly.
- name: wasm-bindgen CLI 0.2.127
shell: bash
run: |
set -euo pipefail
rustup target add wasm32-unknown-unknown
cargo install --locked wasm-bindgen-cli --version 0.2.127
- name: The member's bundle
shell: bash
working-directory: wai/wai-web
run: |
set -euo pipefail
nice -n 10 cargo build --locked --release --target wasm32-unknown-unknown --features quantum_webgpu
wasm-bindgen --target web --out-dir demo/pkg-webgpu --out-name wai_quantum_webgpu \
target/wasm32-unknown-unknown/release/wai_web.wasm
# Playwright and its headless browser go into the job's temporary directory, not
# the host's caches. `chromium` is Playwright's name for its engine.
- name: Playwright 1.60.0 and its headless browser
shell: bash
run: |
set -euo pipefail
node --version
pw="$RUNNER_TEMP/playwright"
mkdir -p "$pw"
npm install --prefix "$pw" --no-save --no-audit --no-fund [email protected]
PLAYWRIGHT_BROWSERS_PATH="$pw/browsers" "$pw/node_modules/.bin/playwright" install --only-shell chromium
echo "PLAYWRIGHT_HOST=$pw/" >> "$GITHUB_ENV"
echo "PLAYWRIGHT_BROWSERS_PATH=$pw/browsers" >> "$GITHUB_ENV"
- name: The member in a browser
shell: bash
run: |
set -euo pipefail
WAI_QUANTUM_WEBGPU_REQUIRE=1 nice -n 10 node wai/quantum-conformance/browser_webgpu.mjs 2>&1 \
| tee "$RUNNER_TEMP/browser-webgpu.log"
grep -qE '^browser webgpu: member=local/gpu-webgpu-[0-9a-f]{12} class=gpu certified bit-exact 4 of 4; tiles certified bit-exact 4 of 4; ' \
"$RUNNER_TEMP/browser-webgpu.log" \
|| { echo "::error::no GPU member certified bit-exact 4 of 4, per-gate and in tile runs, in the browser"; exit 1; }
# Windows reaches both of this host's GPUs through both backends, so one job
# certifies five adapters rather than one per backend: the member test
# enumerates every adapter in the one process, and the DX12 keys exercise the
# WGSL -> HLSL path (naga) that no other member covers. Not a required status.
member-windows:
name: member · DX12 and Vulkan (cbio-windows)
runs-on: windows
timeout-minutes: 150
env:
# The key list this host's first run printed:
# gpu-dx12-10de discrete NVIDIA, DX12
# gpu-dx12-8086 integrated Intel, DX12
# gpu-vulkan-10de discrete NVIDIA, Vulkan
# gpu-vulkan-8086 integrated Intel, Vulkan
# swgpu-dx12-1414 Microsoft's software adapter (WARP), class Cpu
# Adding or removing a driver changes this set, and the member test fails
# until this line matches it again.
WAI_QUANTUM_WEBGPU_EXPECT: gpu-dx12-10de,gpu-dx12-8086,gpu-vulkan-10de,gpu-vulkan-8086,swgpu-dx12-1414
steps:
- uses: actions/checkout@v5
# The runner writes an unsigned .ps1 per step, which the default policy
# refuses. pwsh, not Windows PowerShell: the 5.1 parser rejects the PS7
# syntax this repo's scripts use.
- name: Allow the runner's generated scripts to run
shell: pwsh
run: Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force
# `bash` on this host resolves to the WindowsApps WSL stub, and the machine
# PATH carries Git\cmd (git.exe) but not Git\bin (bash.exe). Without this
# every `shell: bash` step below would run under WSL, which reaches none of
# the Windows GPU drivers.
- name: Put Git Bash on PATH
shell: pwsh
run: |
$gitBash = 'C:\Program Files\Git\bin'
if (-not (Test-Path "$gitBash\bash.exe")) { throw "Git Bash is missing at $gitBash" }
$gitBash | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: The shell is Git Bash, not WSL
shell: bash
run: |
set -euo pipefail
command -v bash
# A WSL bash reports Linux; Git Bash reports MINGW or MSYS.
case "$(uname -s)" in
MINGW*|MSYS*) ;;
*) echo "::error::bash is $(uname -s), not Git Bash"; exit 1 ;;
esac
- name: The member's tests
shell: bash
run: scripts/wai-quantum-webgpu-member.sh
# wai-rs is built with --no-default-features here for the same reason as the
# other GPU members: its default `codecs` feature links system codec
# libraries this host does not have, and the corpus needs none of them.
- name: The conformance corpus through the member
shell: bash
working-directory: wai/wai-rs
run: cargo run --locked --no-default-features --features quantum_fabric_webgpu --bin wai_quantum_vectors -- verify ../quantum-conformance --webgpu