open-standards/.github/workflows/wai-formal-verification.yml
Transaction Science 5bd1cb9470 ci(wai): staged delivery in the conformance, byte-equality and proof jobs
The cargo-class build and the library tests add staged and the integer
media features; the fast-kernel steps (overflow checks on and off) add
staged and run the wai stage tests; staged is checked alone and for wasm32;
the corpus loop verifies staged-conformance on every leg; staged_verify.py
runs beside the other independent verifiers. The byte-equality job fires on
the staged sources it includes and on the corpus, and the proof job on the
two staged sources its harnesses cover.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 14:10:20 -04:00

101 lines
4 KiB
YAML

name: wai formal verification (integer core)
# The other half of the determinism contract.
#
# `wai-byte-equality` establishes byte-exactness by SAMPLING: it decodes fixed
# vectors on five real OS/arch combinations and asserts identical bytes. That
# proves the paths agree on the inputs someone thought to write down.
#
# This job REASONS instead. It runs a model checker (Kani/CBMC) over the same
# sources, for every input in a bounded window, and discharges the property the
# byte-exactness claim actually rests on: arithmetic totality. Rust integer
# overflow panics in debug and wraps in release, so an overflowing decoder is
# not one implementation but two, and which one a sink runs depends on how it
# was compiled. A decoder proved free of overflow, out-of-bounds access and
# non-termination is a decoder whose bitstream means exactly one thing.
#
# This is not redundant with the matrix: the matrix decodes WELL-FORMED vectors,
# so it cannot see defects that only a malformed or adversarial stream reaches.
# Four such defects in the bypass escape were found here and fixed, and the
# harnesses stand so they cannot come back.
#
# The proofs are bounded (small symbolic CDFs, fixed-length symbolic streams,
# explicit unwind limits). Bounded is not universal, and the job claims only
# what it checks.
on:
pull_request:
paths:
- 'wai/wai-verify/**'
# The verified source itself must be able to fire this job, or a change
# can regress totality and merge green.
- 'wai/wai-rs/src/rans.rs'
- 'wai/wai-rs/src/int_entropy.rs'
- 'wai/wai-rs/src/int_transform.rs'
- 'wai/wai-rs/src/wai_video_policy.rs'
- 'wai/wai-rs/src/staged/predict.rs'
- 'wai/wai-rs/src/staged/wir1_arith.rs'
# Not verified by any harness, but #[path]-included because int_transform's
# IGDN dispatches to it, so it must still compile under the model checker
# (its cfg(kani) branches are compiled nowhere else).
- 'wai/wai-rs/src/int_kernels.rs'
- '.github/workflows/wai-formal-verification.yml'
push:
branches:
- main
paths:
- 'wai/wai-verify/**'
- 'wai/wai-rs/src/rans.rs'
- 'wai/wai-rs/src/int_entropy.rs'
- 'wai/wai-rs/src/int_transform.rs'
- 'wai/wai-rs/src/wai_video_policy.rs'
- 'wai/wai-rs/src/staged/predict.rs'
- 'wai/wai-rs/src/staged/wir1_arith.rs'
- 'wai/wai-rs/src/int_kernels.rs'
- '.github/workflows/wai-formal-verification.yml'
jobs:
kani:
runs-on: linux
steps:
- uses: actions/checkout@v4
# dtolnay/rust-toolchain cannot help — it calls `rustup`, which is absent
# on this runner image.
- name: Install rustup + toolchain
run: |
set -euo pipefail
if ! command -v rustup >/dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
| sh -s -- -y --profile minimal --default-toolchain 1.98.0
fi
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
# Kani ships its own pinned nightly and a CBMC build; both are slow to
# fetch, so they are cached on the verifier version.
- name: Cache Kani toolchain
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/kani
~/.cargo/bin/cargo-kani
~/.kani
key: kani-0.67.0-${{ runner.os }}
- name: Install Kani
run: |
set -euo pipefail
export PATH="$HOME/.cargo/bin:$PATH"
command -v cargo-kani >/dev/null || cargo install --locked kani-verifier --version 0.67.0
# Idempotent; fetches the pinned nightly + CBMC on a cold cache.
cargo kani setup
- name: Verify the integer core
working-directory: wai/wai-verify
run: |
set -euo pipefail
export PATH="$HOME/.cargo/bin:$PATH"
# Every harness must verify. A failing harness is a real finding
# about the decoder, so this job is allowed to be the thing that
# blocks the merge.
cargo kani