open-standards/wai/CONTRIBUTING.md
Transaction Science ae94f935e7
Some checks failed
joule-moq-remote host agent / joule-moq-remote · does this change touch it (pull_request) Successful in 8s
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 7s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 8s
wai-app and Create / wai-app · does this change touch it (pull_request) Successful in 7s
wai-audit collector and player integration / does this change touch it (pull_request) Successful in 7s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 7s
wai cross-architecture byte-equality / does this change touch it (pull_request) Successful in 7s
WAI operation catalogue / does this change touch it (pull_request) Successful in 7s
WAI conformance / does this change touch it (pull_request) Successful in 13s
WAI energy receipts / does this change touch it (pull_request) Successful in 8s
wai-fleet service / does this change touch it (pull_request) Successful in 8s
WAI examples / WAI examples · does this change touch them (pull_request) Successful in 13s
wai formal verification (integer core) / does this change touch it (pull_request) Successful in 8s
WAI JPEG-AI whole decode (pinned inputs, required) / does this change touch it (pull_request) Successful in 12s
wai-ledger service / does this change touch it (pull_request) Successful in 10s
wai-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Successful in 8s
WAI neural sink gates / does this change touch it (pull_request) Successful in 13s
wai-ops-npu integer operators on neural processors / does this change touch it (pull_request) Successful in 6s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 8s
wai-ops integer operators / does this change touch it (pull_request) Successful in 15s
wai-quantum studio and desktop / does this change touch it (pull_request) Successful in 8s
wai-quantum for JavaScript / does this change touch it (pull_request) Successful in 13s
wai-sink-android native sink library / does this change touch it (pull_request) Successful in 8s
wai-sink-swift native sink package / does this change touch it (pull_request) Successful in 13s
WAI mbt2018_mean integer decode (regenerated vectors) / does this change touch it (pull_request) Successful in 8s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 8s
WAI Studio / does this change touch it (pull_request) Successful in 13s
wai-web wasm32 / does this change touch it (pull_request) Successful in 8s
WAI conformance / fast integer kernels, every x86_64 kernel set (AVX-512 silicon) (pull_request) Successful in 3m28s
wai-ops-npu integer operators on neural processors / neural processor (framework-128gb silicon) (pull_request) Successful in 13s
wai formal verification (integer core) / kani (isqrt512) (pull_request) Successful in 29m16s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (pull_request) Successful in 32s
wai-audit collector and player integration / collector · linux (pull_request) Successful in 1m17s
wai cross-architecture byte-equality / linux-x86_64 (pull_request) Successful in 32s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Failing after 1m42s
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 3m1s
wai formal verification (integer core) / kani (rans64-t2) (pull_request) Successful in 13m17s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 40s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 1m52s
WAI conformance / faces from keypoints under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m29s
wai-quantum studio and desktop / desktop app · windows (pull_request) Successful in 8m59s
wai formal verification (integer core) / every harness in one shard (pull_request) Successful in 24s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 3m28s
WAI operation catalogue / the catalogue and every door · linux (pull_request) Successful in 4m44s
wai-fleet service / service · linux (pull_request) Successful in 2m5s
wai formal verification (integer core) / kani (stage) (pull_request) Successful in 3m0s
wai formal verification (integer core) / kani (plan) (pull_request) Successful in 5m52s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 8m12s
wai-ledger service / service · linux (pull_request) Successful in 1m38s
wai formal verification (integer core) / kani (integer-core) (pull_request) Successful in 5m39s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m45s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 5m56s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 3m4s
wai-ops integer operators / linux-x86_64 (pull_request) Successful in 50s
wai-ops integer operators / wasm32-wasip2 (wasmtime) (pull_request) Successful in 30s
wai-ops integer operators / wasm32 under Node (pull_request) Successful in 21s
wai-ops integer operators / independent checker (Python) (pull_request) Successful in 12s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 12m57s
wai-pack / wai-pack · linux (pull_request) Successful in 1m43s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 15m38s
WAI neural sink gates / the exact JPEG-AI decoder reports its path (pinned inputs, required) (pull_request) Successful in 5m23s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m28s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 2m48s
wai formal verification (integer core) / kani (sound) (pull_request) Successful in 13m40s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 4m2s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 2m40s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m28s
wai-quantum studio and desktop / desktop app · linux (pull_request) Successful in 5m24s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m11s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m30s
wai formal verification (integer core) / kani (stage-long) (pull_request) Successful in 20m33s
wai formal verification (integer core) / kani (arith) (pull_request) Successful in 25m17s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 11m9s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (pull_request) Successful in 57s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (pull_request) Successful in 1m16s
joule-moq-room room service / joule-moq-room, every target (pull_request) Successful in 3m34s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Successful in 30s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 22s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 7m7s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 6m17s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 11m55s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 1m49s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 37s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 35s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m24s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 16m11s
wai-fleet service / service · macos (pull_request) Successful in 2m5s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 9m26s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 12m23s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 12s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 34s
wai-ledger service / service · macos (pull_request) Successful in 1m8s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 18m20s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m8s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 20m55s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 6m35s
wai-ops-npu integer operators on neural processors / builds · no device is not a pass (linux-arm64) (pull_request) Successful in 21s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 16m58s
wai-ops integer operators / macos-arm64 (pull_request) Successful in 1m0s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m56s
wai-pack / wai-pack · macos (pull_request) Successful in 3m19s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 26s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 14s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 12m3s
wai-ops integer operators / linux-aarch64 (pull_request) Successful in 1m11s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 13m4s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m46s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 5m19s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 9m20s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 8m15s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 11m44s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 18m0s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h30m13s
wai/neural-corpus-licence, converted to the layout of the fix: no shared append point
The change of wai/neural-corpus-licence (44d5f2264..6bddde42d, 5 commits), on the fix branch: its
changelog entries as files of wai/changes/, its wai-conformance.yml edits as step files,
corpus files and test tags, and every other file as the branch has it.

- 40052a902 wai: the trained int_synth vector's tool generates its own pictures from a seed
- c86d58210 wai: neural-conformance's photo, trained and coded on generated pictures
- 4321d68cc wai: every neural-conformance vector has a licence record, and a lint requires one
- 63aea099a wai: photo's licence record gives its training pictures as streams 1 to 512
- 6bddde42d wai: the trained int_synth vector's check holds its licence record to meta.json

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

11 KiB

Contributing to WAI

WAI is a specification (SPEC.md and its extensions/) with a reference implementation in Rust (wai-rs/, with wai-quantum/ and the browser crate wai-web/). Both are pre-1.0 drafts: substantive changes are welcome.

The canonical repository is the forge at https://git.transaction.science/Transaction-Science/open-standards. Send changes there; mirrors of it are read-only.

To the specification

A change is in scope if it:

  • names a real ambiguity in the text (point at the section and the case that breaks);
  • adds a missing structural requirement (byte layout, conformance rule, dispatch behaviour) needed to make another implementation falsifiable;
  • registers a capability with a byte-precise payload format and conformance vectors, not a placeholder (see Registering a capability, below).

A change is out of scope if it adds optional fields with no testable conformance effect. §8 says what a revision may change: a registered capability's payload format and role are fixed once registered, and a later edition of a standard that changes its bitstream takes a new capability string.

Registering a capability

REGISTRY.md states the procedure: add the string to the registry table in wai-rs/src/codecs/, register it in SPEC §5 under the same heading, run wai registry export, and link it from the codec glossary or list it there as having no entry. The tests hold SPEC, the registry and the exported files to the same set of strings.

To the reference implementation

Building

The default codecs feature links system codec libraries (libjxl, libavif, libopus, libdav1d, liblzma, libflac); without them the build stops in a codec crate's build script. Everything else builds without them, and CI builds that way:

cd wai-rs
cargo test --lib --no-default-features --features world,audio_scene,haptic,splat4d,score,provenance,neural_int,film
cargo run --no-default-features --bin wai -- capabilities

Name the features a change touches explicitly; cargo test with the defaults is not what CI runs.

Tests that CI must see

  • A test file gated on a feature (#![cfg(feature = "...")]) compiles to an empty binary, which reports success, in any build without that feature. Declare it in wai-rs/Cargo.toml with a [[test]] stanza and required-features, and add --test <name> with the right --features to a step in .github/workflows/, or to a verifier step's own file (below), or tag the file for the fast integer kernels' steps (below). A test no workflow names runs nowhere.
  • A test that reads inputs from outside the tree skips without them. CI sets WAI_REQUIRE_SOTA_VECTORS=1 where it provides them, and a missing input then fails.
  • Falsify every new test once: change the code it guards, show it fails, restore the code through git, and show it passes again.

Vectors

Committed conformance vectors and pinned hashes change only through their generator (the wai_*_vectors gen binaries and the export tools in tools/), never by hand. A test whose comment says its hex must never be edited to make it pass means exactly that.

Corpus content: where it comes from

Corpus content is generated in this repository, by a generator from a seed or a formula, or it is an input whose source and licence are recorded and whose licence permits redistribution. An image, a recording or footage that was not made here and has no such licence is not committed, as content or as training data.

Every corpus states its provenance: each *-conformance/README.md in a line that begins **Provenance.**, and wai-rs/tests/vectors/README.md in a row for each vector directory. The line names the generator and its input, and for an input not generated here, its source and licence. A word such as "synthetic" is not a provenance line. wai-rs/tests/corpus_provenance.rs requires the line in every corpus, and tools/wai_audio_provenance_check.py, which CI runs, fails when a committed audio vector correlates with a reference recording the host has.

A corpus can also keep a licence record for each vector, in a licences.json beside its README: the vector's licence, as an SPDX identifier from a list of licences that permit redistribution; whether its content is generated here or a third-party input; the generator and its input, or the source; and, for a vector whose model was trained, the same of its training data. neural-conformance keeps one. scripts/check-wai-corpus-licences.py, run on every change, fails on a vector of such a corpus that has no record, and on a record whose licence is outside that list or that leaves out what its content needs.

Independent implementations

Conformance is defined by the committed corpora (*-conformance/) and the criteria of SPEC §7, not by agreement with this implementation's own tests. A second implementation in another language is validated against the same corpora; the OER receipt kernel in C (oer-conformance/settle/) is one.

Changes that add files rather than append to shared lines

Many changes are open here at once, and a line two of them edit is a conflict that holds one of them back. So a change adds files of its own where the tree lets it (its changelog entry, and its lists in the conformance workflow), and in a file that stays shared it inserts beside the entry it builds on:

  • Its changelog entry is a new file, changes/<yyyy-mm-dd>-<slug>.md, holding the entry as the changelog does (changes/README.md). It does not edit the head of CHANGELOG.md. The repository checks require a change under wai/ to add or edit an entry file directly in changes/ (a release, which renders the files and removes them, passes), or to carry the trailer line Changelog: none, exactly, in the trailer block of one of its commit messages. A pull request opened before the check reached main passes as it is; one opened since that adds its entry to the head of CHANGELOG.md fails.
  • A step of the independent verifiers in wai-conformance.yml is a new file, .github/wai-conformance/verifiers/<name>.sh: the step's shell body, run in wai/, under a header of # key: value lines. # step: names it and # order: places it; # features: brings its features into WAI_FEATURES and its lists into the features-alone job; # paths: brings the extension text it reads into the paths the workflow's gate runs on (the trigger takes all of extensions/; a path under none of the trigger's paths still needs a line there, which check names); # bins: and # release-features: cover the rest, and every --test it runs with "$WAI_FEATURES" joins the job's first build. scripts/wai-conformance-lists.py states every key; python3 scripts/wai-conformance-lists.py dry-run prints every list and step the workflow runs, and run --only <name> runs one step.
  • A cargo-class corpus is a new file of .github/wai-conformance/corpora/, naming its tool and directory. A test of the fast integer kernels carries the first line // wai-conformance: int-kernels (with int-kernels-amd when the AVX-512 host runs it too, or int-kernels-release alone when only the release step does), and the steps take its required features from Cargo.toml.
  • A file every change still shares takes a new entry beside the entry it builds on, never at the end, and is not re-sorted. wai-rs/Cargo.toml's [features], [[bin]] and [[test]] tables, wai-rs/src/lib.rs's mod lines and the tables of wai-rs/src/codecs/registry.rs are grouped by topic, not sorted: a feature goes after the feature it depends on, a target after its sibling's, a module after the module it extends. registry/capabilities.json, the registry table of REGISTRY.md and vocab/v2.* are generated from registry.rs in sorted order, so a new row lands at its sorted place: never edit them by hand, and on a conflict in one take either side and run wai registry export again.
  • .gitattributes. A corpus whose bytes must never be converted gives its own directory a .gitattributes (* -text), as pin-conformance/ and live-conformance/scene/ do (a verifier that lists its directory's files must admit that one, as scene_verify.py does), and adds no line to wai/.gitattributes. A pattern only that file can hold goes beside the line it is most like, with its comment, never at the end.
  • The corpus table of live-conformance/README.md, and the list of verifier commands under it, take a new row beside the row of the extension it builds on or extends (a delivery record beside its delivery sibling, a live extension beside its live sibling), never at the end. The table is written by hand: its rows name sections, schemes and generators that no file of the corpora states.

Public text

The specification, the extensions, READMEs, research notes, code comments and the CHANGELOG state what WAI does, plainly:

  • name no company, vendor, customer or commercial product. Standards, standards bodies, protocols, papers and open-source projects may be named, factually;
  • make no comparisons with other products or approaches;
  • give no counts that drift (crate counts, test counts, line counts).

Three checks enforce this. scripts/check-no-vanity-metrics.sh (opt-out marker allow-vanity: <reason>) and scripts/check-comparative-prose.sh (opt-out allow-phrase: <reason>, for an identifier or a quotation) run on every change. scripts/check-public-names.sh holds the names of the maintainers' products that their public site names in the script itself, since they are public already, and checks them on every change (--maintainer-products-only). Its other patterns are a private list (the WAI_NAME_DENYLIST secret in CI, given only to the run on a push to main, so a pull request is checked against that list when it lands). A functional identifier — a capability string, a model-hub id a tool defaults to, a repository URL, an OS API name, a security advisory id — is kept and its line marked allow-name: <reason>. Put the marker in a comment of the file's own syntax (<!-- ... -->, // ..., # ...); the reason must contain a letter or a digit. JSON has no comments, so a JSON file carries no such identifier: the codec glossary titles a format by its own name, FourCC, file extension or designation, and never by a company, a product or a person (glossary/SCHEMA.md). The checks fail closed: a pattern that does not compile, or any grep error, fails them, and scripts/test-public-text-checks.sh proves that on every run.

Dated research records are not rewritten: a correction is a dated annotation after the original text, and a name is redacted in place with a dated marker.

Licence

The specification and the reference implementation are Apache-2.0. By contributing, you agree your contribution is licensed under the same terms. Each payload and companion capability carries a licence class (royalty-free, patent-pool, proprietary, non-commercial) for implementing it, recorded in the registry; derivations carry the class codecs::derivation gives them; records carry none. Companion implementations outside this tree keep their own licences.

No CLA. The licence is the agreement.