open-standards/scripts/pr-touches-paths-selftest.sh
Transaction Science 946f3beda9
All checks were successful
joule-moq-remote host agent / joule-moq-remote · does this change touch it (pull_request) Successful in 6s
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Successful in 7s
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Successful in 6s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 6s
wai-app and Create / wai-app · does this change touch it (pull_request) Successful in 6s
wai-audit collector and player integration / does this change touch it (pull_request) Successful in 6s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 6s
WAI operation catalogue / does this change touch it (pull_request) Successful in 6s
WAI conformance / does this change touch it (pull_request) Successful in 6s
WAI energy receipts / does this change touch it (pull_request) Successful in 5s
WAI examples / WAI examples · does this change touch them (pull_request) Successful in 6s
wai-fleet service / does this change touch it (pull_request) Successful in 6s
WAI JPEG-AI whole decode (pinned inputs, required) / does this change touch it (pull_request) Successful in 7s
wai-ledger service / does this change touch it (pull_request) Successful in 6s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (pull_request) Successful in 1m25s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 6s
wai-quantum for JavaScript / does this change touch it (pull_request) Successful in 6s
wai-quantum studio and desktop / does this change touch it (pull_request) Successful in 6s
wai-sink-android native sink library / does this change touch it (pull_request) Successful in 6s
wai-sink-swift native sink package / does this change touch it (pull_request) Successful in 6s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (pull_request) Successful in 1m57s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 2m7s
WAI Studio / does this change touch it (pull_request) Successful in 6s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 6s
wai-web wasm32 / does this change touch it (pull_request) Successful in 6s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (pull_request) Successful in 29s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 2m1s
WAI conformance / fast integer kernels, every x86_64 kernel set (AVX-512 silicon) (pull_request) Successful in 2m59s
wai-audit collector and player integration / collector · linux (pull_request) Successful in 1m1s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 26s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 4m19s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 16s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m4s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Successful in 1m15s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 5m15s
joule-moq-room room service / joule-moq-room, every target (pull_request) Successful in 6m19s
wai-fleet service / service · macos (pull_request) Successful in 1m2s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (pull_request) Successful in 2m46s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 1m43s
wai-ledger service / service · macos (pull_request) Successful in 1m24s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 1m2s
WAI operation catalogue / the catalogue and every door · linux (pull_request) Successful in 4m18s
wai-quantum studio and desktop / desktop app · windows (pull_request) Successful in 9m19s
wai-pack / wai-pack · macos (pull_request) Successful in 3m8s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 30s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 7m49s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 3m23s
WAI conformance / faces from keypoints under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m39s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 3m9s
wai-fleet service / service · linux (pull_request) Successful in 2m5s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 3m28s
wai-ledger service / service · linux (pull_request) Successful in 1m43s
wai-pack / wai-pack · linux (pull_request) Successful in 1m55s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 3m0s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 1m10s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 16m12s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 11m32s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 4m51s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 13m12s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 15m2s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 4m3s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 16m34s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m40s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 17m22s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m44s
wai-quantum studio and desktop / desktop app · linux (pull_request) Successful in 5m46s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 34s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 17s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 9m28s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 5m7s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 14m49s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m34s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m16s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 11m4s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 13m6s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m58s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 10m55s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 9m51s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m15s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 9m21s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 30m14s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h4m7s
Changelog entries and the conformance workflow's lists move into files a change adds
Every change to WAI added an entry at the head of wai/CHANGELOG.md, and every new module
appended to the hand-kept lists of .github/workflows/wai-conformance.yml. So any two
branches conflicted on those lines and had to merge one after another. This moves both into
files a change adds.

- Changelog entries: a change adds wai/changes/<yyyy-mm-dd>-<slug>.md holding the entry
  text. scripts/changelog-assemble.py renders the entries into CHANGELOG.md's Unreleased
  section for a release, in a stable order. scripts/check-changelog-fragment.py, run by
  repo-checks on every pull request, fails a pull request that changes wai/ and adds or
  edits no entry file directly in wai/changes/ (a release passes, and so does a commit
  with the trailer line "Changelog: none"). A pull request opened before the check reached
  main passes as it is; one opened after it that adds its entry to the head of Unreleased
  fails and is told where the entry goes. wai breaking reads breaking changes from entry
  files too.
- The conformance workflow: each per-module verifier step is a file in
  .github/wai-conformance/verifiers/, each corpus a file in corpora/, and the
  integer-kernel tests carry a tag line. scripts/wai-conformance-lists.py derives every
  list the workflow kept by hand (WAI_FEATURES, the union --bin and --test lists, the
  features-alone lists, the kernel and corpus steps) from those files when the workflow
  runs. Its `selftest --exact` holds the derived lists to the hand lists of the commit
  before this one, and its dry-run prints every command each job runs: the dry-runs before
  and after this change differ only in the gate's path list, which gains the two paths this
  change adds.
- What stays shared, and how to insert there, is written in wai/CONTRIBUTING.md and
  wai/changes/README.md: wai-rs Cargo.toml features and [[test]] entries, lib.rs, registry
  rows, wai/.gitattributes and the live corpus table take an insert beside the related
  entry, never at the end.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 01:41:29 -05:00

119 lines
6.7 KiB
Shell
Executable file

#!/usr/bin/env bash
# Self-test for pr-touches-paths.py, run by the workflow-hygiene job.
#
# A gate that decides whether tests run is itself load-bearing: a wrong `false`
# silently skips a whole workflow. These cases pin both directions and, most
# importantly, that every way of failing fails OPEN.
set -euo pipefail
cd "$(dirname "$0")/.."
G=scripts/pr-touches-paths.py
tmp=$(mktemp -d); trap 'rm -rf "$tmp"' EXIT
fail=0
check() { # name expected actual
if [ "$2" = "$3" ]; then printf ' ok %s\n' "$1"
else printf ' FAIL %s: expected %s, got %s\n' "$1" "$2" "$3"; fail=1; fi
}
# A throwaway repo, so the diffs are real git diffs and not a mock.
repo="$tmp/r"; mkdir -p "$repo/wai/wai-pack" "$repo/jcp"
git -C "$repo" init -q
git -C "$repo" config user.email t@e; git -C "$repo" config user.name t
echo x > "$repo/jcp/SPEC.md"; echo y > "$repo/wai/wai-pack/lib.rs"
git -C "$repo" add -A; git -C "$repo" commit -qm base
BASE=$(git -C "$repo" rev-parse HEAD)
echo changed > "$repo/jcp/SPEC.md"
git -C "$repo" add -A; git -C "$repo" commit -qm jcp-only
JCP=$(git -C "$repo" rev-parse HEAD)
echo changed > "$repo/wai/wai-pack/lib.rs"
git -C "$repo" add -A; git -C "$repo" commit -qm wai-too
WAI=$(git -C "$repo" rev-parse HEAD)
wf="$tmp/w.yml"
cat > "$wf" <<'Y'
on:
pull_request:
paths:
- 'wai/wai-pack/**'
Y
run() { ( cd "$repo" && python3 "$OLDPWD/$G" "$1" "$2" "$3" ); }
check "a jcp-only diff does not touch a wai filter" false "$(run "$wf" "$BASE" "$JCP")"
check "a diff that touches the filter runs" true "$(run "$wf" "$BASE" "$WAI")"
# Every failure mode must fail OPEN.
check "a missing workflow file" true "$(run "$tmp/nope.yml" "$BASE" "$JCP")"
check "a workflow with no filter" true "$(printf 'on:\n pull_request:\n' > "$tmp/nofilter.yml"; run "$tmp/nofilter.yml" "$BASE" "$JCP")"
check "an empty base sha" true "$(run "$wf" "" "$JCP")"
check "a sha git cannot resolve" true "$(run "$wf" "$BASE" deadbeefdeadbeefdeadbeefdeadbeefdeadbeef)"
check "too few arguments" true "$( cd "$repo" && python3 "$OLDPWD/$G" "$wf" )"
check "an empty diff" true "$(run "$wf" "$JCP" "$JCP")"
# `**` spans separators; `*` does not.
cat > "$tmp/star.yml" <<'Y'
on:
pull_request:
paths:
- 'jcp/*.md'
Y
# Only the NESTED file changes, so `jcp/*.md` must not match it. (A top-level
# .md in the same commit would match legitimately and prove nothing — which is
# how this case failed the first time it was written.)
mkdir -p "$repo/jcp/sub"; echo z > "$repo/jcp/sub/x.md"
git -C "$repo" add -A >/dev/null; git -C "$repo" commit -qm sub >/dev/null
SUB=$(git -C "$repo" rev-parse HEAD)
check "a single star does not span a separator" false "$(run "$tmp/star.yml" "$WAI" "$SUB")"
# And it does match a file at that level, so the glob is not simply never matching.
echo z > "$repo/jcp/top.md"
git -C "$repo" add -A >/dev/null; git -C "$repo" commit -qm top >/dev/null
check "a single star matches at its own level" true "$(run "$tmp/star.yml" "$SUB" "$(git -C "$repo" rev-parse HEAD)")"
# A comment or a blank line inside a list does not end it, and a trailing comment is not
# part of a glob. (Lists with a comment used to be read only up to it, so a pull request
# touching a path after the comment was answered `false` and its tests skipped.)
cat > "$tmp/commented.yml" <<'Y'
on:
pull_request:
paths:
- 'jcp/nothing-here/**'
# a comment between entries
- 'wai/wai-pack/**' # and one after an entry
Y
check "a path listed after a comment and a blank line" true "$(run "$tmp/commented.yml" "$BASE" "$WAI")"
check "and the list still says false for a diff outside it" false "$(run "$tmp/commented.yml" "$BASE" "$JCP")"
# --paths-from and --wide: the files of a directory bring their own paths, and the wide glob
# the forge filters on stands for them alone. A step's file (`# paths:` in its header) names
# one extension text; a change to it runs the workflow, and a change to an extension text no
# file names does not, though the forge's wide glob matches both.
mkdir -p "$repo/wai/extensions" "$repo/steps"
echo a > "$repo/wai/extensions/owned.md"; echo b > "$repo/wai/extensions/other.md"
printf '# step: one\n# order: 10\n# paths: wai/extensions/owned.md\n#\n# prose: not a header\necho ok\n' > "$repo/steps/one.sh"
printf '# step: two\n# paths: wai/extensions/second/**\necho ok\n# paths: wai/extensions/other.md\n' > "$repo/steps/two.sh"
git -C "$repo" add -A >/dev/null; git -C "$repo" commit -qm steps >/dev/null
S0=$(git -C "$repo" rev-parse HEAD)
echo changed > "$repo/wai/extensions/owned.md"; git -C "$repo" commit -qam owned >/dev/null; OWN=$(git -C "$repo" rev-parse HEAD)
echo changed > "$repo/wai/extensions/other.md"; git -C "$repo" commit -qam other >/dev/null; OTH=$(git -C "$repo" rev-parse HEAD)
mkdir -p "$repo/wai/extensions/second"; echo c > "$repo/wai/extensions/second/x.md"
git -C "$repo" add -A >/dev/null; git -C "$repo" commit -qm second >/dev/null; SEC=$(git -C "$repo" rev-parse HEAD)
cat > "$tmp/wide.yml" <<'Y'
on:
pull_request:
paths:
- 'wai/wai-pack/**'
- 'wai/extensions/**'
Y
wide() { ( cd "$repo" && python3 "$OLDPWD/$G" "$tmp/wide.yml" "$1" "$2" --paths-from steps --wide 'wai/extensions/**' ); }
check "a path a step's file names runs the workflow" true "$(wide "$S0" "$OWN")"
check "an extension text no file names does not, under the wide glob" false "$(wide "$OWN" "$OTH")"
check "a glob a file names matches below it" true "$(wide "$OTH" "$SEC")"
check "the workflow's own globs still count" true "$(wide "$BASE" "$WAI")"
check "without the flags the wide glob matches everything under it" true "$( cd "$repo" && python3 "$OLDPWD/$G" "$tmp/wide.yml" "$OWN" "$OTH" )"
check "a header line after the header is not read" false "$(printf '# step: two\necho ok\n# paths: wai/extensions/other.md\n' > "$repo/steps/two.sh"; wide "$OWN" "$OTH")"
# Every way of misreading them fails OPEN.
check "a --paths-from directory that does not exist" true "$( cd "$repo" && python3 "$OLDPWD/$G" "$tmp/wide.yml" "$OWN" "$OTH" --paths-from nowhere --wide 'wai/extensions/**' )"
check "a --wide glob the workflow does not list" true "$( cd "$repo" && python3 "$OLDPWD/$G" "$tmp/wide.yml" "$OWN" "$OTH" --paths-from steps --wide 'wai/nothing/**' )"
check "a --wide glob with no --paths-from" true "$( cd "$repo" && python3 "$OLDPWD/$G" "$tmp/wide.yml" "$OWN" "$OTH" --wide 'wai/extensions/**' )"
check "an argument the script does not read" true "$( cd "$repo" && python3 "$OLDPWD/$G" "$tmp/wide.yml" "$OWN" "$OTH" --what x )"
[ "$fail" = 0 ] && echo "pr-touches-paths self-test: all cases pass" || { echo "pr-touches-paths self-test FAILED"; exit 1; }