open-standards/.github/workflows/wai-neural-e2e.yml
Transaction Science f5e87f3437
Some checks failed
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Failing after 3s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Failing after 4s
wai cross-architecture byte-equality / windows-x86_64 (pull_request) Failing after 16s
WAI conformance / cargo-class corpora · windows (pull_request) Failing after 10s
WAI conformance / cross-arch byte-equality · windows (pull_request) Failing after 9s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 51s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Failing after 18s
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Failing after 1m31s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 2m27s
jouleclaw public surface must stay documented / Public-surface audit (jouleclaw-rs) (pull_request) Successful in 59s
wai cross-architecture byte-equality / linux-x86_64 (pull_request) Failing after 14s
WAI conformance / cross-arch byte-equality · macos (pull_request) Failing after 19s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 30s
WAI conformance / cross-arch byte-equality · linux (pull_request) Failing after 14s
WAI neural decoders end-to-end / synthetic fixtures → Rust decode → reference (±4) (pull_request) Failing after 1m6s
ci: bootstrap rustup in-workflow — the runner image ships no Rust
First real CI run after enabling Actions went 14/19 red. Root cause, run
down rather than guessed: the docker-executor runners (linux, linux-arm64,
windows) use `catthehacker/ubuntu:act-22.04`, which carries node/curl/git
but no Rust — `docker run … which cargo rustc rustup` returns nothing. The
`macos` runner is a *host* executor on the dev box where cargo exists,
which is exactly why the same `cargo-class corpora` job was green on macos
and red on every other arch.

Both Rust-setup styles in the repo assumed a compiler was already present:

  - raw `rustup toolchain install …` (wai-conformance, wai-neural-e2e)
  - `dtolnay/rust-toolchain` (wai-byte-equality, jouleclaw-public-surface,
    joule-code-conformance) — which is *not* a fix here: the action itself
    shells out to `rustup`, so it fails identically on an image without it.
    wai-byte-equality already used dtolnay and failed the same way; that is
    what ruled the action out.

Every Rust job now bootstraps rustup itself, which works on both executor
kinds: on the docker image it installs via rustup-init; on the macOS host
it finds the existing rustup once ~/.cargo/bin is on PATH (launchd's PATH
omits it). Proven in the actual runner image before writing it —
`docker run catthehacker/ubuntu:act-22.04` + rustup-init installed 1.97.1
and compiled a binary clean.

Scope: this fixes the *toolchain* step for all six Rust jobs. Jobs with
further environment needs (wai-neural-e2e pulls a CPU torch + onnxruntime
stack) may surface their own next failure — that is the following layer,
not this one. The PR's own CI run is the verification.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-25 13:23:57 -04:00

63 lines
3 KiB
YAML

name: WAI neural decoders end-to-end
# The float neural decoders (elic / mlicpp / glc / dcvc / snac) cannot make
# WAI's cross-architecture byte-equality promise — their ONNX synthesis is
# float, so the low bits differ by hardware (this is exactly why the
# integer-exact int_synth path exists, and why only it is in the byte-equality
# matrix). What they CAN be is *correct end-to-end* on a real machine: entropy
# decode → ONNX synthesis → image assembly, reproducing a reference within ORT
# float rounding (±4). This job proves that, with no committed model blobs:
# the committed tool builds minimal synthetic CompressAI-compatible models +
# bitstreams, and the Rust decoders reproduce each reference. It runs only when
# the neural decode code or the generator changes — not on every cargo class.
on:
push:
branches: [main]
paths:
- 'wai/wai-rs/src/neural/**'
- 'wai/wai-rs/tests/neural_native_decode.rs'
- 'wai/tools/wai_validate_synthetic.py'
- '.github/workflows/wai-neural-e2e.yml'
pull_request:
paths:
- 'wai/wai-rs/src/neural/**'
- 'wai/wai-rs/tests/neural_native_decode.rs'
- 'wai/tools/wai_validate_synthetic.py'
- '.github/workflows/wai-neural-e2e.yml'
jobs:
neural-e2e:
name: synthetic fixtures → Rust decode → reference (±4)
runs-on: linux
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: ML stack (CPU torch + torchvision + compressai + onnxruntime)
run: |
python -m pip install --upgrade pip
# torch AND torchvision from the CPU index so their compiled ops match
# (compressai imports torchvision; a mismatched build fails at
# `torchvision::nms does not exist`).
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
# `onnx` (the exporter) is separate from `onnxruntime` (the decoder).
pip install compressai onnx onnxruntime numpy pillow
- name: Build the synthetic fixtures (elic / mlicpp / snac / dcvc / glc)
working-directory: wai
run: python tools/wai_validate_synthetic.py --size 256
# Bootstrap rustup: the docker runner image ships no Rust.
- name: Install Rust 1.97.1
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.97.1
rustup toolchain install 1.97.1 --profile minimal
rustup default 1.97.1
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: Each Rust decoder reproduces its reference end-to-end
working-directory: wai/wai-rs
# --no-default-features: the neural decoders need only `ort`, NOT the C
# codec chain (AV1/JXL/opus), so the job needs no system codec deps.
run: cargo test --no-default-features --features neural --test neural_native_decode -- _matches_reference --nocapture