Programs, their intents and the verdict each must get (the level, whether the intents hold, each outcome, strength, check and distance known by hand, the repairs made, the refusal's code), every level of the ladder covered. wai-quantum-verdict.yml runs it natively and under wasmtime, with the verdict's, repair's and codes' unit tests named. Co-Authored-By: Claude Opus 5.5 <[email protected]>
153 lines
7.2 KiB
YAML
153 lines
7.2 KiB
YAML
name: wai-quantum verdicts and repairs
|
|
|
|
# The verified-answer contract (wai/wai-quantum/src/engine/verdict.rs,
|
|
# repair.rs and refusal.rs): a verdict's level for every answer, each intent
|
|
# checked against ground truth, a repair held to the flagged lines, the job
|
|
# layer's refusal codes and the page that documents them, and the byte
|
|
# identity of every job that asks for no verdict. Then the intent
|
|
# conformance set (wai/quantum-conformance/intents/: programs, their intents
|
|
# and the verdict each must get), natively, where a second test holds its
|
|
# bundle equal to its files, and under wasm32-wasip2 by wasmtime, where the
|
|
# cases come from the bundle the test compiles in. The browser build runs the
|
|
# set too (wai-web-wasm.yml, wai-web's wasm32 tests).
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/quantum-conformance/intents/**'
|
|
- 'rust-toolchain.toml'
|
|
- '.github/workflows/wai-quantum-verdict.yml'
|
|
pull_request:
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/quantum-conformance/intents/**'
|
|
- 'rust-toolchain.toml'
|
|
- '.github/workflows/wai-quantum-verdict.yml'
|
|
|
|
jobs:
|
|
relevant:
|
|
name: does this change touch it
|
|
runs-on: linux-arm64
|
|
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-verdict.yml \
|
|
"${{ github.event.pull_request.base.sha }}" \
|
|
"${{ github.event.pull_request.head.sha }}")
|
|
echo "this change touches the verdicts: $r"
|
|
echo "run=$r" >> "$GITHUB_OUTPUT"
|
|
|
|
native:
|
|
name: verdicts, repairs and the intent set · linux
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
runs-on: linux
|
|
timeout-minutes: 60
|
|
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"
|
|
# A module filter is satisfied by any one test of the module, so each
|
|
# module's tests are required by name to have run.
|
|
- name: The verdict, the repair and the codes
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --release --features full --lib -- engine::verdict:: engine::repair:: engine::refusal:: engine::job:: 2>&1 | tee "$RUNNER_TEMP/verdict.log"
|
|
grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed' "$RUNNER_TEMP/verdict.log" || { echo "::error::the verdict's tests did not pass"; exit 1; }
|
|
for t in engine::verdict::tests::each_intent_is_decided_as_ground_truth_says \
|
|
engine::verdict::tests::the_level_is_the_weakest_check_and_holds_says_the_outcome \
|
|
engine::repair::tests::each_rule_makes_the_fix_a_person_would_on_the_flagged_line \
|
|
engine::repair::tests::a_proposal_may_change_only_the_flagged_lines \
|
|
engine::refusal::tests::the_documented_table_is_the_table \
|
|
engine::job::tests::a_job_that_asks_for_no_verdict_gives_the_bytes_it_gave \
|
|
engine::job::tests::every_refusal_an_agent_can_act_on_carries_its_code; do
|
|
grep -q "^test $t \.\.\. ok$" "$RUNNER_TEMP/verdict.log" || { echo "::error::$t did not run"; exit 1; }
|
|
done
|
|
- name: The intent conformance set
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --release --features full --test intent_conformance 2>&1 | tee "$RUNNER_TEMP/intents.log"
|
|
grep -q 'test result: ok. 2 passed; 0 failed' "$RUNNER_TEMP/intents.log" || { echo "::error::the intent set did not pass"; exit 1; }
|
|
|
|
wasip2:
|
|
name: the intent set and the verdict 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.98.0 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.98.0
|
|
rustup toolchain install 1.98.0 --profile minimal
|
|
rustup default 1.98.0
|
|
rustup target add --toolchain 1.98.0 wasm32-wasip2
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
# The release binary, pinned by version and SHA-256, rather than a build from source.
|
|
- name: Install wasmtime 49.0.2
|
|
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=49.0.2
|
|
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 "a4d6e9e3a5a60f527cf7793d674c48930c80c2e8977995b8a275cad3254b9322 $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. The test
|
|
# that reads the set's files has no wasip2 build; the one that runs the
|
|
# cases from the compiled-in bundle does.
|
|
- name: The intent set under wasmtime
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
env:
|
|
CARGO_TARGET_WASM32_WASIP2_RUNNER: wasmtime
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --target wasm32-wasip2 --features full --test intent_conformance 2>&1 | tee "$RUNNER_TEMP/wasip2.log"
|
|
grep -q 'test result: ok. 1 passed; 0 failed' "$RUNNER_TEMP/wasip2.log" || { echo "::error::the intent set did not pass under wasip2"; exit 1; }
|
|
- name: The verdict and the repair under wasmtime
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
env:
|
|
CARGO_TARGET_WASM32_WASIP2_RUNNER: wasmtime
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --target wasm32-wasip2 --features full --lib -- engine::verdict:: engine::repair:: engine::refusal:: 2>&1 | tee "$RUNNER_TEMP/wasip2-lib.log"
|
|
for m in engine::verdict engine::repair engine::refusal; do
|
|
grep -q "^test $m::.* \.\.\. ok$" "$RUNNER_TEMP/wasip2-lib.log" || { echo "::error::no test of $m ran"; exit 1; }
|
|
done
|