open-standards/wai/schema/wai-json-1.schema.json
Transaction Science f6bfd71ca9
Some checks failed
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 1m7s
wai-app and Create / wai-app · does this change touch it (push) Successful in 1m44s
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 1m46s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 2m41s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 19s
wai-quantum energy-landscape jobs / does this change touch it (push) Successful in 23s
wai-key-proxy / does this change touch it (push) Successful in 1m54s
wai-quantum studio and desktop / does this change touch it (push) Successful in 1m51s
WAI operation catalogue / does this change touch it (push) Successful in 3m25s
wai key · Windows / does this change touch it (push) Successful in 1m58s
wai-fleet service / does this change touch it (push) Successful in 2m22s
wai-quantum for JavaScript / does this change touch it (push) Successful in 1m56s
wai-audit collector and player integration / does this change touch it (push) Successful in 3m34s
wai-ledger service / does this change touch it (push) Successful in 1m56s
wai-sink-android native sink library / does this change touch it (push) Successful in 1m28s
wai-sink-swift native sink package / does this change touch it (push) Successful in 1m26s
WAI Studio / does this change touch it (push) Successful in 1m32s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Successful in 1m32s
wai-quantum energy-landscape jobs / the same bits · macos (push) Successful in 5m53s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Successful in 8m50s
wai-fleet service / service · macos (push) Successful in 1m21s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 4m43s
wai-ledger service / service · macos (push) Successful in 1m48s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Successful in 1m59s
WAI Studio / Studio in Chromium and Firefox · macos (push) Failing after 2m51s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Failing after 14m14s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Successful in 6m29s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Successful in 31s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
wai-audit collector and player integration / collector · linux (push) Has been cancelled
WAI operation catalogue / the catalogue and every door · linux (push) Has been cancelled
wai-quantum for JavaScript / javascript · linux (push) Has been cancelled
wai-quantum studio and desktop / studio · browser (push) Has been cancelled
wai-quantum studio and desktop / desktop app · linux (push) Has been cancelled
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Has been cancelled
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Has been cancelled
WAI Studio / Studio in WebKit · linux (push) Has been cancelled
wai-quantum studio and desktop / desktop app · windows (push) Has been cancelled
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Has been cancelled
wai key · Windows / wai key and the toolchain's tests · windows (push) Failing after 1m40s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Failing after 1m51s
wai-key-proxy / proxy · linux (push) Successful in 1m25s
wai-ledger service / service · linux (push) Successful in 2m16s
wai-quantum energy-landscape jobs / the module under wasm32-wasip2 (wasmtime) (push) Successful in 3m46s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 5m14s
wai-quantum energy-landscape jobs / native against WebAssembly, over many seeds (push) Successful in 6m33s
wai-fleet service / service · linux (push) Successful in 7m5s
wai-quantum energy-landscape jobs / reader, kernels, answers and the stated result · linux, release (push) Successful in 11m35s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Successful in 2m6s
joule-moq-room room service / joule-moq-room, every target (push) Successful in 5m44s
wai-quantum energy-landscape jobs / the same bits · linux-arm64 (push) Successful in 7m52s
wai target and wai auth: a named service and a kept key, and one --target on every operation that acts on a service
- wai target add|use|list|remove (target.create, .update, .list, .delete): a name for a service's
  address, kept in the project's wai.json (its new targets member, in the schema) or the person's
  own list, never with a key; --read-only refuses every change (exit 3, target-read-only).
- wai auth login|status|logout (credential.create, .list, .delete): the key read from standard
  input, kept for its origin in the keychain on macOS or a file only its owner reads; WAI_TOKEN
  ahead of it; sent as a bearer over https:// or to this machine alone; never in wai.json, a
  list, output, a plan, a log or an error, a service's echo of it redacted.
- --target is catalogue::TARGET wherever it is taken, on operations placed off this machine: the
  fleet's four take a target's name or an address; an unknown name is exit 5, target-not-found.
- The forty operations of the room service's API answer to their mechanical form, sent to their
  route under the target (--query, --body), a change waiting for --yes, a dry run sending nothing.
- wai mcp --target serves them as tools, changes only to a target on this machine or with
  --allow-write; never with --read-only or to a read-only target.
- wai stage refine --toward, --target its deprecated spelling there (wai/DEPRECATIONS.md).
- tests/cli_target.rs, against a stand-in service; ops.json and Studio's actions regenerated.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-08 09:39:06 -05:00

161 lines
7 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://wai.transaction.science/schema/wai.json/1",
"title": "wai.json, a WAI project file, version 1",
"description": "The project file `wai create` writes and `wai dev`, `wai app check`, `wai create`, `wai lock`, `wai check` and `wai build` read. Every member is optional; a member not listed here is refused. Paths are relative to the file's directory. A whole number may be written with a zero fraction (4.0 is 4), and none is above 9007199254740991 (2^53 - 1), the largest every JSON reader holds exactly. Secrets never belong in it.",
"type": "object",
"additionalProperties": false,
"properties": {
"$schema": {
"description": "This schema: an editor or an agent validates the file with it.",
"const": "https://wai.transaction.science/schema/wai.json/1"
},
"wai": {
"description": "The project file's version. A file without it is of version 1; a reader of version 1 refuses a later one.",
"const": 1
},
"name": {
"description": "The project's machine name, the name it is deployed by: a DNS label, lowercase letters, digits and hyphens, at most 63, beginning with a letter and not ending with a hyphen. `wai create` names a project for its directory.",
"type": "string",
"pattern": "^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$"
},
"template": {
"description": "The template the project was made from.",
"type": "string"
},
"title": {
"description": "The project's title, for people.",
"type": "string"
},
"summary": {
"description": "One line on what the project does.",
"type": "string"
},
"app": {
"description": "A program made with Create (app.oui), which the project's page renders: a path relative to the file.",
"type": "string"
},
"requires": {
"description": "What the project needs; `wai check` holds it to this wai's registry.",
"type": "object",
"additionalProperties": false,
"properties": {
"capabilities": {
"description": "The registered capabilities the project needs. One that decodes against a parameter set needs a parameter set named under `priors`.",
"type": "array",
"items": { "type": "string" }
}
}
},
"priors": {
"description": "Each parameter set the project decodes against, by the name it goes by: a path relative to the file, a directory (a wai.prior.set, whose listing is pinned) or one file. `wai lock` pins each by its digest.",
"type": "object",
"additionalProperties": { "type": "string" }
},
"package": {
"description": "What `wai build` packages with the reference packager, into dist/.",
"type": "object",
"additionalProperties": false,
"required": ["policy"],
"properties": {
"policy": {
"description": "The packaging policy (wai.pack.policy/1): a path relative to the file. `wai lock` pins its canonical digest.",
"type": "string"
},
"sources": {
"description": "A component's source by its id, where it is not the one the policy names: a path relative to the file.",
"type": "object",
"additionalProperties": { "type": "string" }
},
"out": {
"description": "The package's directory under dist/; `package` when absent.",
"type": "string"
}
}
},
"conform": {
"description": "What the project conforms against.",
"type": "object",
"additionalProperties": false,
"properties": {
"suites": {
"description": "Conformance suites, each <kind>/<suite> as `wai conform --list` names them. `wai lock` pins each corpus by its digest.",
"type": "array",
"items": { "type": "string", "pattern": "^[a-z-]+/[a-z-]+$" }
}
}
},
"targets": {
"description": "The services the project's operations act on, by the name `--target` gives (`wai target add` writes it). A target is an address and whether it is read-only, never a key: `wai auth login` keeps a key, outside the project, and a member of a target that is not listed here is refused.",
"type": "object",
"propertyNames": { "pattern": "^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$", "not": { "const": "local" } },
"additionalProperties": {
"type": "object",
"additionalProperties": false,
"required": ["url"],
"properties": {
"url": {
"description": "The service's address: http:// or https://, a host in lowercase (an IPv6 literal in brackets), a port of 1 to 65535 and the path the service is under; no user, no query and no fragment.",
"type": "string",
"pattern": "^https?://([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*|\\[[0-9a-f:.]+\\])(:([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?(/[A-Za-z0-9._~!$&'()*+,;=:%/-]*)?$"
},
"read_only": {
"description": "Whether every operation that would change the service is refused, before anything is sent.",
"type": "boolean"
}
}
}
},
"dev": {
"description": "What `wai dev` runs in the project's directory; a flag on its command line wins over each member.",
"type": "object",
"additionalProperties": false,
"properties": {
"site": {
"description": "The directory served at /, the project's own page: a path relative to the file.",
"type": "string"
},
"page": {
"description": "The page `wai dev` names first when it is ready, a path on its origin.",
"type": "string"
},
"mode": {
"description": "The room `wai dev` runs: a room, a watch room, a call, a remote desktop room, or a show (a room with co-performance: hosts on camera and an audience that votes).",
"enum": ["room", "watch", "call", "remote", "show"]
},
"publishers": {
"description": "Publishers at once.",
"type": "integer",
"minimum": 0,
"maximum": 4294967295
},
"watch": {
"description": "A watch room's source: a path relative to the file.",
"type": "string"
},
"watch_ms": {
"description": "The source's duration in milliseconds, where it is not a WAV file.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"messaging": {
"description": "A conversation beside the room.",
"type": "boolean"
},
"e2ee": {
"description": "The room end-to-end encrypted.",
"type": "boolean"
},
"audience": {
"description": "A show's inputs per viewer per poll; a show's alone.",
"type": "integer",
"minimum": 1,
"maximum": 255
}
},
"if": { "required": ["audience"] },
"then": { "required": ["mode"], "properties": { "mode": { "const": "show" } } }
}
}
}