name: wai-quantum extension points # The registry (wai/wai-quantum/src/engine/registry/): the traits a simulation # method, a compiler pass, a noise channel and a program format implement, the # built-ins registered through them, and a host's own registered beside them. # The registry's tests hold every built-in to the bytes it gave (the pinned # job digests, through the built-in registry and through one holding a host's # components), auto to the order it always tried, the built-in channels and # passes to what they declare, and a host's method, pass, channel and format # to what the engine checks of them: each refusal with its code, and its # identity sealed in the receipt of every result it took part in, marked as # registered. They run under the full feature set and under the contract # workflow's, natively on both Linux architectures and under wasm32-wasip2 by # wasmtime. The example written outside the engine against its public traits # (wai/wai-quantum/examples/extension_points.rs) is tested and run end to end. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true on: push: branches: [main] paths: - 'wai/wai-quantum/**' - 'rust-toolchain.toml' - '.github/workflows/wai-quantum-registry.yml' pull_request: paths: - 'wai/wai-quantum/**' - 'rust-toolchain.toml' - '.github/workflows/wai-quantum-registry.yml' jobs: relevant: name: does this change touch it runs-on: gate 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-registry.yml \ "${{ github.event.pull_request.base.sha }}" \ "${{ github.event.pull_request.head.sha }}") echo "this change touches the registry: $r" echo "run=$r" >> "$GITHUB_OUTPUT" native: name: the registry and the example ยท ${{ matrix.runner }} needs: relevant if: needs.relevant.outputs.run == 'true' strategy: fail-fast: false matrix: runner: [linux, linux-arm64] runs-on: ${{ matrix.runner }} timeout-minutes: 60 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" # A module filter is satisfied by any one test of the module, so each # test is required by name to have run. - name: The registry's tests, under the full feature set and the contract's shell: bash working-directory: wai/wai-quantum run: | set -euo pipefail cargo test --locked --release --features full --lib engine::registry:: 2>&1 | tee "$RUNNER_TEMP/full.log" cargo test --locked --release --no-default-features --features quantum_engine,quantum_receipt,quantum_qec,quantum_noise --lib engine::registry:: 2>&1 | tee "$RUNNER_TEMP/contract.log" for log in full contract; do grep -qE '^test result: ok\. 12 passed; 0 failed' "$RUNNER_TEMP/$log.log" || { echo "::error::the registry's tests did not all pass ($log)"; exit 1; } for t in every_built_in_registers_through_its_trait_in_a_fixed_order \ auto_tries_the_built_ins_in_the_order_it_did \ the_pinned_jobs_give_their_bytes_through_any_registry \ the_built_in_channels_are_valid_channels \ the_built_in_passes_give_what_they_declare \ a_registered_method_is_planned_run_and_named_in_its_result \ the_receipt_seals_a_registered_component_s_identity \ registration_refuses_what_it_cannot_hold \ a_registered_method_s_result_is_held_to_the_contract \ a_registered_channel_runs_on_the_density_matrix_and_is_refused_elsewhere \ a_registered_pass_is_checked_by_the_engine \ a_registered_front_end_converts_and_feeds_a_job; do grep -q "^test engine::registry::tests::$t \.\.\. ok$" "$RUNNER_TEMP/$log.log" || { echo "::error::$t did not run ($log)"; exit 1; } done done - name: The built-ins' bytes, the refusal table and the job layer beside them shell: bash working-directory: wai/wai-quantum run: | set -euo pipefail cargo test --locked --release --features full --lib -- engine::job:: engine::refusal:: engine::catalog:: engine::compile:: engine::formats:: 2>&1 | tee "$RUNNER_TEMP/engine.log" grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed' "$RUNNER_TEMP/engine.log" || { echo "::error::the engine's tests did not pass"; exit 1; } for t in engine::job::tests::a_job_that_asks_for_no_verdict_gives_the_bytes_it_gave \ engine::refusal::tests::the_documented_table_is_the_table; do grep -q "^test $t \.\.\. ok$" "$RUNNER_TEMP/engine.log" || { echo "::error::$t did not run"; exit 1; } done - name: The example, tested and run shell: bash working-directory: wai/wai-quantum run: | set -euo pipefail cargo test --locked --release --features quantum_engine,quantum_receipt --example extension_points 2>&1 | tee "$RUNNER_TEMP/example.log" grep -qE '^test result: ok\. 3 passed; 0 failed' "$RUNNER_TEMP/example.log" || { echo "::error::the example's tests did not pass"; exit 1; } cargo run --locked --release --features quantum_engine,quantum_receipt --example extension_points > "$RUNNER_TEMP/walk.txt" cat "$RUNNER_TEMP/walk.txt" for want in 'the job planned on "basis_table"' 'counts {"100":100}' '"origin": "registered"'; do grep -qF "$want" "$RUNNER_TEMP/walk.txt" || { echo "::error::the example's walk-through does not say: $want"; exit 1; } done wasip2: name: the registry under wasm32-wasip2 (wasmtime) 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 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 rustup default 1.99.1 rustup target add --toolchain 1.99.1 wasm32-wasip2 echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" # 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" # A debug build, so integer overflow panics instead of wrapping. - name: The registry's tests under wasmtime shell: bash working-directory: wai/wai-quantum env: CARGO_TARGET_WASM32_WASIP2_RUNNER: wasmtime run -W nan-canonicalization=y -W relaxed-simd-deterministic=y run: | set -euo pipefail cargo test --locked --target wasm32-wasip2 --features full --lib engine::registry:: 2>&1 | tee "$RUNNER_TEMP/wasip2.log" grep -qE '^test result: ok\. 12 passed; 0 failed' "$RUNNER_TEMP/wasip2.log" || { echo "::error::the registry's tests did not all pass under wasip2"; exit 1; }