Some checks failed
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 2m20s
standards workspaces build + test / aac-rs (pull_request) Successful in 1m44s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 46s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 35s
standards workspaces build + test / map-rs (pull_request) Successful in 29s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 6m9s
standards workspaces build + test / mesh-rs (pull_request) Successful in 28s
standards workspaces build + test / openpay (pull_request) Successful in 1m25s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Successful in 22s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 8m2s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 28s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 6m24s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 30s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 2m0s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 12m30s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 29s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m38s
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Successful in 1m57s
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 4s
no-vanity-metrics / WAI public text names no comparison (pull_request) Successful in 4s
no-vanity-metrics / WAI public text names no company or product (pull_request) Successful in 4s
standards workspaces build + test / arl-rs (pull_request) Successful in 1m20s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m51s
standards workspaces build + test / eoc-rs (pull_request) Successful in 2m12s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 1m9s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 1m12s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m17s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m15s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m23s
wai cross-architecture byte-equality / linux-x86_64 (pull_request) Successful in 28s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 4m14s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Failing after 1m22s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 16s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 8m41s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 10s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 28s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 50s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 1m56s
WAI HTTP delivery / WAI HTTP · does this change touch it (pull_request) Successful in 5s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m8s
WAI neural decoders end-to-end / synthetic fixtures → Rust decode → reference (±4) (pull_request) Successful in 1m14s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m12s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 5s
WAI section references / cited sections exist (pull_request) Successful in 11s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 4m39s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 16m42s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m10s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m22s
wai-pack / wai-pack · macos (pull_request) Successful in 2m24s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 35m55s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 36m25s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 4m34s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m18s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 4m34s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 4s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m19s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m13s
wai-pack / wai-pack · linux (pull_request) Successful in 1m8s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 1m47s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 20s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m14s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m30s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 37m25s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m6s
The record leg holds the package of record (reach/record/, built from the commit reach/manifest.json names) to the demo verify scripts. It ran this tree's scripts, so a check added after the record's commit was run against code that predates it: #201's verify_pack test of the writers' manifest limit failed on every rung of the record leg (jobs 21114, 21188), because the recorded wai_web_bg.wasm was built before the writers refused a manifest past 2^27. run-modern.mjs takes --demo-commit <commit>: step 3 then runs that commit's demo scripts over that commit's corpora (its wai/, exported with git archive). A script this tree runs that the commit lacks is reported as SKIP, not as a pass; a commit with none of them fails the run, as does an empty or unknown commit. The record leg fetches input.commit (the checkout is shallow) and passes it. The tree leg is unchanged: this tree's scripts against this tree's build, where the new verify_pack check runs and passes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
234 lines
13 KiB
YAML
234 lines
13 KiB
YAML
name: wai-web reach builds
|
|
|
|
# The reach builds of wai-web (wai/wai-web/reach/): the shipped build, L1 (legalised at
|
|
# the JS interface), L2 (MVP-lowered and legalised) and J (the wasm2js translation),
|
|
# each run on an engine line it serves and compared with the shipped build output for
|
|
# output.
|
|
#
|
|
# On the linux runner, after a gate that reads the pull request's own diff, one leg per
|
|
# package:
|
|
#
|
|
# record the package of record (reach/record/: the two files the site serves under
|
|
# /wai/pkg/, built from the commit reach/manifest.json names). Both files must
|
|
# have the manifest's SHA-256, and build.sh runs with WAI_REACH_REQUIRE_RECORD=1,
|
|
# so every output must have the manifest's SHA-256 and size: the bytes the site
|
|
# serves under /wai/pkg/reach/. The package is kept, not rebuilt here: the same
|
|
# commit and recipe give different wasm on a Linux x86_64 host than on the
|
|
# macOS arm64 host that built it (the glue is the same).
|
|
# tree wai-web built from this tree, so a change to wai-web meets the reach builds
|
|
# before the package of record moves to it.
|
|
#
|
|
# Each leg then:
|
|
#
|
|
# 1. derives every reach build with reach/build.sh (pinned binaryen and JS tools; J's
|
|
# wasm2js is binaryen's WebAssembly build, the same on every host), which checks that
|
|
# the translation and the glue parse as ECMAScript 5 and writes each output's SHA-256
|
|
# to a manifest;
|
|
# 2. on current Node (reach/test/run-modern.mjs): the loader must choose the shipped
|
|
# build; every rung and profile, forced, must give the shipped build's outputs over
|
|
# the corpora; an engine stripped to ES5 must be given J and the same outputs; and
|
|
# the demo verify scripts must pass against shipped, L1, L2 and J. On the record leg
|
|
# those scripts, and the corpora they read, are the record's commit's
|
|
# (--demo-commit): the package is held to the checks of the code it was built from,
|
|
# and a check added since meets that code on the tree leg;
|
|
# 3. on older engine lines, each in its own Node image (reach/test/conformance.js,
|
|
# which is ECMAScript 5): the loader must choose the rung that line needs, by
|
|
# feature probes alone, and every workload must equal the shipped build's output
|
|
# from step 2:
|
|
# node:0.12 no WebAssembly -> J
|
|
# node:8.0.0 WebAssembly without the RegExp dotAll flag -> J (full), L2 (receipt)
|
|
# node:8 MVP WebAssembly, no BigInt -> L2
|
|
# node:10 MVP WebAssembly, BigInt -> L2
|
|
# node:12 post-MVP features, no BigInt at the boundary -> L1
|
|
# node:14 post-MVP features, no BigInt at the boundary -> L1
|
|
# These are proxies: engine lines that real devices also ship (the README says
|
|
# which device classes each stands for). No real old device runs here.
|
|
#
|
|
# The images run as `docker://` steps: each mounts this job's workspace, so the build
|
|
# and the reference of steps 1-2 are read where they were written. They run no
|
|
# JavaScript action, since their Node is too old to.
|
|
#
|
|
# Push filters match the push's delta, so every path a step reads is listed.
|
|
|
|
# One run per branch at a time. A push supersedes the run before it; on main a newer
|
|
# merge's tree contains the older one's.
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'wai/wai-web/**'
|
|
- 'wai/wai-rs/**'
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/neural-conformance/**'
|
|
- 'wai/staged-conformance/**'
|
|
- 'wai/staged-measure-conformance/**'
|
|
- 'wai/registry/**'
|
|
- '.github/workflows/wai-web-reach.yml'
|
|
pull_request:
|
|
paths:
|
|
- 'wai/wai-web/**'
|
|
- 'wai/wai-rs/**'
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/neural-conformance/**'
|
|
- 'wai/staged-conformance/**'
|
|
- 'wai/staged-measure-conformance/**'
|
|
- 'wai/registry/**'
|
|
- '.github/workflows/wai-web-reach.yml'
|
|
|
|
env:
|
|
REACH: wai/wai-web/reach
|
|
|
|
jobs:
|
|
# Forgejo matches `paths:` against the push delta, so a rebase fires this workflow
|
|
# whatever the pull request changes. This job reads the pull request's own diff
|
|
# against the paths above (scripts/pr-touches-paths.py, which fails open) and the
|
|
# build runs only when it touches them. On a push to main it answers `true`.
|
|
relevant:
|
|
name: wai-web reach · does this change touch it
|
|
runs-on: linux
|
|
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-web-reach.yml \
|
|
"${{ github.event.pull_request.base.sha }}" \
|
|
"${{ github.event.pull_request.head.sha }}")
|
|
echo "this change touches the reach builds: $r"
|
|
echo "run=$r" >> "$GITHUB_OUTPUT"
|
|
|
|
reach:
|
|
name: wai-web reach builds · ${{ matrix.name }}
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
runs-on: linux
|
|
timeout-minutes: 90
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- leg: record
|
|
name: the package of record, every output as recorded
|
|
- leg: tree
|
|
name: this tree's wai-web, every rung on its engine line
|
|
env:
|
|
DIST: wai/wai-web/reach/ci-dist-${{ matrix.leg }}
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
# The docker runner image ships no Rust.
|
|
- name: Install Rust 1.98.0 with the wasm32 target
|
|
if: matrix.leg == 'tree'
|
|
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 wasm32-unknown-unknown --toolchain 1.98.0
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
# Pinned to the wasm-bindgen version in wai-web/Cargo.lock: the CLI and the crate
|
|
# must match exactly.
|
|
- name: wasm-bindgen CLI 0.2.127
|
|
if: matrix.leg == 'tree'
|
|
shell: bash
|
|
run: cargo install --locked wasm-bindgen-cli --version 0.2.127
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '26'
|
|
# The site's package is wasm-pack's web target with wasm-opt off
|
|
# ([package.metadata.wasm-pack.profile.release]): cargo, then wasm-bindgen. It goes
|
|
# outside the tree, where no package.json decides how Node reads the glue.
|
|
- name: Build wai-web for wasm32 from this tree (web target)
|
|
if: matrix.leg == 'tree'
|
|
shell: bash
|
|
working-directory: wai/wai-web
|
|
run: |
|
|
set -euo pipefail
|
|
cargo build --locked --release --target wasm32-unknown-unknown
|
|
wasm-bindgen --target web --out-dir "$RUNNER_TEMP/pkg" --out-name wai_web \
|
|
target/wasm32-unknown-unknown/release/wai_web.wasm
|
|
# The package of record leaves the tree for the same reason, after its check.
|
|
- name: The package of record (reach/record/), held to the manifest
|
|
if: matrix.leg == 'record'
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
node -e '
|
|
const fs = require("fs"), path = require("path"), crypto = require("crypto");
|
|
const [man, pkg] = process.argv.slice(1);
|
|
const m = JSON.parse(fs.readFileSync(man, "utf8"));
|
|
console.log(`the package of record: ${m.input.source}`);
|
|
let bad = 0;
|
|
for (const [n, e] of Object.entries(m.input.files)) {
|
|
const b = fs.readFileSync(path.join(pkg, n));
|
|
const got = crypto.createHash("sha256").update(b).digest("hex");
|
|
console.log(`${got} ${n} (${b.length} B); the manifest records ${e.sha256} (${e.bytes} B)`);
|
|
if (got !== e.sha256 || b.length !== e.bytes) bad++;
|
|
}
|
|
if (bad) { console.error(`reach: reach/record/ is not the package the manifest names (${bad} file(s) differ)`); process.exit(1); }' \
|
|
"$REACH/manifest.json" "$REACH/record"
|
|
mkdir -p "$RUNNER_TEMP/pkg"
|
|
cp "$REACH/record/wai_web_bg.wasm" "$REACH/record/wai_web.js" "$RUNNER_TEMP/pkg/"
|
|
# The commit the package was built from (input.commit): its demo verify scripts
|
|
# are the ones run-modern.mjs runs on this leg. The checkout is shallow.
|
|
c=$(node -p 'JSON.parse(require("fs").readFileSync(process.argv[1], "utf8")).input.commit' "$REACH/manifest.json")
|
|
git fetch --no-tags --depth=1 origin "$c"
|
|
echo "RECORD_COMMIT=$c" >> "$GITHUB_ENV"
|
|
# The build and the reference stay in the workspace: the engine images below
|
|
# mount it, and nothing else.
|
|
- name: Reach builds (reach/build.sh, pinned binaryen and JS tools)
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
if [ "${{ matrix.leg }}" = record ]; then export WAI_REACH_REQUIRE_RECORD=1; fi
|
|
WAI_REACH_TOOLS="$RUNNER_TEMP/reach-tools" bash "$REACH/build.sh" "$RUNNER_TEMP/pkg" "$DIST"
|
|
cat "$DIST/manifest.json"
|
|
# The demo verify scripts: on the record leg, the record's commit's, over that
|
|
# commit's corpora; on the tree leg, this tree's.
|
|
- name: Current Node — every rung forced, the demo verify scripts on every full build
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
set --
|
|
if [ "${{ matrix.leg }}" = record ]; then set -- --demo-commit "$RECORD_COMMIT"; fi
|
|
node "$REACH/test/run-modern.mjs" --dist "$DIST" --shipped "$RUNNER_TEMP/pkg" --out "$REACH/ci-modern-${{ matrix.leg }}" "$@"
|
|
|
|
- name: node:0.12 (no WebAssembly) — J chosen and equal to the shipped build
|
|
uses: docker://node:0.12
|
|
with:
|
|
entrypoint: /bin/sh
|
|
args: -c "set -e; node --version; for p in full verify_decode verify receipt; do node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --profile $p --expect-rung J --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json; done"
|
|
- name: node:8.0.0 (WebAssembly, no RegExp dotAll) — J for the full build, the L2 receipt build
|
|
uses: docker://node:8.0.0
|
|
with:
|
|
entrypoint: /bin/sh
|
|
args: -c "set -e; node --version; node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --profile full --expect-rung J --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json; node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --profile receipt --expect-rung L2 --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json"
|
|
- name: node:8 (MVP WebAssembly, no BigInt) — L2 chosen and equal to the shipped build
|
|
uses: docker://node:8
|
|
with:
|
|
entrypoint: /bin/sh
|
|
args: -c "set -e; node --version; for p in full verify_decode verify receipt; do node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --profile $p --expect-rung L2 --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json; done; node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --rung J --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json"
|
|
- name: node:10 (MVP WebAssembly, BigInt) — L2 chosen and equal to the shipped build
|
|
uses: docker://node:10
|
|
with:
|
|
entrypoint: /bin/sh
|
|
args: -c "set -e; node --version; node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --profile full --expect-rung L2 --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json"
|
|
- name: node:12 (post-MVP WebAssembly, no BigInt at the boundary) — L1 chosen and equal to the shipped build
|
|
uses: docker://node:12
|
|
with:
|
|
entrypoint: /bin/sh
|
|
args: -c "set -e; node --version; node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --profile full --expect-rung L1 --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json; node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --rung L2 --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json"
|
|
- name: node:14 (post-MVP WebAssembly, no BigInt at the boundary) — L1 chosen and equal to the shipped build
|
|
uses: docker://node:14
|
|
with:
|
|
entrypoint: /bin/sh
|
|
args: -c "set -e; node --version; node wai/wai-web/reach/test/conformance.js --dist wai/wai-web/reach/ci-dist-${{ matrix.leg }} --wai wai --profile full --expect-rung L1 --reference wai/wai-web/reach/ci-modern-${{ matrix.leg }}/reference.json"
|