open-standards/.github/workflows/wai-quantum-webgpu.yml
Transaction Science ec45aaaca9 toolchain: Rust 1.98.0 -> 1.99.1 (change-controlled pin)
Approved by the owner on 2026-10-22. Procedure: change `channel`, run
`rustup show`, then run the pipeline.

What changed
- rust-toolchain.toml and eoc/eoc-rs/rust-toolchain.toml: channel "1.98.0"
  becomes "1.99.1". These are the only two pins in the tree, and the root one
  governs every other cargo root.
- 64 workflows under .github/workflows (the forge's CI): every `Install Rust
  1.98.0`, `rustup toolchain install / default / component add / target add
  --toolchain 1.98.0` and `--default-toolchain 1.98.0` now names 1.99.1
  (409 lines). Two of those lines are in build steps rather than install
  steps (wai-conformance.yml's two `wasm32 (unix)` steps each
  `rustup target add --toolchain`), and they move with the rest: a target
  added to a toolchain that is not installed is an error.
- Left as they are, because they record what was measured on 1.98.0:
  standards-build.yml's "Verified on a native arm64 Linux container (rustc
  1.98.0)", wai-conformance.yml's note on Rust 1.98's LLD 22, and the
  "rustc 1.98.0 (example)" strings in receipts, vectors and docs. The
  one-codegen-unit workaround that note explains also stays. 1.99.1 ships
  LLD 23.1.1, which the note says links those inputs, but removing the
  workaround should wait for a run at the CI path on x86_64.

Why
- 1.98.0 has a P-critical miscompile, rust-lang/rust#161441 (I-miscompile,
  regression-from-stable-to-stable). rustc emits a vacant (null) method slot
  in a trait-object vtable, so a safe dynamic call jumps to address zero
  (undefined behaviour). RELEASES.md records the fix in 1.98.1 ("rustc: fix
  miscompilation in generating vtables").
- 1.99.1 is the current stable (channel manifest dated 2026-10-15; rustc
  58cf8f9c3 2026-10-13). It also fixes 1.99.0's own regressions: wcslen on
  UEFI and embedded targets, x86_64 FFI `bool` returns, and the rust-lld rpath
  on macOS.

Evidence
All of it ran on the build host ([email protected], aarch64-apple-darwin)
through ~/kani-logs/remote/rb. Nothing was built on the dev Mac.

- `rustup show`: the active toolchain is 1.99.1-aarch64-apple-darwin,
  "overridden by .../rust-toolchain.toml" (and by eoc/eoc-rs's own file
  there). rustc 1.99.1 (58cf8f9c3 2026-10-13), LLVM 23.1.1, clippy 0.1.99,
  rustfmt 1.10.0. The baseline is rustc 1.98.0 (88d9e12ae 2026-08-18).
- Scope: every cargo root the pin governs, which is 46 of the 49 tracked
  lockfiles. The other three: two are vendored crates that resolve inside
  their parents, and wai/wai-rs/fuzz builds on its own pinned nightly.
- Trees. The final tree is main at 96117c570 plus these two commits. Main
  moved four times while this ran, and each root's evidence comes from the
  newest tree it was run on:
  - 13 roots on the final tree: every root main changed after 1a465f23d,
    and every root that consumes such a crate by path.
  - 12 roots on 1a465f23d plus these two commits.
  - 7 roots on b16816671 plus these two commits.
  - 14 roots on aa61ab3b9 plus the pin change.
  For each root in the last three groups, checked with git diff and the
  lockfiles' path packages: none of its files, and no crate it reaches by
  path, differs on the final tree.
- Each root got:
  (a) `cargo fmt --all -- --check` on the pin and on 1.98.0. The output is
      byte-identical in all 46. CI gates no root on rustfmt, and none is
      rustfmt-clean on main.
  (b) `cargo clippy --locked --keep-going --workspace --all-targets` on both
      toolchains, with the diagnostics compared line by line. After the
      previous commit, no root has a diagnostic that only 1.99.1 reports.
      openpay's one differing line is the same lint at the same site,
      reworded.
  (c) `cargo test --workspace --locked`.
  (d) the root's other CI steps that can run on this host: feature-gated
      tests, conformance suites, release-profile tests, the aac page-set
      checks, and every clippy -D warnings gate. The gates are
      standards-build's macOS meter and omni lints (jouleclaw-energy x2,
      jouleclaw-omni metal, jouleclaw-loader-gguf, jcp, proof, eoc, sandbox),
      wai-pack, wai-quantum-cli (default, no-default and metal),
      wai-quantum-service, wai-quantum-qpu and wai-quantum-desktop.
- Totals: `cargo test --workspace` ran in 43 roots: 12,532 passed, 1 failed,
  101 ignored. The other 3 roots are wasm32-only, and their
  `cargo build --release --target wasm32-unknown-unknown` passed. Every
  other CI step passed (62 of 62).
- On the final tree: scripts/check-lockfiles.sh (cargo 1.99.1) found all 47
  lockfiles current, and scripts/check-advisories.py passes.
- tokio is 1.54.1 in every lockfile cargo reads. That is patched for both
  RUSTSEC-2026-0386 (>= 1.53.3) and RUSTSEC-2026-0384 (>= 1.54.1). The 1.53.1
  in vendor/wtransport/Cargo.lock is the upstream file kept with the vendored
  source; cargo resolves wtransport inside its parents, and both gates skip
  that file.
- What is not green, each one reproduced on 1.98.0:
  - wai-ops-gpu: under the debug profile, `corpus` trips the debug_assert at
    exec.rs:187 on both toolchains. CI runs it in release only, and that
    passes (6/6).
  - wai-ops: clippy::derived_hash_with_manual_eq (deny-by-default) on both
    toolchains. No CI job runs clippy there.
  - wai-vector/wasm: `--all-targets` cannot build the lib-test target (its
    own `panic_impl`) on either toolchain. `clippy --lib` for wasm32 reports
    0 diagnostics on both.
  - eoc-cascade's hit_calibration_process_energy test reads real energy
    counters, and it fails some of the time on the loaded shared host. In
    interleaved runs each toolchain passed 18 of 20. The full eoc-rs suite
    passed on the final tree (741 passed).
- Environment, not code:
  - wai-quantum-desktop embeds the Studio's build, so wai/quantum-studio was
    built first (`npm ci`, `node build.mjs`), as CI does.
- Not covered here: the x86_64 and arm64 Linux and Windows legs; the GPU,
  NPU, FPGA, emulator and hardware-meter legs; wasm32 tests under Node,
  wasmtime and wasip2; and the fuzz job.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 17:42:20 -05:00

455 lines
22 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 no GPU host has, and the corpus needs none of them. The GPU
# hosts: jetson-hub (a discrete and an integrated GPU) and framework-128gb (an
# integrated GPU).
#
# 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:
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.lock'
- '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'
schedule:
- cron: '6 7 * * *'
jobs:
# Does this pull request's own diff touch the paths below? This forge matches a
# workflow's `paths:` against the push, so a merge of main into a branch fires the
# workflow whatever the pull request changes; every job here waits on this answer.
# A push to main, a schedule, or anything the script cannot determine answers
# `true` (scripts/pr-touches-paths.py).
relevant:
name: does this change touch it
runs-on: linux
outputs:
run: ${{ steps.gate.outputs.run }}
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- id: gate
run: |
set -euo pipefail
r=$(python3 scripts/pr-touches-paths.py .github/workflows/wai-quantum-webgpu.yml \
"${{ github.event.pull_request.base.sha }}" \
"${{ github.event.pull_request.head.sha }}")
echo "this change touches wai-quantum-webgpu: $r"
echo "run=$r" >> "$GITHUB_OUTPUT"
checks:
needs: relevant
if: needs.relevant.outputs.run == 'true'
name: shader checks · browser build · wasip2 inertness
runs-on: linux
timeout-minutes: 60
steps:
- uses: actions/checkout@v5
- name: Install Rust 1.99.1 (wasm32 targets)
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.99.1
rustup toolchain install 1.99.1 --profile minimal
rustup default 1.99.1
rustup target add --toolchain 1.99.1 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"
# 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:
needs: relevant
if: needs.relevant.outputs.run == 'true'
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.99.1
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.99.1
rustup toolchain install 1.99.1 --profile minimal
rustup default 1.99.1
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:
needs: relevant
if: needs.relevant.outputs.run == 'true'
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:
needs: relevant
if: needs.relevant.outputs.run == 'true'
name: member · GPU, Vulkan (${{ matrix.host }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 150
strategy:
fail-fast: false
matrix:
include:
# Each host's adapters, declared here: its GPUs and the software
# Vulkan driver. The wide sizes run on the GPU only.
- host: jetson-hub
runner: linux-hw
adapters: gpu-vulkan-10de,gpu-vulkan-8086,swgpu-vulkan-10005
- host: thor
runner: linux-arm64-hw
adapters: gpu-vulkan-10de,swgpu-vulkan-10005
env:
WAI_QUANTUM_WEBGPU_EXPECT: ${{ matrix.adapters }}
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: |
set -euo pipefail
echo "adapters declared: $WAI_QUANTUM_WEBGPU_EXPECT"
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
member-amd:
needs: relevant
if: needs.relevant.outputs.run == 'true'
name: member · integrated GPU, Vulkan (framework-128gb)
runs-on: linux-amd
timeout-minutes: 150
env:
# The adapters are declared by the host, in its runner's environment
# (WAI_QUANTUM_AMD_WEBGPU_EXPECT); with no declaration, the integrated GPU
# and the software Vulkan driver. The wide sizes run on the GPU only.
WAI_QUANTUM_WEBGPU_WIDE: '1'
CARGO_PROFILE_DEV_DEBUG: '0'
CARGO_BUILD_JOBS: '12'
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. The
# host names its own route to the forge (WAI_FORGE_URL).
git fetch -q --depth 1 "${WAI_FORGE_URL:-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: |
set -euo pipefail
export WAI_QUANTUM_WEBGPU_EXPECT="${WAI_QUANTUM_AMD_WEBGPU_EXPECT:-gpu-vulkan-1002,swgpu-vulkan-10005}"
echo "adapters declared: $WAI_QUANTUM_WEBGPU_EXPECT"
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:
needs: relevant
if: needs.relevant.outputs.run == 'true'
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