open-standards/.github/workflows/wai-quantum-verdict.yml
Transaction Science 6a18101d12 wai-quantum: the answer view layer, its codes and conformance set, and correctness records
engine::answer reads wai.quantum.answer/1: view statements over an
OpenQASM 3 program (Histogram, Verdict, Equivalence, Bloch, Estimate,
Receipt and the rest, fourteen in all), each view's numbers bound to an
engine call written with @ (@Sample, @Check, @Seal, eleven in all), so a
model's answer shows numbers the engine computed. One statement a line,
the program in a named qasm fence, root first, forward references, and a
later declaration standing as the edit. The reader streams: a snapshot
says what is ready, pending or dropped, and the finished answer is the
whole text's at every split (tested at every split point). Every problem
has a stable code: a program's keep the reader's Q codes, a statement's
are the new J100 to J112, each dropped, defaulted or warned, and only the
dropped ones are errors a model is sent back. eval carries the calls out
on the engine (a run's time left out), seals what @Seal names in a job's
form, and checks a stored answer's receipt marker by running it again.

The conformance set (quantum-conformance/answers/, 20 cases, every code)
passes natively, under wasm32-wasip2 and in the browser, where the stored
case written natively verifies to the same bytes. wai-web gains
AnswerStream and the answer and telemetry calls (pins 24 native, 16 wasm32).

engine::telemetry defines the correctness record (codes, verdict level,
repairs, the person's accept or reject, the receipt) and turns the failures
among records into an eval corpus in the conformance format.

The specification (extensions/quantum-answers.md) is a draft whose token
comparison is still to come.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 08:42:54 -04:00

179 lines
9.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).
#
# The answer view layer (engine/answer/: view statements over OpenQASM 3, each
# bound to an engine call) and correctness telemetry (engine/telemetry.rs) run
# here too: the layer's tests (the stream ending as the whole text reads at
# every split, every code), and its conformance set
# (wai/quantum-conformance/answers/: each answer's codes, root and order, its
# views run to what they must show, the stored answers' receipts verified by
# running them again), natively and under wasm32-wasip2.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches: [main]
paths:
- 'wai/wai-quantum/**'
- 'wai/quantum-conformance/intents/**'
- 'wai/quantum-conformance/answers/**'
- 'rust-toolchain.toml'
- '.github/workflows/wai-quantum-verdict.yml'
pull_request:
paths:
- 'wai/wai-quantum/**'
- 'wai/quantum-conformance/intents/**'
- 'wai/quantum-conformance/answers/**'
- '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; }
- name: The answer view layer, telemetry, and the answer conformance set
shell: bash
working-directory: wai/wai-quantum
run: |
set -euo pipefail
cargo test --locked --release --features full --lib -- engine::answer:: engine::telemetry:: 2>&1 | tee "$RUNNER_TEMP/answer.log"
for t in engine::answer::tests::streaming_at_every_split_ends_as_the_whole_text_reads \
engine::answer::tests::every_problem_has_its_code_and_says_what_becomes_of_the_statement \
engine::answer::tests::an_answer_s_calls_run_on_the_engine_and_its_seal_verifies_when_run_again \
engine::telemetry::tests::the_failures_become_a_corpus_in_the_conformance_format; do
grep -q "^test $t \.\.\. ok$" "$RUNNER_TEMP/answer.log" || { echo "::error::$t did not run"; exit 1; }
done
cargo test --locked --release --features full --test answer_conformance 2>&1 | tee "$RUNNER_TEMP/answers.log"
grep -q 'test result: ok. 2 passed; 0 failed' "$RUNNER_TEMP/answers.log" || { echo "::error::the answer 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; }
cargo test --locked --target wasm32-wasip2 --features full --test answer_conformance 2>&1 | tee "$RUNNER_TEMP/wasip2-answers.log"
grep -q 'test result: ok. 1 passed; 0 failed' "$RUNNER_TEMP/wasip2-answers.log" || { echo "::error::the answer 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