All checks were successful
wai-app and Create / wai-app · does this change touch it (push) Successful in 12s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 41s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 47s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 34s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 19s
wai-audit collector and player integration / does this change touch it (push) Successful in 25s
wai-fleet service / does this change touch it (push) Successful in 16s
wai-quantum for JavaScript / does this change touch it (push) Successful in 19s
WAI operation catalogue / does this change touch it (push) Successful in 26s
wai-key-proxy / does this change touch it (push) Successful in 43s
wai-quantum energy-landscape jobs / does this change touch it (push) Successful in 15s
wai-quantum studio and desktop / does this change touch it (push) Successful in 29s
wai-ledger service / does this change touch it (push) Successful in 29s
wai-sink-android native sink library / does this change touch it (push) Successful in 32s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 1m0s
WAI Studio / does this change touch it (push) Successful in 18s
wai-sink-swift native sink package / does this change touch it (push) Successful in 1m11s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 1m41s
wai-audit collector and player integration / collector · linux (push) Successful in 2m9s
wai-key-proxy / proxy · linux (push) Successful in 2m2s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 3m45s
wai-quantum for JavaScript / javascript · linux (push) Successful in 5m1s
wai-fleet service / service · linux (push) Successful in 4m15s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 6m41s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Successful in 7m22s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Successful in 4m18s
wai-ledger service / service · linux (push) Successful in 3m55s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m29s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 6m10s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 7m48s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 47s
wai-quantum energy-landscape jobs / reader, kernels, answers and the stated result · linux, release (push) Successful in 8m31s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 1m56s
wai-quantum studio and desktop / studio · browser (push) Successful in 6m44s
wai-quantum energy-landscape jobs / native against WebAssembly, over many seeds (push) Successful in 8m14s
wai-fleet service / service · macos (push) Successful in 1m1s
WAI operation catalogue / the catalogue and every door · linux (push) Successful in 10m58s
wai-ledger service / service · macos (push) Successful in 1m1s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 8m9s
wai-quantum energy-landscape jobs / the same bits · linux-arm64 (push) Successful in 13m54s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 3m39s
wai-quantum energy-landscape jobs / the module under wasm32-wasip2 (wasmtime) (push) Successful in 14m4s
wai-quantum energy-landscape jobs / the same bits · macos (push) Successful in 7m31s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 7m59s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 8m53s
WAI Studio / Studio in WebKit · linux (push) Successful in 16m57s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Successful in 17m59s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Successful in 11m32s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 10m30s
What a deployment is (wai/extensions/deployment.md §3): dist/ as wai build
writes it, its build record and every file the record lists, named by the
SHA-256 of the record's bytes. A client before it sends a tree, and a target
before it holds one, hold the record to §3.3 and each file to its SHA-256 and
size.
The deployment API (§4, wai/extensions/deployment.openapi.json), which names
no host: GET /v1/deployments, PUT /v1/deployments/files/{sha256},
POST /v1/deployments, POST /v1/deployments/promote and
POST /v1/deployments/rollback, twelve refusal codes, and for each list,
create, promotion and rollback a wai.deployment-receipt/1 signed by the
target's Ed25519 key over its RFC 8785 form (§5): the operation, the
request's nonce, the target's count of changes, the deployment named, the
live deployment after and before, and the digest of what it holds.
wai::deployment (feature ed25519) reads records and signs and verifies
receipts for both sides.
The reference target is wai_deploy_target, a small service of its own in
wai-rs (feature quickstart), not a /_wai/deploy surface of wai dev: wai dev
cannot start without the relay and room service of other crates, and its
/_wai/ routes keep Studio's rules for a page. A target that serves nothing
else is tested alone, in this repository's CI. It keeps files by SHA-256,
written whole, its state written whole in place of the one before and held
to every record and file again on start, and serves the live deployment.
wai deploy (deployment.create), wai deployment list, promote <digest> and
rollback: placed client, preview, in a build with quickstart. wai deploy
builds, or with --prebuilt takes dist/ as it is, holds the tree to its
record before anything is sent, sends only what the target lacks, and with
--promote makes it live. Each takes --target, waits for --yes before it
builds, writes or sends anything, sends nothing with --dry-run, verifies
every receipt and holds it to its request, and keeps the receipts of each
change in .wai/deployments/<target>/ with its own operation receipt naming
them. wai --help's start list gains deploy, before verify. ops.json and
Studio's actions are regenerated (each operation bound to the command line);
mcp.json is unchanged, as no deployment operation is an MCP tool.
tests/cli_deploy.rs, in wai-catalogue.yml, runs the four against the
reference target and plants the faults the text refuses, each refused beside
a control that is not: a file of dist/ changed, added and removed after the
build; bytes put under another SHA-256; a record not in its canonical form;
a promotion of a digest the target does not hold, and of a file's SHA-256;
a rollback with none before; a replayed answer, an edited receipt, a list
that is not its receipt's state; and a kept receipt changed, refused by wai
verify. A rollback makes live exactly the deployment live before (history of
three); --dry-run leaves the target as it was, byte for byte; the OpenAPI
document's routes, operations, codes and receipt members are the
implementation's. tests/cli_ops.rs gains the three --dry-run samples.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
218 lines
12 KiB
YAML
218 lines
12 KiB
YAML
name: WAI operation catalogue
|
|
|
|
# WAI's toolchain has one catalogue of operations, `noun.verb` (wai/wai-rs/src/catalogue.rs),
|
|
# and every door names them by it. This workflow fails on drift:
|
|
#
|
|
# - the export, wai/catalogue/ops.json, is the table (`wai ops export --check`);
|
|
# - the table keeps its naming rules (the library's catalogue tests);
|
|
# - the command line reaches operations through the catalogue alone, and every operation
|
|
# keeps the agent rules: its help, the exit codes, the JSON envelope, --dry-run on every
|
|
# operation that is not read-only, --yes (tests/cli_ops.rs, and the binary's own tests);
|
|
# - the other doors name operations as the catalogue does: MCP tool names, the services'
|
|
# OpenAPI operationIds, the C header, and the Swift and Kotlin sinks
|
|
# (scripts/check-wai-ops-doors.py, with its selftest).
|
|
#
|
|
# Push filters match the push's delta, so every path a door or a test reads is listed.
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'wai/wai-rs/**'
|
|
- 'wai/catalogue/**'
|
|
- 'wai/examples/**'
|
|
# The project file's reader (dx/project.rs, in the binary's tests) holds wai.json's schema to it.
|
|
- 'wai/schema/**'
|
|
- 'wai/http-conformance/**'
|
|
- 'wai/score-conformance/**'
|
|
- 'wai/live-conformance/fleet/**'
|
|
# tests/cli_ops.rs builds the revenue share's --dry-run sample from this corpus.
|
|
- 'wai/live-conformance/share/**'
|
|
- 'wai/live-conformance/channels/**'
|
|
# tests/cli_key.rs signs a conformance record against this corpus and an upscale with this prior.
|
|
- 'wai/jwp-conformance/**'
|
|
# Read by tests/cli_folds.rs: the corpora each fold is held to.
|
|
- 'wai/telemetry-conformance/**'
|
|
- 'wai/claim-conformance/**'
|
|
- 'wai/live-conformance/rooms/**'
|
|
- 'wai/live-conformance/audit/**'
|
|
- 'wai/live-conformance/upscale/**'
|
|
# tests/cli_toolchain.rs holds wai --version and the deprecations to these, and searches the text.
|
|
- 'wai/CHANGELOG.md'
|
|
- 'wai/VERSIONING.md'
|
|
- 'wai/DEPRECATIONS.md'
|
|
- 'wai/SPEC.md'
|
|
- 'wai/registry/**'
|
|
- 'wai/REGISTRY.md'
|
|
- 'wai/LICENSE'
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/wai-ops/**'
|
|
- 'wai/wai-app/**'
|
|
- 'wai/wai-sink-swift/**'
|
|
- 'wai/wai-sink-android/**'
|
|
- 'joule-code/joule-code-rs/crates/*/openapi.json'
|
|
# tests/cli_deploy.rs holds the deployment API's OpenAPI document and its text to the
|
|
# reference target and to wai deploy.
|
|
- 'wai/extensions/deployment.md'
|
|
- 'wai/extensions/deployment.openapi.json'
|
|
- 'scripts/check-wai-ops-doors.py'
|
|
- 'scripts/check-wai-ops-doors-selftest.sh'
|
|
- 'rust-toolchain.toml'
|
|
- '.github/workflows/wai-catalogue.yml'
|
|
pull_request:
|
|
paths:
|
|
- 'wai/wai-rs/**'
|
|
- 'wai/catalogue/**'
|
|
- 'wai/examples/**'
|
|
# The project file's reader (dx/project.rs, in the binary's tests) holds wai.json's schema to it.
|
|
- 'wai/schema/**'
|
|
- 'wai/http-conformance/**'
|
|
- 'wai/score-conformance/**'
|
|
- 'wai/live-conformance/fleet/**'
|
|
# tests/cli_ops.rs builds the revenue share's --dry-run sample from this corpus.
|
|
- 'wai/live-conformance/share/**'
|
|
- 'wai/live-conformance/channels/**'
|
|
# tests/cli_key.rs signs a conformance record against this corpus and an upscale with this prior.
|
|
- 'wai/jwp-conformance/**'
|
|
# Read by tests/cli_folds.rs: the corpora each fold is held to.
|
|
- 'wai/telemetry-conformance/**'
|
|
- 'wai/claim-conformance/**'
|
|
- 'wai/live-conformance/rooms/**'
|
|
- 'wai/live-conformance/audit/**'
|
|
- 'wai/live-conformance/upscale/**'
|
|
# tests/cli_toolchain.rs holds wai --version and the deprecations to these, and searches the text.
|
|
- 'wai/CHANGELOG.md'
|
|
- 'wai/VERSIONING.md'
|
|
- 'wai/DEPRECATIONS.md'
|
|
- 'wai/SPEC.md'
|
|
- 'wai/registry/**'
|
|
- 'wai/REGISTRY.md'
|
|
- 'wai/LICENSE'
|
|
- 'wai/wai-quantum/**'
|
|
- 'wai/wai-ops/**'
|
|
- 'wai/wai-app/**'
|
|
- 'wai/wai-sink-swift/**'
|
|
- 'wai/wai-sink-android/**'
|
|
- 'joule-code/joule-code-rs/crates/*/openapi.json'
|
|
# tests/cli_deploy.rs holds the deployment API's OpenAPI document and its text to the
|
|
# reference target and to wai deploy.
|
|
- 'wai/extensions/deployment.md'
|
|
- 'wai/extensions/deployment.openapi.json'
|
|
- 'scripts/check-wai-ops-doors.py'
|
|
- 'scripts/check-wai-ops-doors-selftest.sh'
|
|
- 'rust-toolchain.toml'
|
|
- '.github/workflows/wai-catalogue.yml'
|
|
|
|
jobs:
|
|
# The path filters gate the trigger; this job gates the work from the pull request's own
|
|
# diff (scripts/pr-touches-paths.py, reading the list above), as wai-pack.yml explains.
|
|
relevant:
|
|
name: does this change touch it
|
|
runs-on: gate
|
|
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-catalogue.yml \
|
|
"${{ github.event.pull_request.base.sha }}" \
|
|
"${{ github.event.pull_request.head.sha }}")
|
|
echo "this change touches the operation catalogue: $r"
|
|
echo "run=$r" >> "$GITHUB_OUTPUT"
|
|
|
|
catalogue:
|
|
name: the catalogue and every door · linux
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
runs-on: linux
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- name: Install Rust 1.99.1
|
|
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.99.1
|
|
rustup toolchain install 1.99.1 --profile minimal
|
|
rustup default 1.99.1
|
|
SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo"
|
|
command -v python3 >/dev/null || { $SUDO apt-get update -qq; $SUDO apt-get install -y -qq python3; }
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
# The export other tools and this workflow's door check read is the table, byte for
|
|
# byte; the message says how to regenerate it.
|
|
- name: The catalogue's export is up to date
|
|
working-directory: wai/wai-rs
|
|
run: cargo run -q --locked --no-default-features --bin wai -- ops export --check ../catalogue/ops.json
|
|
- name: Every door names its operations as the catalogue does
|
|
shell: bash
|
|
run: |
|
|
set -euo pipefail
|
|
bash scripts/check-wai-ops-doors-selftest.sh
|
|
python3 -I scripts/check-wai-ops-doors.py
|
|
# The library's catalogue tests: the naming rules, each broken in a copy of the table
|
|
# and refused. The binary's own tests: every implementation names an operation of the
|
|
# catalogue and every operation with a command line has one; help is the catalogue's.
|
|
# tests/cli_ops.rs: wai ops, help, the exit codes, the envelope, --dry-run and --yes (and
|
|
# --confirm, its deprecated spelling),
|
|
# first in the archive's build (quickstart), then with the feature full (wai-rs/Cargo.toml:
|
|
# every feature an operation of the catalogue needs, none that needs a system library, which
|
|
# the library's catalogue tests hold to the table), so --dry-run is held on generate, score,
|
|
# stage, the development room's doors and prior fetch too, and a full build holds every
|
|
# operation (cli_ops' a_full_build_holds_every_operation), with
|
|
# Create's (app), so it is held on wai app export, with the revenue share's
|
|
# (revenue_share), so it is held on wai contract create|accept and wai statement create, and
|
|
# with the opportunity report's (opportunity_report), so it is held on wai opportunity
|
|
# create and wai statement check. tests/cli_key.rs: wai key, its keystore, and --key <name> on
|
|
# the operations that sign, first in the archive's build, then with the features whose
|
|
# operations read --key apart (the revenue share, the exact derivations) and with
|
|
# key_discovery, whose wai-keys reads what wai key exports. tests/cli_toolchain.rs: wai --version
|
|
# and the one version it names, wai docs search and wai registry show, the deprecation notice,
|
|
# and wai/DEPRECATIONS.md held to the catalogue. tests/cli_target.rs: wai target, wai auth,
|
|
# --target on the fleet's operations and on every operation of a service's API, and wai mcp
|
|
# --target, against a stand-in service: a key never written, printed or logged, a read-only
|
|
# target refusing every change, an unknown target exit 5. tests/cli_folds.rs: each fold against
|
|
# the tool it folds, on the same input: wai cmcd and wai_telemetry over the whole corpus, wai
|
|
# receipt create and the receipt wai wrap leaves, wai verify on every record kind of the claim,
|
|
# JWP, room and audit corpora and a sealed playlist (with video_manifest), a file of no kind
|
|
# refused; and wai audit|serve|quantum against stand-ins that record what they were given, a
|
|
# verb the quantum toolset does not list never reaching wai-quantum. tests/cli_deploy.rs: wai
|
|
# deploy and wai deployment list|promote|rollback against the reference deployment target
|
|
# (wai_deploy_target), each target a process on a port it picked: a project deployed,
|
|
# promoted, rolled back and served; planted faults each refused (a file of dist/ changed after
|
|
# its build, bytes put under another SHA-256, a promotion of a digest the target does not hold,
|
|
# a rollback with none before, a receipt answering another request or edited, a kept receipt
|
|
# changed); a rollback making live exactly the one before; --dry-run leaving the target as it
|
|
# was; and the OpenAPI document held to the implementation.
|
|
- name: The catalogue's rules, and the command line through it
|
|
shell: bash
|
|
working-directory: wai/wai-rs
|
|
run: |
|
|
set -euo pipefail
|
|
ran() { grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed' "$1" || { echo "::error::no test ran in $1"; exit 1; }; }
|
|
cargo test --locked --no-default-features --lib catalogue 2>&1 | tee "$RUNNER_TEMP/lib.log"
|
|
ran "$RUNNER_TEMP/lib.log"
|
|
cargo test --locked --no-default-features --features quickstart --bin wai --test cli_ops --test cli_key --test cli_toolchain --test cli_target --test cli_deploy 2>&1 | tee "$RUNNER_TEMP/cli.log"
|
|
ran "$RUNNER_TEMP/cli.log"
|
|
cargo test --locked --no-default-features --features quickstart,key_discovery,revenue_share,exact_upscale,exact_tonemap --test cli_key 2>&1 | tee "$RUNNER_TEMP/cli-key.log"
|
|
ran "$RUNNER_TEMP/cli-key.log"
|
|
cargo test --locked --no-default-features --features full --test cli_ops 2>&1 | tee "$RUNNER_TEMP/cli-full.log"
|
|
ran "$RUNNER_TEMP/cli-full.log"
|
|
grep -q '^test a_full_build_holds_every_operation \.\.\. ok$' "$RUNNER_TEMP/cli-full.log" \
|
|
|| { echo "::error::a build with --features full did not run a_full_build_holds_every_operation"; exit 1; }
|
|
cargo test --locked --no-default-features --features quickstart,telemetry,video_manifest --test cli_folds 2>&1 | tee "$RUNNER_TEMP/cli-folds.log"
|
|
ran "$RUNNER_TEMP/cli-folds.log"
|
|
cargo test --locked --no-default-features --features quickstart,app --test cli_ops 2>&1 | tee "$RUNNER_TEMP/cli-app.log"
|
|
ran "$RUNNER_TEMP/cli-app.log"
|
|
cargo test --locked --no-default-features --features quickstart,revenue_share --test cli_ops 2>&1 | tee "$RUNNER_TEMP/cli-share.log"
|
|
ran "$RUNNER_TEMP/cli-share.log"
|
|
cargo test --locked --no-default-features --features quickstart,opportunity_report --test cli_ops 2>&1 | tee "$RUNNER_TEMP/cli-opportunity.log"
|
|
ran "$RUNNER_TEMP/cli-opportunity.log"
|