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]>
179 lines
9.2 KiB
YAML
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
|