wai: the developer's path (hello, create, dev, verify), the floor with no system library, nine examples, and the quickstart archive #504

Merged
dcharlot merged 6 commits from wai/dx-a-examples-2 into main 2026-10-27 04:14:23 -04:00
Owner

Replaces #502: the same six commits rebased onto main at 7a7edc58 (after #499 and #503), DX-A's changes byte-identical (the diff outside the changelog has the same patch-id), the changelog keeping both v0.4.0 entries. #502's branch is left as it was.

What this is

The free entry point to WAI: a five-minute path from nothing to a live room on your own machine, examples that run, and a wai command line that scaffolds them. Everything runs on the open reference software alone, self-hosted, with no account.

Base. train/wai-e at 5b79d1550 (Train E, #499, was still open when this started and is still open). Until #499 merges, this PR's diff against main also shows Train E's commits; this branch adds only the commits on top of 5b79d1550.

What is in it

The floor with no system library (wai-rs features)

  • floor: the mandatory floor of SPEC §5 (PNG, FLAC, zstd) with no system codec library. PNG through the image crate's pure-Rust codec (its declaration now carries png alone; codecs adds JPEG, WebP and AVIF, so a codecs build is unchanged), FLAC decoded by claxon, zstd from its reference source compiled in. wai decode opens the three; wai encode writes PNG and zstd; a codec outside the floor is refused naming the build that has it. wai::floor_capabilities().
  • quickstart = floor + http + receipt_claims + getrandom: what the prebuilt wai is built with.

Four verbs, one module each, one dispatch table

src/bin/wai_cli/dx/: mod.rs holds VERBS (name, usage, function); main() calls dx::dispatch once. Renaming or regrouping a verb is a line there.

  • wai hello [<dir>]: WAI's four steps on a picture made in place. Name (a WAI1 envelope naming wai.image.png), Dispatch (SPEC §4 against this binary's capabilities), Rebuild (byte for byte), Receipt (a labelled group receipt signed with a key made for the run, written as http-delivery §8 lays receipts beside an object: <cid>.wai, <cid>.wai.receipts, rcpt/<link>.json, then checked).
  • wai create <dir> --template <name>, --list [--json]: a project from one of wai/examples/, whose files the binary holds (include_bytes!, dx/templates.rs); never into a directory that holds anything. A watch room's sample tone is generated.
  • wai dev: joule-moq-relay and joule-moq-room started on loopback ports of their own, the room's keys made once in .wai/dev/, and one origin on 127.0.0.1 served as a production front serves it: your page at /, the room client beside it, the room service at /room-api/, the relay's WebSocket binding at /moq (the room client refuses a service on another origin). std::net only, no new dependency. --check checks each piece through the origin (the page and its WebAssembly, the service and its clock's session on the relay, a viewer's grant, the relay's 101 moqt-22 upgrade), prints the time, and stops. Modes: --watch FILE, --call, --remote, --messaging, --e2ee.
  • wai verify <path>...: every receipt index under a path, checked offline through http_binding::receipts::check_index with a file fetcher.

The project file, wai.json, is read and written only in dx/project.rs; an unknown member is refused.

The examples (wai/examples/), each with a test that runs it through wai create and wai dev

Template Test Host Result
video-room two pages join, each decodes the other; the page's own API call counts two Studio (browser) pass
watch-together two viewers; play and pause apply at one instant within 250 ms Studio (browser) pass, 6 of 6 runs
messaging two members open each other's sealed messages; a call placed, rung, answered, both decoding Studio (browser) pass
encoder-ingest SRT into a room, every group verified against the gateway's receipts at a subscriber Framework pass
package-and-deliver packed and verified (Framework); the floor played in a page (Studio) both pass
verify-receipts Rust (wai crate) and Python (stdlib) accept wai hello's receipts and each refuses a changed byte Framework pass
apple-app the SDK's macOS slice built, the SwiftUI app built, a recorded session replayed, its bundle verified Studio pass
android-app the SDK's Kotlin API on the host JVM, the recorded session replayed, its bundle verified Framework (JDK 17) pass
remote-desktop a drawn screen shared in, recorded, accepted by remote_desktop_verify.py (Framework); a browser decodes it and drives it (Studio) both pass

Each README is a dozen lines: what it shows, run it, what you see, and how a coding assistant uses it (wai setup-agent, from DX-B).

The archive, its release and its installer (wai/quickstart/)

  • build-web.sh (the room client: pages and three wasm builds), build.sh (one archive per target: bin/ wai, joule-moq-relay, joule-moq-room, wai-remote-host, wai-pack; share/wai/web/; README; LICENSE; reproducible tar; .sha256). It gives each build its own target directory under a shared one (wai's rlib carries no hash as a cdylib, and two feature sets overwrote each other), stops on a failed build, and checks the packaged wai holds this checkout's examples byte for byte.
  • install.sh (also on the site branch as /install.sh), formulae.py, publish.sh, test/clean-machine.sh, test/run-examples.sh.
  • .github/workflows/wai-release.yml: on a tag wai-v<version>, the room client once (macOS), archives for macOS (arm64, x86_64), Linux (x86_64, arm64, musl static) and Windows, each archive's own wai run before upload, then the Homebrew formula and the Scoop manifest. Not run by this PR; nothing is published.

CI

  • .github/workflows/wai-examples.yml: portable (linux), browser + archive + wai dev --check from the unpacked archive + apple-app (macos), android-app (linux-arm64).
  • wai-conformance.yml: tests/floor.rs (feature floor), tests/cli_dx.rs and the binary's dx tests (feature quickstart); fires on wai/examples/**.

Measured quickstart

wai/quickstart/test/clean-machine.sh <archive> [--browser]: a fresh HOME and directory, the system's PATH only, the archive checked and unpacked, wai hello, wai verify, wai create my-room --template video-room, wai dev --check. Downloading the archive is not timed (no release exists yet).

Host Archive Runs Total wai dev ready
Framework, Linux x86_64 wai-0.3.0-x86_64-unknown-linux-gnu.tar.gz, 18 MB 3 0.43–0.44 s 0.11–0.12 s, 8 of 8 checks
Studio, macOS arm64, with two browser pages joined and decoding each other wai-0.3.0-aarch64-apple-darwin.tar.gz, 15 MB 3 7.94–8.25 s (the browser step 6.97–7.09 s) 0.34–0.48 s, 8 of 8 checks

From source instead (Framework, empty target directories, crates already fetched, 16 jobs): wai 84 s, relay 24 s, room service 38 s, 146 s in all; the room client's WebAssembly is a further step needing the wasm target and its bindings tool.

Checks

Check Host Result
cargo test --no-default-features --features quickstart --bin wai --test floor --test cli_dx Framework 12 + 3 + 2 passed
cargo test --no-default-features --features floor --test floor Framework 3 passed
cargo test --lib codecs:: (default features, system codec libraries) and --features quickstart --test floor --test cli_dx Studio 64 passed; 2 + 2 passed
cargo clippy --all-targets with --features quickstart, --features floor, none, and default: notes in the touched files Framework, Studio none new (the remaining notes are pre-existing lines; the quickstart combination also surfaces pre-existing dead-code notes in http_vectors_playlists.rs, int_payload, energy_report that every http build without video_manifest shows)
cargo clippy --all-targets -- -D warnings on examples/verify-receipts/rust and examples/encoder-ingest Framework clean
cargo metadata --locked --offline on every lock holding wai (14) Framework all ok
bash wai/quickstart/test/run-examples.sh portable Framework 4 of 4
... browser (with BROWSER_BIN) Studio 5 of 5
... apple / ... android Studio / Framework 1 of 1 each
python3 -I scripts/check-tests-in-ci.py local ok
./scripts/check-workflow-concurrency.sh local 55 workflows grouped
ruby -ryaml over .github/workflows/*.yml local parse
check-spec-refs, check-wai-section-refs, check-no-vanity-metrics, test-public-text-checks, check-comparative-prose, check-orphan-sources local all pass
check-public-names.sh on every changed file; commit messages and this body by grep -E local clean

Falsifications (committed first; mutated inside the build host's checkout, restored with git checkout -- <file>)

  1. An example's API call broken. video-room/index.html: fetch("/room-api/room") → /room-api/rooms, wai rebuilt: the test fails (the page's own line counts two present: not within 60000 ms, 2 of 3 checks, exit 1). Restored: 3 of 3, exit 0. (Studio)
  2. The quickstart's readiness check broken. dx/dev.rs: the origin's /moq upgrade sent to the room service instead of the relay; archive rebuilt; clean-machine.sh reports FAIL the relay's WebSocket binding (moqt-22) (HTTP/1.1 404 Not Found), wai dev: NOT ready … 7 of 8 checks held, dev-check FAILED, stopped there, exit 1. Restored: 8 of 8, exit 0. (Framework)
  3. Receipts tampered (in tests/cli_dx.rs, every run): one byte of the object, and one hex digit of the group's signature, each make wai verify exit 1; the example's Rust and Python verifiers each refuse the same two (content_hash_mismatch, receipt_name_mismatch).
  4. A stale binary (found, not planted): the first Linux archive shipped a wai from an earlier build; build.sh now fails rather than package one, and checks the packaged templates against wai/examples/.

Verbs, flags and file names introduced (for the toolchain study to adopt or rename)

  • Verbs: wai hello [<dir>], wai create <dir> --template <name>, wai create --list [--json], wai dev, wai verify <path>.... wai up (the brief's name) was settled as wai dev, the study's name: it says the scope (development, local). hello and verify are new verbs beside inspect/wrap/unwrap/encode/decode, which are unchanged.
  • wai dev flags: --port, --dir, --site, --web, --relay, --room, --publishers, --watch, --watch-ms, --call, --remote, --messaging, --e2ee, --check, --json, --for, --help; environment WAI_WEB, WAI_RELAY_BIN, WAI_ROOM_BIN.
  • Paths wai dev serves: /room-api/, /msg-api/, /moq; its directory .wai/dev/ (room-keys.toml, msg-keys.toml, relay.toml, room.toml, conversation.toml, sessions.jsonl, logs).
  • Files: wai.json (project file: template, title, summary, dev.{site,page,mode,publishers,watch,watch_ms,messaging,e2ee}); wai-hello/ (hello's default output).
  • Features: floor, quickstart. Archive: wai-<version>-<triple>.tar.gz, release tag wai-v<version>, web asset wai-web-<version>.tar.gz; installer environment WAI_VERSION, WAI_HOME (default ~/.wai).

Not done

  • No release, no tag, no registry publish. The tap and bucket drafts, Transaction-Science/homebrew-tap#1 and Transaction-Science/scoop-bucket#1, carry SET-BY-THE-RELEASE digests and install nothing until the release writes them.
  • The Windows build of the relay, the room service and the remote host has never run; the release's Windows leg is its first. wai dev on Windows stops its children with kill() rather than a signal.
  • The Linux archives measured here are glibc builds of the host; the release builds musl static ones, not yet built.
  • android-app is the sink's Kotlin API on the JVM; an Android application module (the AAR's WaiPlayerSession in an Activity) is not in the example, since it needs the Android SDK and NDK to build and was not built here.
  • apple-app's player opens a window and was built, not driven; its test is the headless replay.
  • The study's wai cloud login and wai deploy are not here (not this builder's).
  • wai dev runs its relay and room service as child processes; a parent killed by a signal other than Ctrl-C (which reaches the whole process group) leaves them running.

Decisions for the owner

  1. Package names. wai, wai-rs and wai-cli are taken on crates.io, wai/wai-cli on npm, and "WAI" is also the W3C's Web Accessibility Initiative. Proposals: crate wai-media (library) and waictl or wai-media-cli (command line), npm @transaction-science/wai. The draft formula and manifest are named wai in our own tap and bucket, where the name is ours; say if they should be wai-media.
  2. Releasing: push the tag wai-v0.3.0 to run wai-release.yml, then merge the formula and manifest it attaches into the tap and the bucket in place of the drafts.
  3. The site's docs deploy after the release: they name the tap, the bucket and /install.sh.
  4. The one hosted line: the quickstart ends "To have the relay and the room service run for you rather than on your own machines, see waiTransport", linking its site, which today offers that by email. Keep, reword, or drop.

The site branch is docs-quickstart of wai-transaction-science-web (pushed, not deployed): /docs/, /docs/quickstart/, /docs/examples/, /docs/sdk/, /docs/api/, each with a .md twin, /llms.txt indexing them, "Build this" links from the room and cargo demos, /install.sh.

DX-B's wai mcp / wai setup-agent and its openapi.json are referenced (READMEs, /docs/api/) but are in their PR; both PRs edit src/bin/wai.rs's usage and main(), a small merge.

🤖 Generated with Claude Code

> Replaces #502: the same six commits rebased onto main at 7a7edc58 (after #499 and #503), DX-A's changes byte-identical (the diff outside the changelog has the same patch-id), the changelog keeping both v0.4.0 entries. #502's branch is left as it was. ## What this is The free entry point to WAI: a five-minute path from nothing to a live room on your own machine, examples that run, and a `wai` command line that scaffolds them. Everything runs on the open reference software alone, self-hosted, with no account. **Base.** `train/wai-e` at `5b79d1550` (Train E, #499, was still open when this started and is still open). Until #499 merges, this PR's diff against `main` also shows Train E's commits; this branch adds only the commits on top of `5b79d1550`. ## What is in it ### The floor with no system library (wai-rs features) - **`floor`**: the mandatory floor of SPEC §5 (PNG, FLAC, zstd) with no system codec library. PNG through the `image` crate's pure-Rust codec (its declaration now carries `png` alone; `codecs` adds JPEG, WebP and AVIF, so a `codecs` build is unchanged), FLAC decoded by claxon, zstd from its reference source compiled in. `wai decode` opens the three; `wai encode` writes PNG and zstd; a codec outside the floor is refused naming the build that has it. `wai::floor_capabilities()`. - **`quickstart`** = `floor` + `http` + `receipt_claims` + `getrandom`: what the prebuilt `wai` is built with. ### Four verbs, one module each, one dispatch table `src/bin/wai_cli/dx/`: `mod.rs` holds `VERBS` (name, usage, function); `main()` calls `dx::dispatch` once. Renaming or regrouping a verb is a line there. - **`wai hello [<dir>]`**: WAI's four steps on a picture made in place. Name (a `WAI1` envelope naming `wai.image.png`), Dispatch (SPEC §4 against this binary's capabilities), Rebuild (byte for byte), Receipt (a labelled group receipt signed with a key made for the run, written as http-delivery §8 lays receipts beside an object: `<cid>.wai`, `<cid>.wai.receipts`, `rcpt/<link>.json`, then checked). - **`wai create <dir> --template <name>`**, `--list [--json]`: a project from one of `wai/examples/`, whose files the binary holds (`include_bytes!`, `dx/templates.rs`); never into a directory that holds anything. A watch room's sample tone is generated. - **`wai dev`**: `joule-moq-relay` and `joule-moq-room` started on loopback ports of their own, the room's keys made once in `.wai/dev/`, and one origin on `127.0.0.1` served as a production front serves it: your page at `/`, the room client beside it, the room service at `/room-api/`, the relay's WebSocket binding at `/moq` (the room client refuses a service on another origin). `std::net` only, no new dependency. `--check` checks each piece through the origin (the page and its WebAssembly, the service and its clock's session on the relay, a viewer's grant, the relay's `101 moqt-22` upgrade), prints the time, and stops. Modes: `--watch FILE`, `--call`, `--remote`, `--messaging`, `--e2ee`. - **`wai verify <path>...`**: every receipt index under a path, checked offline through `http_binding::receipts::check_index` with a file fetcher. **The project file**, `wai.json`, is read and written only in `dx/project.rs`; an unknown member is refused. ### The examples (`wai/examples/`), each with a test that runs it through `wai create` and `wai dev` | Template | Test | Host | Result | |---|---|---|---| | `video-room` | two pages join, each decodes the other; the page's own API call counts two | Studio (browser) | pass | | `watch-together` | two viewers; play and pause apply at one instant within 250 ms | Studio (browser) | pass, 6 of 6 runs | | `messaging` | two members open each other's sealed messages; a call placed, rung, answered, both decoding | Studio (browser) | pass | | `encoder-ingest` | SRT into a room, every group verified against the gateway's receipts at a subscriber | Framework | pass | | `package-and-deliver` | packed and verified (Framework); the floor played in a page (Studio) | both | pass | | `verify-receipts` | Rust (wai crate) and Python (stdlib) accept `wai hello`'s receipts and each refuses a changed byte | Framework | pass | | `apple-app` | the SDK's macOS slice built, the SwiftUI app built, a recorded session replayed, its bundle verified | Studio | pass | | `android-app` | the SDK's Kotlin API on the host JVM, the recorded session replayed, its bundle verified | Framework (JDK 17) | pass | | `remote-desktop` | a drawn screen shared in, recorded, accepted by `remote_desktop_verify.py` (Framework); a browser decodes it and drives it (Studio) | both | pass | Each README is a dozen lines: what it shows, run it, what you see, and how a coding assistant uses it (`wai setup-agent`, from DX-B). ### The archive, its release and its installer (`wai/quickstart/`) - `build-web.sh` (the room client: pages and three wasm builds), `build.sh` (one archive per target: `bin/` wai, joule-moq-relay, joule-moq-room, wai-remote-host, wai-pack; `share/wai/web/`; README; LICENSE; reproducible tar; `.sha256`). It gives each build its own target directory under a shared one (wai's rlib carries no hash as a cdylib, and two feature sets overwrote each other), stops on a failed build, and checks the packaged `wai` holds this checkout's examples byte for byte. - `install.sh` (also on the site branch as `/install.sh`), `formulae.py`, `publish.sh`, `test/clean-machine.sh`, `test/run-examples.sh`. - `.github/workflows/wai-release.yml`: on a tag `wai-v<version>`, the room client once (macOS), archives for macOS (arm64, x86_64), Linux (x86_64, arm64, musl static) and Windows, each archive's own `wai` run before upload, then the Homebrew formula and the Scoop manifest. **Not run by this PR; nothing is published.** ### CI - `.github/workflows/wai-examples.yml`: portable (linux), browser + archive + `wai dev --check` from the unpacked archive + apple-app (macos), android-app (linux-arm64). - `wai-conformance.yml`: `tests/floor.rs` (feature floor), `tests/cli_dx.rs` and the binary's dx tests (feature quickstart); fires on `wai/examples/**`. ## Measured quickstart `wai/quickstart/test/clean-machine.sh <archive> [--browser]`: a fresh HOME and directory, the system's PATH only, the archive checked and unpacked, `wai hello`, `wai verify`, `wai create my-room --template video-room`, `wai dev --check`. Downloading the archive is not timed (no release exists yet). | Host | Archive | Runs | Total | `wai dev` ready | |---|---|---|---|---| | Framework, Linux x86_64 | `wai-0.3.0-x86_64-unknown-linux-gnu.tar.gz`, 18 MB | 3 | 0.43–0.44 s | 0.11–0.12 s, 8 of 8 checks | | Studio, macOS arm64, with two browser pages joined and decoding each other | `wai-0.3.0-aarch64-apple-darwin.tar.gz`, 15 MB | 3 | 7.94–8.25 s (the browser step 6.97–7.09 s) | 0.34–0.48 s, 8 of 8 checks | From source instead (Framework, empty target directories, crates already fetched, 16 jobs): wai 84 s, relay 24 s, room service 38 s, 146 s in all; the room client's WebAssembly is a further step needing the wasm target and its bindings tool. ## Checks | Check | Host | Result | |---|---|---| | `cargo test --no-default-features --features quickstart --bin wai --test floor --test cli_dx` | Framework | 12 + 3 + 2 passed | | `cargo test --no-default-features --features floor --test floor` | Framework | 3 passed | | `cargo test --lib codecs::` (default features, system codec libraries) and `--features quickstart --test floor --test cli_dx` | Studio | 64 passed; 2 + 2 passed | | `cargo clippy --all-targets` with `--features quickstart`, `--features floor`, none, and default: notes in the touched files | Framework, Studio | none new (the remaining notes are pre-existing lines; the quickstart combination also surfaces pre-existing dead-code notes in `http_vectors_playlists.rs`, `int_payload`, `energy_report` that every `http` build without `video_manifest` shows) | | `cargo clippy --all-targets -- -D warnings` on `examples/verify-receipts/rust` and `examples/encoder-ingest` | Framework | clean | | `cargo metadata --locked --offline` on every lock holding `wai` (14) | Framework | all ok | | `bash wai/quickstart/test/run-examples.sh portable` | Framework | 4 of 4 | | `... browser` (with `BROWSER_BIN`) | Studio | 5 of 5 | | `... apple` / `... android` | Studio / Framework | 1 of 1 each | | `python3 -I scripts/check-tests-in-ci.py` | local | ok | | `./scripts/check-workflow-concurrency.sh` | local | 55 workflows grouped | | `ruby -ryaml` over `.github/workflows/*.yml` | local | parse | | `check-spec-refs`, `check-wai-section-refs`, `check-no-vanity-metrics`, `test-public-text-checks`, `check-comparative-prose`, `check-orphan-sources` | local | all pass | | `check-public-names.sh` on every changed file; commit messages and this body by `grep -E` | local | clean | ## Falsifications (committed first; mutated inside the build host's checkout, restored with `git checkout -- <file>`) 1. **An example's API call broken.** `video-room/index.html`: `fetch("/room-api/room")` → `/room-api/rooms`, `wai` rebuilt: the test fails (`the page's own line counts two present: not within 60000 ms`, 2 of 3 checks, exit 1). Restored: 3 of 3, exit 0. (Studio) 2. **The quickstart's readiness check broken.** `dx/dev.rs`: the origin's `/moq` upgrade sent to the room service instead of the relay; archive rebuilt; `clean-machine.sh` reports `FAIL the relay's WebSocket binding (moqt-22) (HTTP/1.1 404 Not Found)`, `wai dev: NOT ready … 7 of 8 checks held`, `dev-check FAILED`, stopped there, exit 1. Restored: 8 of 8, exit 0. (Framework) 3. **Receipts tampered** (in `tests/cli_dx.rs`, every run): one byte of the object, and one hex digit of the group's signature, each make `wai verify` exit 1; the example's Rust and Python verifiers each refuse the same two (`content_hash_mismatch`, `receipt_name_mismatch`). 4. **A stale binary** (found, not planted): the first Linux archive shipped a `wai` from an earlier build; `build.sh` now fails rather than package one, and checks the packaged templates against `wai/examples/`. ## Verbs, flags and file names introduced (for the toolchain study to adopt or rename) - Verbs: `wai hello [<dir>]`, `wai create <dir> --template <name>`, `wai create --list [--json]`, `wai dev`, `wai verify <path>...`. `wai up` (the brief's name) was settled as `wai dev`, the study's name: it says the scope (development, local). `hello` and `verify` are new verbs beside `inspect`/`wrap`/`unwrap`/`encode`/`decode`, which are unchanged. - `wai dev` flags: `--port`, `--dir`, `--site`, `--web`, `--relay`, `--room`, `--publishers`, `--watch`, `--watch-ms`, `--call`, `--remote`, `--messaging`, `--e2ee`, `--check`, `--json`, `--for`, `--help`; environment `WAI_WEB`, `WAI_RELAY_BIN`, `WAI_ROOM_BIN`. - Paths `wai dev` serves: `/room-api/`, `/msg-api/`, `/moq`; its directory `.wai/dev/` (`room-keys.toml`, `msg-keys.toml`, `relay.toml`, `room.toml`, `conversation.toml`, `sessions.jsonl`, logs). - Files: `wai.json` (project file: `template`, `title`, `summary`, `dev.{site,page,mode,publishers,watch,watch_ms,messaging,e2ee}`); `wai-hello/` (hello's default output). - Features: `floor`, `quickstart`. Archive: `wai-<version>-<triple>.tar.gz`, release tag `wai-v<version>`, web asset `wai-web-<version>.tar.gz`; installer environment `WAI_VERSION`, `WAI_HOME` (default `~/.wai`). ## Not done - No release, no tag, no registry publish. The tap and bucket drafts, Transaction-Science/homebrew-tap#1 and Transaction-Science/scoop-bucket#1, carry `SET-BY-THE-RELEASE` digests and install nothing until the release writes them. - The Windows build of the relay, the room service and the remote host has never run; the release's Windows leg is its first. `wai dev` on Windows stops its children with `kill()` rather than a signal. - The Linux archives measured here are glibc builds of the host; the release builds musl static ones, not yet built. - `android-app` is the sink's Kotlin API on the JVM; an Android application module (the AAR's `WaiPlayerSession` in an Activity) is not in the example, since it needs the Android SDK and NDK to build and was not built here. - `apple-app`'s player opens a window and was built, not driven; its test is the headless replay. - The study's `wai cloud login` and `wai deploy` are not here (not this builder's). - `wai dev` runs its relay and room service as child processes; a parent killed by a signal other than Ctrl-C (which reaches the whole process group) leaves them running. ## Decisions for the owner 1. **Package names.** `wai`, `wai-rs` and `wai-cli` are taken on crates.io, `wai`/`wai-cli` on npm, and "WAI" is also the W3C's Web Accessibility Initiative. Proposals: crate `wai-media` (library) and `waictl` or `wai-media-cli` (command line), npm `@transaction-science/wai`. The draft formula and manifest are named `wai` in our own tap and bucket, where the name is ours; say if they should be `wai-media`. 2. **Releasing:** push the tag `wai-v0.3.0` to run `wai-release.yml`, then merge the formula and manifest it attaches into the tap and the bucket in place of the drafts. 3. **The site's docs deploy after the release**: they name the tap, the bucket and `/install.sh`. 4. **The one hosted line**: the quickstart ends "To have the relay and the room service run for you rather than on your own machines, see waiTransport", linking its site, which today offers that by email. Keep, reword, or drop. The site branch is `docs-quickstart` of wai-transaction-science-web (pushed, not deployed): /docs/, /docs/quickstart/, /docs/examples/, /docs/sdk/, /docs/api/, each with a `.md` twin, /llms.txt indexing them, "Build this" links from the room and cargo demos, /install.sh. DX-B's `wai mcp` / `wai setup-agent` and its `openapi.json` are referenced (READMEs, `/docs/api/`) but are in their PR; both PRs edit `src/bin/wai.rs`'s usage and `main()`, a small merge. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
wai-rs gains the feature floor (the mandatory floor of SPEC 5: PNG, FLAC and
zstd, decoded with no system codec library) and quickstart (the floor, and the
receipt checks hello and verify run). The wai command line gains four verbs,
one module each, named in one table (dx::VERBS):

- hello: name, dispatch, rebuild and receipt on a picture made here, the
  receipt laid out as http-delivery 8 lays receipts beside an object;
- create: a new project from one of the examples, whose files the binary
  holds; tests/cli_dx.rs holds them to wai/examples/ byte for byte;
- dev: the relay, the room service and the room page on one loopback origin,
  as a production front serves them; --check checks each piece through it;
- verify: the receipt indexes under a directory, checked offline.

The project file a template writes, wai.json, is read in one place
(dx/project.rs). wai/examples/ holds video-room, watch-together, messaging,
encoder-ingest, package-and-deliver, verify-receipts, apple-app, android-app
and remote-desktop, each with a README and a test that runs it through
wai create and wai dev. wai/quickstart/ builds the room client and the
archive that holds wai, the relay, the room service, the remote host and the
packager.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The relay refuses a subscription to a track nobody publishes yet
(DOES_NOT_EXIST): the example now calls first, or waits for the encoder, and
asks again until the gateway's tracks are there. The Rust examples' tests
find their binaries under CARGO_TARGET_DIR when it is set.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
.github/workflows/wai-examples.yml runs each example through wai create and
wai dev: the portable ones on linux, the archive as the release builds it,
the quickstart's readiness check (wai dev --check from the unpacked archive),
the browser examples and apple-app on macos, android-app on linux-arm64.
wai-conformance.yml runs tests/floor.rs and tests/cli_dx.rs, and fires on
wai/examples/ (the templates are compiled into wai). wai-release.yml, on a
tag wai-v<version>, builds the room client once and the archive on each
runner, attaches them with their SHA-256, and writes the Homebrew formula
and the Scoop manifest; wai/quickstart/install.sh installs a release.

Two clippy notes of the new code fixed (a type alias for a template's files;
hex only where hello and verify are built).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai/quickstart/test/clean-machine.sh runs the quickstart from the archive
alone in a fresh HOME and directory, with the system's PATH: the archive
checked against its SHA-256 and unpacked, wai hello, wai verify, wai create,
wai dev --check, and, with --browser, the room joined in two pages. It times
each step and fails naming the step that failed. The encoder-ingest example
takes clippy's is_multiple_of.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai also builds as a cdylib, so its rlib's file name carries no hash: under a
CARGO_TARGET_DIR every workspace shares, the room service's build of wai (its
own feature set) overwrote the quickstart's, and a later build of the wai
binary linked the wrong one and failed. The failure was masked inside a
command substitution, and the archive took a binary from an earlier build.
Each build now has its own directory under a shared one, a failed build
stops the script naming it, and before packaging the script creates every
template with the packaged wai and compares it with wai/examples/ byte for
byte.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
wai/quickstart/test/clean-machine.sh: a failed step reads FAILED, with no unit
All checks were successful
WAI examples / WAI examples · portable · linux (pull_request) Successful in 8m20s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m7s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 3m8s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 11m20s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m45s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 16m36s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 10m7s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m54s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 3m36s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 12m25s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 38s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m47s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 17m25s
wai-pack / wai-pack · linux (pull_request) Successful in 1m40s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m25s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 6m32s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 5m44s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m31s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 18m45s
wai-ledger service / service · macos (pull_request) Successful in 50s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 19m27s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m4s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 3m8s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m11s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 12m17s
wai-pack / wai-pack · macos (pull_request) Successful in 3m13s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 10m1s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 7m1s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 14m59s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 56m20s
ed700a752a
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!504
No description provided.