Some checks failed
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 6s
wai-audit collector and player integration / does this change touch it (pull_request) Successful in 7s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 6s
WAI operation catalogue / does this change touch it (pull_request) Successful in 6s
WAI conformance / does this change touch it (pull_request) Successful in 7s
WAI energy receipts / does this change touch it (pull_request) Successful in 5s
WAI examples / WAI examples · does this change touch them (pull_request) Successful in 10s
wai-quantum command line / does this change touch it (pull_request) Successful in 7s
wai-quantum contract / does this change touch it (pull_request) Successful in 6s
wai-quantum dataflow member / does this change touch it (pull_request) Successful in 6s
wai-quantum CUDA member / does this change touch it (pull_request) Successful in 8s
wai-quantum docs, course and locales / does this change touch it (pull_request) Successful in 6s
wai-quantum signal processor / does this change touch it (pull_request) Successful in 6s
wai-quantum editors / does this change touch it (pull_request) Successful in 7s
wai-quantum other formats / does this change touch it (pull_request) Successful in 5s
wai-quantum HIP member / does this change touch it (pull_request) Successful in 6s
wai-quantum FPGA member / does this change touch it (pull_request) Successful in 7s
wai-quantum resource estimation / does this change touch it (pull_request) Successful in 12s
wai-quantum for JavaScript / does this change touch it (pull_request) Successful in 6s
wai-quantum OpenQASM reader / does this change touch it (pull_request) Successful in 6s
wai-quantum Metal member / does this change touch it (pull_request) Successful in 7s
wai-quantum npu-cores member / does this change touch it (pull_request) Successful in 10s
wai-quantum neural-processor member / does this change touch it (pull_request) Successful in 5s
wai-quantum OpenCL member / does this change touch it (pull_request) Successful in 6s
wai-quantum CUDA member / member · CUDA (jetson-hub) (pull_request) Successful in 1m42s
wai-quantum CUDA member / member · CUDA (thor) (pull_request) Successful in 1m56s
wai-quantum OpenCL member / member · OpenCL GPU and CPU (jetson-hub) (pull_request) Successful in 32s
WAI conformance / fast integer kernels, every x86_64 kernel set (AVX-512 silicon) (pull_request) Successful in 2m50s
wai-quantum OpenCL member / member · OpenCL GPU and CPU (thor) (pull_request) Successful in 46s
wai-quantum HIP member / member · HIP (framework-128gb) (pull_request) Successful in 1m0s
wai-quantum on every processor / emulated · loongarch64-unknown-linux-gnu (pull_request) Successful in 3m4s
wai-quantum pulse and dynamics / does this change touch it (pull_request) Successful in 5s
wai-quantum for Python / does this change touch it (pull_request) Successful in 5s
wai-quantum error correction and mitigation / does this change touch it (pull_request) Successful in 5s
wai-quantum-qpu / does this change touch it (pull_request) Successful in 5s
wai-quantum extension points / does this change touch it (pull_request) Successful in 5s
wai-quantum service / does this change touch it (pull_request) Successful in 5s
wai-quantum matrix-extension member / does this change touch it (pull_request) Successful in 5s
wai-quantum studio and desktop / does this change touch it (pull_request) Successful in 6s
wai-quantum tensor-engine member / does this change touch it (pull_request) Successful in 5s
wai-quantum on every processor / emulated · powerpc64le-unknown-linux-gnu (pull_request) Successful in 3m56s
wai-quantum variational and algorithm library / does this change touch it (pull_request) Successful in 6s
wai-quantum portable tensor program / does this change touch it (pull_request) Successful in 10s
wai-quantum npu-cores member / member · npu-cores, neural processor (framework-128gb silicon) (pull_request) Successful in 1m12s
wai-quantum CPU vector units / does this change touch it (pull_request) Successful in 5s
wai-quantum verdicts and repairs / does this change touch it (pull_request) Successful in 8s
wai-quantum views in agent hosts / does this change touch it (pull_request) Successful in 6s
wai-quantum on every processor / emulated · s390x-unknown-linux-gnu (pull_request) Successful in 3m49s
wai-sink-android native sink library / does this change touch it (pull_request) Successful in 5s
wai-sink-swift native sink package / does this change touch it (pull_request) Successful in 5s
wai-quantum WebGPU member / does this change touch it (pull_request) Successful in 9s
WAI Studio / does this change touch it (pull_request) Successful in 5s
wai-quantum OpenCL member / member · OpenCL GPU (framework-128gb) (pull_request) Successful in 23s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 5s
wai-web wasm32 / does this change touch it (pull_request) Successful in 11s
wai-quantum portable tensor program / tensor program · integrated GPU (framework-128gb) (pull_request) Successful in 12s
wai-quantum service / service energy · linux packages (pull_request) Successful in 1m29s
wai-quantum CPU vector units / member · vector units, avx2 and avx512 (framework-128gb silicon) (pull_request) Successful in 20s
wai-quantum on every processor / emulated · aarch64-unknown-linux-gnu (pull_request) Successful in 5m33s
wai-quantum portable tensor program / tensor program · GPUs (jetson-hub) (pull_request) Successful in 27s
wai-audit collector and player integration / collector · linux (pull_request) Successful in 1m5s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Successful in 1m49s
wai-quantum on every processor / emulated · riscv64gc-unknown-linux-gnu (pull_request) Successful in 6m36s
wai-quantum on every processor / emulated · armv7-unknown-linux-gnueabihf (pull_request) Successful in 6m58s
WAI conformance / cross-arch byte-equality · linux (pull_request) Failing after 23s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (pull_request) Successful in 2m56s
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Successful in 12m41s
WAI conformance / faces from keypoints under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m44s
wai-quantum on every processor / emulated · powerpc64-unknown-linux-gnu (pull_request) Successful in 9m12s
wai-quantum on every processor / emulated · i686-unknown-linux-gnu (pull_request) Successful in 6m56s
wai-quantum contract / the policy is linked, and the deprecations page reads (pull_request) Successful in 4s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 3m19s
WAI operation catalogue / the catalogue and every door · linux (pull_request) Successful in 4m42s
wai-quantum CUDA member / member · CUDA absent (linux) (pull_request) Successful in 1m28s
wai-quantum command line / command line · linux (pull_request) Successful in 4m13s
wai-quantum contract / API compatibility · linux (pull_request) Successful in 4m33s
wai-quantum WebGPU member / member · integrated GPU, Vulkan (framework-128gb) (pull_request) Failing after 7m54s
wai-quantum dataflow member / member · dataflow device, simulated (pci 1e52:b140) (pull_request) Successful in 3m56s
wai-quantum docs, course and locales / the Studio's words in every locale · linux (pull_request) Failing after 1s
wai-quantum signal processor / processor and member · signal processor, emulated (pull_request) Failing after 3s
wai-quantum editors / editors · linux (pull_request) Failing after 1s
wai-quantum other formats / readers, writers and the set · linux (pull_request) Failing after 1s
wai-quantum other formats / the set under wasm32-wasip2 (wasmtime) (pull_request) Failing after 1s
wai-quantum FPGA member / member · FPGA simulation absent (linux) (pull_request) Failing after 1s
wai-quantum resource estimation / estimation and calibration · linux, release (pull_request) Failing after 1s
wai-quantum for JavaScript / javascript · linux (pull_request) Failing after 1s
wai-quantum OpenQASM reader / reader and corpus · linux (pull_request) Failing after 1s
wai-quantum OpenQASM reader / corpus under wasm32-wasip2 (wasmtime) (pull_request) Failing after 1s
wai-quantum Metal member / member · Metal absent (linux) (pull_request) Failing after 1s
wai-quantum neural-processor member / member · neural processor absent (linux) (pull_request) Failing after 1s
wai-quantum OpenCL member / member · OpenCL absent (linux) (pull_request) Failing after 1s
wai-quantum docs, course and locales / the course and the command line's languages · linux (pull_request) Failing after 1m38s
wai-quantum dataflow member / member · dataflow device, simulated (pci 1e52:401e) (pull_request) Successful in 5m2s
wai-quantum pulse and dynamics / reader, simulator and pulse jobs under wasm32-wasip2 (wasmtime) (pull_request) Successful in 50s
wai-quantum contract / schemas and the committed tool lists · linux (pull_request) Successful in 6m19s
wai-quantum pulse and dynamics / reader, simulator and pulse jobs · linux, release (pull_request) Successful in 1m31s
wai-quantum-qpu / clients against their contracts (linux) (pull_request) Successful in 45s
wai-quantum extension points / the registry under wasm32-wasip2 (wasmtime) (pull_request) Successful in 57s
wai-quantum matrix-extension member / member · matrix extension, emulated (aarch64 Linux) (pull_request) Successful in 11s
wai-quantum error correction and mitigation / codes, decoders, texts and mitigation · linux, release (pull_request) Successful in 2m33s
wai-quantum extension points / the registry and the example · linux (pull_request) Successful in 2m33s
wai-quantum studio and desktop / desktop app · windows (pull_request) Successful in 9m41s
wai-quantum for Python / python · linux (pull_request) Successful in 3m45s
wai-quantum on every processor / emulated · sparc64-unknown-linux-gnu (pull_request) Successful in 18m31s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 11m25s
wai-quantum CPU vector units / member · vector unit, rvv 1024-bit (riscv64, emulated) (pull_request) Successful in 35s
wai-quantum CPU vector units / member · vector unit, rvv 128-bit (riscv64, emulated) (pull_request) Successful in 15s
wai-quantum variational and algorithm library / parameters, gradients, optimisers, VQE, QAOA and builders · linux, release (pull_request) Successful in 1m52s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 14m39s
wai-quantum CPU vector units / member · vector unit, sve 2048-bit (aarch64, emulated) (pull_request) Successful in 27s
wai-quantum CPU vector units / member · vector unit, sve 512-bit (aarch64, emulated) (pull_request) Successful in 9s
wai-quantum portable tensor program / tensor program · CPU, mutants, GPU builds (pull_request) Successful in 1m34s
wai-quantum CPU vector units / member · vector unit, avx2 (x86_64 silicon) (pull_request) Successful in 34s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 3m51s
wai-quantum CPU vector units / member · vector unit, sve 128-bit (aarch64, emulated) (pull_request) Successful in 1m24s
wai-quantum service / service · linux (pull_request) Successful in 5m2s
wai-quantum verdicts and repairs / the intent set and the verdict under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m6s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 1m9s
wai-quantum verdicts and repairs / verdicts, repairs and the intent set · linux (pull_request) Successful in 2m13s
wai-quantum tensor-engine member / member · tensor engine, the kernel toolchain's simulator (linux) (pull_request) Successful in 5m49s
wai-quantum studio and desktop / desktop app · linux (pull_request) Successful in 6m30s
wai-quantum views in agent hosts / views · a scripted host (pull_request) Successful in 3m47s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness (pull_request) Successful in 4m4s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m55s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m36s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 6m26s
wai-quantum WebGPU member / member · GPU, Vulkan (jetson-hub) (pull_request) Successful in 22m43s
wai-quantum views in agent hosts / views · the page and its engine (pull_request) Successful in 7m56s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 16m50s
wai-quantum WebGPU member / member · GPU, Vulkan (thor) (pull_request) Successful in 24m56s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 8m3s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m16s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 29m6s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 1m31s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 25s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m2s
wai-quantum command line / command line · macos (pull_request) Successful in 1m51s
wai-quantum dataflow member / member · dataflow device absent (macos) (pull_request) Successful in 17s
wai-quantum editors / editors · macos (pull_request) Successful in 1m18s
wai-quantum FPGA member / member · FPGA datapath, simulated (macos) (pull_request) Successful in 1m20s
wai-quantum Metal member / member · Metal (macos) (pull_request) Successful in 33s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 10m49s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 7m51s
wai-quantum OpenCL member / member · OpenCL GPU (macos) (pull_request) Successful in 29s
wai-quantum pulse and dynamics / the same bits · macos (pull_request) Successful in 48s
wai-quantum-qpu / credentials in the keychain (macos) (pull_request) Successful in 19s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Failing after 1m40s
wai-quantum for Python / python · macos (pull_request) Successful in 2m29s
wai-quantum matrix-extension member / member · matrix extension absent (macos) (pull_request) Successful in 13s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 13m26s
wai-quantum portable tensor program / tensor program · Metal and the arm64 CPU (macos) (pull_request) Successful in 17s
wai-quantum CPU vector units / member · vector unit absent (macos) (pull_request) Successful in 16s
wai-quantum service / service · macos (pull_request) Successful in 3m50s
wai-quantum neural-processor member / member · neural processor (macos) (pull_request) Successful in 6m26s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m28s
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Successful in 2m43s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 5m35s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 16m40s
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Successful in 1m53s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 5m55s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 27s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 9m41s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 17m34s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 16m22s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 13s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 44s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m40s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 12m31s
wai-quantum HIP member / member · HIP absent (linux-arm64) (pull_request) Successful in 53s
wai-quantum npu-cores member / member · npu-cores absent (linux-arm64) (pull_request) Successful in 24s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 7m51s
wai-quantum pulse and dynamics / the same bits · linux-arm64 (pull_request) Successful in 1m19s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 11m49s
wai-quantum tensor-engine member / member · tensor engine absent (linux-arm64) (pull_request) Successful in 19s
wai-quantum variational and algorithm library / parameters, gradients, optimisers, VQE, QAOA and builders · linux-arm64, release (pull_request) Successful in 1m35s
wai-quantum extension points / the registry and the example · linux-arm64 (pull_request) Successful in 3m36s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m28s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h35m10s
The loop the job service will write programs with, as a crate of its own. The task is an exercise
in the course's form (wai.quantum.exercise/1). A model writes a program, and the engine checks it
against the task exactly as it checks a lesson's answer (engine::course::check_exercise). What went
wrong goes back to the model in the engine's own words, until a program passes or the rounds run
out.
- The code model (src/coder.rs): North Mini Code 1.0 (Apache-2.0) on the pure-Rust runtime
(jouleclaw-loader-gguf).
- Decoding is greedy, so the same model files, task and engine give the same programs.
- The conversation stays in the model's cache: a repair round feeds only the new turn, where
the measurement harness re-read the whole conversation each round.
- The loop takes the answer after the model's thinking, so thinking text is never checked as a
program, and a reply that never leaves its thinking is asked again.
- The model's identity: the digest of a manifest of its files (wai.quantum.model/1,
wai-model.json). open() checks each file's size against it, and verify reads every byte.
- The transcript (wai.quantum.write/1): the task, model and prompt (version, system and first-turn
digests), the decoding, the engine's version, and each attempt (program, digest, the engine's
check, tokens). Timing is returned beside it, since a replay does not reproduce time.
- The engine:
- course::task_of shows any exercise as a lesson shows its own, its title and task given as one
string or one per locale;
- course::exercise gives a lesson's exercise document;
- lesson() now builds its fields through the same helpers, and a test holds every lesson's
fields in both locales equal to task_of's.
- The command line: wai-quantum-writer write | course | manifest | verify.
- CI: wai-quantum-cli.yml tests the writer with a scripted model, with and without the model
compiled in, plus clippy. The workflow now also runs for changes to the writer and to the
loader crate it depends on.
Tests (all run on the build machines):
- wai-quantum-writer: 7 pass, default features and without them; clippy -D warnings is clean.
- engine::course: 11 pass.
- scripts/check-lockfiles.sh: 61 lockfiles, all current.
Stacked on #645 (check_exercise).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
229 lines
14 KiB
YAML
229 lines
14 KiB
YAML
name: wai-quantum command line
|
|
|
|
# The wai-quantum command line (wai/wai-quantum-cli): its tests and clippy with
|
|
# warnings as errors, with and without `submit`; its smoke checks (smoke.sh: lint,
|
|
# plan, run, verify and a forged result refused, key, draw, MCP over stdio, the
|
|
# research tools); and the WASI component, whose output under wasmtime equals the
|
|
# native build's byte for byte. On macOS, also with the GPU state vector. Its tests
|
|
# include the model harness (src/eval.rs): every task's reference solved and an
|
|
# empty program not, a scripted run, a model server on this machine asked and one
|
|
# elsewhere refused, and the corpus (wai/quantum-conformance/eval/) held to the
|
|
# task set.
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/wai-quantum-cli/**'
|
|
- 'wai/wai-quantum-qpu/**'
|
|
- 'wai/wai-quantum-writer/**'
|
|
# The writer's model runs on this crate, which it path-depends on.
|
|
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-loader-gguf/**'
|
|
- 'wai/quantum-conformance/eval/**'
|
|
- 'rust-toolchain.toml'
|
|
- '.github/workflows/wai-quantum-cli.yml'
|
|
pull_request:
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/wai-quantum-cli/**'
|
|
- 'wai/wai-quantum-qpu/**'
|
|
- 'wai/wai-quantum-writer/**'
|
|
# The writer's model runs on this crate, which it path-depends on.
|
|
- 'jouleclaw/jouleclaw-rs/crates/jouleclaw-loader-gguf/**'
|
|
- 'wai/quantum-conformance/eval/**'
|
|
- 'rust-toolchain.toml'
|
|
- '.github/workflows/wai-quantum-cli.yml'
|
|
|
|
jobs:
|
|
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-cli.yml \
|
|
"${{ github.event.pull_request.base.sha }}" \
|
|
"${{ github.event.pull_request.head.sha }}")
|
|
echo "this change touches the wai-quantum command line: $r"
|
|
echo "run=$r" >> "$GITHUB_OUTPUT"
|
|
|
|
cli-linux:
|
|
name: command line · linux
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
runs-on: linux
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- name: Install Rust 1.99.1 with clippy and the wasm32-wasip2 target
|
|
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 --component clippy
|
|
rustup default 1.99.1
|
|
rustup target add --toolchain 1.99.1 wasm32-wasip2
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
- name: Tests and clippy, with and without submit
|
|
shell: bash
|
|
working-directory: wai/wai-quantum-cli
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --release 2>&1 | tee "$RUNNER_TEMP/test.log"
|
|
grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed' "$RUNNER_TEMP/test.log" || { echo "::error::no test ran"; exit 1; }
|
|
# Your own providers end to end (tests/providers.rs), against the
|
|
# reference provider this binary serves, and their jobs as MCP
|
|
# tasks, each test by name.
|
|
for t in a_person_adds_tests_plans_and_runs_on_a_provider_and_the_receipt_verifies \
|
|
a_run_that_is_not_free_is_refused_until_the_person_confirms_it \
|
|
a_credential_is_kept_in_a_file_only_its_owner_reads_and_appears_in_nothing_printed \
|
|
a_provider_over_http_runs_with_its_credential_in_the_header \
|
|
an_agent_lists_estimates_is_refused_and_runs_only_with_confirm_cost \
|
|
an_agent_runs_on_a_provider_as_a_task_and_the_server_answers_while_it_waits \
|
|
providers::tasks::tests::a_job_reads_as_its_task \
|
|
providers::tasks::tests::a_cancelled_request_ends_its_wait_and_a_change_wakes_it; do
|
|
grep -q "^test $t \.\.\. ok$" "$RUNNER_TEMP/test.log" || { echo "::error::$t did not run and pass"; exit 1; }
|
|
done
|
|
# The model harness and the views in an agent's host, each test by name.
|
|
for t in eval::tests::every_task_s_reference_is_solved_and_an_empty_program_is_not \
|
|
eval::tests::a_scripted_run_reports_what_the_engine_found \
|
|
eval::tests::a_model_on_this_machine_is_asked_and_one_elsewhere_is_refused \
|
|
eval::tests::the_corpus_is_the_task_set_written_three_ways \
|
|
eval::tests::an_answer_is_read_for_its_program_and_scored \
|
|
mcp::tests::a_host_that_draws_views_gets_them_and_one_that_does_not_gets_words; do
|
|
grep -q "^test $t \.\.\. ok$" "$RUNNER_TEMP/test.log" || { echo "::error::$t did not run and pass"; exit 1; }
|
|
done
|
|
# The token counter needs a model's vocabulary to run; here it is only read.
|
|
python3 -I -c 'import ast, sys; ast.parse(open(sys.argv[1]).read())' ../quantum-conformance/eval/token_cost.py
|
|
cargo clippy --locked --release --all-targets -- -D warnings
|
|
cargo clippy --locked --release --all-targets --no-default-features -- -D warnings
|
|
# wai-quantum-writer: the loop that writes a program for a task, its model on the
|
|
# pure-Rust runtime, checked by the engine as a lesson's answer is. Its tests run the
|
|
# loop with a scripted model (no checkpoint), with and without the model compiled in.
|
|
- name: The writer, with a scripted model, and clippy
|
|
shell: bash
|
|
working-directory: wai/wai-quantum-writer
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --release
|
|
cargo test --locked --release --no-default-features
|
|
cargo clippy --locked --release --all-targets -- -D warnings
|
|
cargo clippy --locked --release --all-targets --no-default-features -- -D warnings
|
|
- name: The smoke checks
|
|
shell: bash
|
|
working-directory: wai/wai-quantum-cli
|
|
run: |
|
|
set -euo pipefail
|
|
cargo build --locked --release
|
|
bash smoke.sh ./target/release/wai-quantum
|
|
# The release binary, pinned by version and SHA-256, rather than a build from source.
|
|
# Every WAI workflow that runs wasmtime pins this one version, and every run passes
|
|
# -W nan-canonicalization=y -W relaxed-simd-deterministic=y: every NaN a float
|
|
# instruction makes is the canonical one, and each relaxed SIMD instruction has one
|
|
# behaviour on every host. A stock wasmtime leaves both off. The fixed relaxed
|
|
# behaviour is the engine's own: on 50.0.1 relaxed_madd is fused (measured on arm64 and
|
|
# x86_64), where WebAssembly's deterministic profile prescribes the unfused result.
|
|
# The repository checks (scripts/check-wasmtime-pin.py) fail a workflow that pins another
|
|
# release or runs wasmtime without both settings.
|
|
- name: Install wasmtime 50.0.1
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
[ "$(uname -m)" = x86_64 ] || { echo "::error::the pinned wasmtime archive is x86_64; this host is $(uname -m)"; exit 1; }
|
|
if ! command -v xz >/dev/null 2>&1; then
|
|
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
|
|
$SUDO apt-get update -qq
|
|
$SUDO apt-get install -y -qq xz-utils
|
|
fi
|
|
v=50.0.1
|
|
f="wasmtime-v$v-x86_64-linux.tar.xz"
|
|
curl --proto '=https' --tlsv1.2 -sSfL -o "$RUNNER_TEMP/$f" \
|
|
"https://github.com/bytecodealliance/wasmtime/releases/download/v$v/$f"
|
|
echo "685466455dd42a14774a86c36c8f2e45cbb9bd6d92a850139315df60a75498a5 $RUNNER_TEMP/$f" | sha256sum -c -
|
|
tar -xJf "$RUNNER_TEMP/$f" -C "$RUNNER_TEMP"
|
|
echo "$RUNNER_TEMP/wasmtime-v$v-x86_64-linux" >> "$GITHUB_PATH"
|
|
# The same source as a WASI component: a circuit's state hash, a run's
|
|
# result and a receipt signed with the published key are the native
|
|
# build's, byte for byte.
|
|
- name: The WASI component gives the native build's bytes
|
|
shell: bash
|
|
working-directory: wai/wai-quantum-cli
|
|
run: |
|
|
set -euo pipefail
|
|
cargo build --locked --release --target wasm32-wasip2 --no-default-features
|
|
w=target/wasm32-wasip2/release/wai-quantum.wasm
|
|
n=target/release/wai-quantum
|
|
printf 'OPENQASM 3.0; qubit[3] q; h q[0]; cx q[0], q[1]; t q[2]; cx q[1], q[2];' > "$RUNNER_TEMP/p.qasm"
|
|
for args in "lab run ghz -n 5" "lab receipt ghz -n 3 --demo-key"; do
|
|
$n $args > "$RUNNER_TEMP/native.txt" 2> /dev/null
|
|
wasmtime run -W nan-canonicalization=y -W relaxed-simd-deterministic=y "$w" $args > "$RUNNER_TEMP/wasi.txt" 2> /dev/null
|
|
cmp "$RUNNER_TEMP/native.txt" "$RUNNER_TEMP/wasi.txt" || { echo "::error::$args differs under wasmtime"; diff "$RUNNER_TEMP/native.txt" "$RUNNER_TEMP/wasi.txt" || true; exit 1; }
|
|
done
|
|
$n run --demo-key --json --shots 100 < "$RUNNER_TEMP/p.qasm" 2> /dev/null | python3 -c 'import json,sys; j=json.load(sys.stdin); j["result"].pop("elapsed_ms"); j["result"]["receipt"].pop("digest"); j["result"]["receipt"].pop("signature"); print(json.dumps(j, sort_keys=True))' > "$RUNNER_TEMP/native.json"
|
|
wasmtime run -W nan-canonicalization=y -W relaxed-simd-deterministic=y "$w" run --demo-key --json --shots 100 < "$RUNNER_TEMP/p.qasm" 2> /dev/null | python3 -c 'import json,sys; j=json.load(sys.stdin); j["result"].pop("elapsed_ms"); j["result"]["receipt"].pop("digest"); j["result"]["receipt"].pop("signature"); print(json.dumps(j, sort_keys=True))' > "$RUNNER_TEMP/wasi.json"
|
|
cmp "$RUNNER_TEMP/native.json" "$RUNNER_TEMP/wasi.json" || { echo "::error::a run's result differs under wasmtime"; exit 1; }
|
|
# A compile to Clifford+T (rotation synthesis in exact and fixed-point
|
|
# arithmetic, the passes, the certificate and its seal): byte for byte.
|
|
printf 'OPENQASM 3.0; qubit[2] q; h q[0]; rz(0.3) q[0]; cx q[0], q[1]; ry(1.1) q[1]; cp(0.7) q[0], q[1];' > "$RUNNER_TEMP/angles.qasm"
|
|
$n compile --demo-key --json --level 2 --epsilon 1e-8 < "$RUNNER_TEMP/angles.qasm" > "$RUNNER_TEMP/native-compile.json" 2> /dev/null
|
|
wasmtime run -W nan-canonicalization=y -W relaxed-simd-deterministic=y "$w" compile --demo-key --json --level 2 --epsilon 1e-8 < "$RUNNER_TEMP/angles.qasm" > "$RUNNER_TEMP/wasi-compile.json" 2> /dev/null
|
|
cmp "$RUNNER_TEMP/native-compile.json" "$RUNNER_TEMP/wasi-compile.json" || { echo "::error::a compile differs under wasmtime"; exit 1; }
|
|
# A run on a device target: the layout search, the noise derived and
|
|
# the density matrix, the same bits.
|
|
for t in synthetic-line-5 synthetic-all-5; do
|
|
$n run --demo-key --json --shots 100 --target $t < "$RUNNER_TEMP/p.qasm" 2> /dev/null | python3 -c 'import json,sys; j=json.load(sys.stdin); j["result"]["receipt"].pop("digest"); j["result"]["receipt"].pop("signature"); print(json.dumps(j, sort_keys=True))' > "$RUNNER_TEMP/native-$t.json"
|
|
wasmtime run -W nan-canonicalization=y -W relaxed-simd-deterministic=y "$w" run --demo-key --json --shots 100 --target $t < "$RUNNER_TEMP/p.qasm" 2> /dev/null | python3 -c 'import json,sys; j=json.load(sys.stdin); j["result"]["receipt"].pop("digest"); j["result"]["receipt"].pop("signature"); print(json.dumps(j, sort_keys=True))' > "$RUNNER_TEMP/wasi-$t.json"
|
|
cmp "$RUNNER_TEMP/native-$t.json" "$RUNNER_TEMP/wasi-$t.json" || { echo "::error::a run on $t differs under wasmtime"; exit 1; }
|
|
done
|
|
# A resource estimate (the counts, each rotation's synthesis, the
|
|
# planar model's factory search and the frontier, every receipt and
|
|
# the seal): byte for byte.
|
|
printf 'OPENQASM 3.0; qubit[4] q; h q; ctrl(3) @ x q[0], q[1], q[2], q[3]; rz(0.3) q[0]; ry(1.1) q[2]; t q[1];' > "$RUNNER_TEMP/est.qasm"
|
|
$n estimate --demo-key --json --qubit us-e3 < "$RUNNER_TEMP/est.qasm" > "$RUNNER_TEMP/native-estimate.json" 2> /dev/null
|
|
wasmtime run -W nan-canonicalization=y -W relaxed-simd-deterministic=y "$w" estimate --demo-key --json --qubit us-e3 < "$RUNNER_TEMP/est.qasm" > "$RUNNER_TEMP/wasi-estimate.json" 2> /dev/null
|
|
cmp "$RUNNER_TEMP/native-estimate.json" "$RUNNER_TEMP/wasi-estimate.json" || { echo "::error::an estimate differs under wasmtime"; exit 1; }
|
|
echo "the WASI component's output equals the native build's"
|
|
|
|
cli-macos:
|
|
name: command line · macos
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
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"
|
|
- name: Tests and clippy, with the GPU state vector
|
|
shell: bash
|
|
working-directory: wai/wai-quantum-cli
|
|
run: |
|
|
set -euo pipefail
|
|
nice -n 10 cargo test --locked --release --features metal 2>&1 | tee "$RUNNER_TEMP/test.log"
|
|
grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed' "$RUNNER_TEMP/test.log" || { echo "::error::no test ran"; exit 1; }
|
|
nice -n 10 cargo clippy --locked --release --all-targets --features metal -- -D warnings
|
|
- name: The smoke checks, and a run on the GPU
|
|
shell: bash
|
|
working-directory: wai/wai-quantum-cli
|
|
run: |
|
|
set -euo pipefail
|
|
nice -n 10 cargo build --locked --release --features metal
|
|
bash smoke.sh ./target/release/wai-quantum
|
|
printf 'OPENQASM 3.0; qubit[12] q; bit[12] c; h q; rx(0.3) q[0]; cx q[0], q[1]; c = measure q;' > "$RUNNER_TEMP/gpu.qasm"
|
|
./target/release/wai-quantum run "$RUNNER_TEMP/gpu.qasm" --method statevector_single --shots 200 --demo-key --json > "$RUNNER_TEMP/gpu.json" 2> /dev/null
|
|
python3 -c 'import json,sys; j=json.load(open(sys.argv[1])); r=j["result"]; assert r["accuracy"]["class"]=="single" and sum(r["counts"].values())==200, r' "$RUNNER_TEMP/gpu.json"
|
|
echo "statevector_single ran on $(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["result"]["accuracy"]["device"])' "$RUNNER_TEMP/gpu.json")"
|