{
  "format": "wai.ops/1",
  "toolchain": "0.4.0",
  "envelope": "envelope/1",
  "exit_codes": [
    {
      "exit": 0,
      "meaning": "done; every check held"
    },
    {
      "exit": 1,
      "meaning": "ran, and a check failed"
    },
    {
      "exit": 2,
      "meaning": "usage error or invalid input"
    },
    {
      "exit": 3,
      "meaning": "authentication or permission"
    },
    {
      "exit": 4,
      "meaning": "confirmation required; nothing changed"
    },
    {
      "exit": 5,
      "meaning": "not found (file, target, room, operation)"
    },
    {
      "exit": 6,
      "meaning": "target unavailable; safe to retry"
    },
    {
      "exit": 7,
      "meaning": "internal error"
    }
  ],
  "agent_flags": [
    {
      "flag": "--json",
      "summary": "one JSON envelope on stdout: {\"wai\": \"envelope/1\", \"op\", \"ok\", \"data\" | \"error\"}",
      "aliases": []
    },
    {
      "flag": "--dry-run",
      "summary": "write nothing and send nothing; say what would be done (an operation that only reads ignores it)",
      "aliases": []
    },
    {
      "flag": "--yes",
      "summary": "confirm a change that waits for confirmation; off a terminal, without it, exit 4",
      "aliases": [
        {
          "flag": "--confirm",
          "deprecated": {
            "since": "0.3.0",
            "use_instead": "--yes"
          }
        }
      ]
    },
    {
      "flag": "--no-input",
      "summary": "never ask: a change that waits for confirmation exits 4 unless --yes is given",
      "aliases": []
    }
  ],
  "operations": [
    {
      "id": "toolchain.test",
      "summary": "WAI's four steps (name, dispatch, rebuild, receipt) on a picture made here, its receipt checked offline",
      "cli": "wai hello",
      "aliases": [],
      "usage": [
        "wai hello [<dir>]   WAI's four steps (name, dispatch, rebuild, receipt) on a sample, written to <dir> (wai-hello)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "dir": {
            "type": "string",
            "format": "path",
            "description": "Where the object and its receipts are written (wai-hello).",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai toolchain test",
        "mcp": null,
        "c": "wai_toolchain_test",
        "rust": "wai::toolchain::test",
        "sdk": "wai.toolchain.test"
      }
    },
    {
      "id": "project.create",
      "summary": "A new project from one of the examples, written into a new or empty directory; --list names the templates",
      "cli": "wai create",
      "aliases": [],
      "usage": [
        "wai create <dir> --template <name> | create --list   a new project from one of the examples"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "dir": {
            "type": "string",
            "format": "path",
            "description": "A directory that does not exist or is empty.",
            "x-cli": {
              "positional": true
            }
          },
          "template": {
            "type": "string",
            "description": "The template, one of `wai create --list`.",
            "x-cli": {
              "flag": "--template"
            }
          },
          "list": {
            "type": "boolean",
            "description": "List the templates instead.",
            "x-cli": {
              "flag": "--list"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "array",
        "items": {
          "type": "object",
          "required": [
            "template",
            "title",
            "files"
          ]
        }
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai project create",
        "mcp": null,
        "c": "wai_project_create",
        "rust": "wai::project::create",
        "sdk": "wai.project.create"
      }
    },
    {
      "id": "project.lock",
      "summary": "wai.lock written beside wai.json: everything whose bytes change a result pinned by digest, the same bytes on any host; --check refuses a stale or edited lock",
      "cli": "wai lock",
      "aliases": [],
      "usage": [
        "wai lock [<dir>] [--check] [--root <wai-dir>] [--packer BIN]   write wai.lock; --check holds it to what it pins, exit 1 when it is stale or was edited"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "dir": {
            "type": "string",
            "format": "path",
            "description": "The project's directory (.).",
            "x-cli": {
              "positional": true
            }
          },
          "check": {
            "type": "boolean",
            "description": "Write nothing: hold the file to what it pins.",
            "x-cli": {
              "flag": "--check"
            }
          },
          "root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory of a checkout of the standard, for the corpora conform.suites names (found from the current directory otherwise).",
            "x-cli": {
              "flag": "--root"
            }
          },
          "packer": {
            "type": "string",
            "format": "path",
            "description": "wai-pack, for the policy package.policy names ($WAI_PACK_BIN, beside wai, or on PATH otherwise).",
            "x-cli": {
              "flag": "--packer"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "file",
          "sha256"
        ],
        "description": "The lock file and its SHA-256; written, whether it changed, what it pins and what it leaves absent; with --check, each check as wai check reports it"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai project lock",
        "mcp": "project_lock",
        "c": "wai_project_lock",
        "rust": "wai::project::lock",
        "sdk": "wai.project.lock"
      }
    },
    {
      "id": "project.check",
      "summary": "A project validated without building it: wai.json, each file it states, its app, and wai.lock against what it pins, every finding reported; what could not run says not checked",
      "cli": "wai check",
      "aliases": [],
      "usage": [
        "wai check [<dir>] [--root <wai-dir>] [--packer BIN]   exit 1 when a check failed, 5 when none failed and one or more could not run"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "dir": {
            "type": "string",
            "format": "path",
            "description": "The project's directory (.).",
            "x-cli": {
              "positional": true
            }
          },
          "root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory of a checkout of the standard, for the corpora conform.suites names (found from the current directory otherwise).",
            "x-cli": {
              "flag": "--root"
            }
          },
          "packer": {
            "type": "string",
            "format": "path",
            "description": "wai-pack, for the policy package.policy names ($WAI_PACK_BIN, beside wai, or on PATH otherwise).",
            "x-cli": {
              "flag": "--packer"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "project",
          "digest",
          "lock",
          "checks",
          "held",
          "failed",
          "not_checked"
        ],
        "description": "The project file and its canonical digest, the lock and its digest, and each check with what it found: held, failed or not checked, with a stable code, a hint for what did not hold or did not run, and fix, the command that fixes it where one does (run wai lock for a lock that is stale, was edited or is not there), null otherwise"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai project check",
        "mcp": "project_check",
        "c": "wai_project_check",
        "rust": "wai::project::check",
        "sdk": "wai.project.check"
      }
    },
    {
      "id": "project.build",
      "summary": "dist/ written for a project whose checks hold: the same bytes from the same project and lock, with a build record naming the digests of wai.json and wai.lock",
      "cli": "wai build",
      "aliases": [],
      "usage": [
        "wai build [<dir>] [--key <seed file>] [--packer BIN] [--root <wai-dir>]   write dist/; refused, nothing written, when a check fails or the lock is stale"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "dir": {
            "type": "string",
            "format": "path",
            "description": "The project's directory (.).",
            "x-cli": {
              "positional": true
            }
          },
          "key": {
            "type": "string",
            "format": "path",
            "description": "The seed file (64 hexadecimal digits) that signs a package's receipt, for a project with package.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "packer": {
            "type": "string",
            "format": "path",
            "description": "wai-pack, for a project with package ($WAI_PACK_BIN, beside wai, or on PATH otherwise).",
            "x-cli": {
              "flag": "--packer"
            }
          },
          "root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory of a checkout of the standard, for the corpora conform.suites names (found from the current directory otherwise).",
            "x-cli": {
              "flag": "--root"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "dir",
          "record",
          "record_only",
          "project_sha256",
          "lock_sha256",
          "files",
          "left_out",
          "not_checked"
        ],
        "description": "The tree written and its build record with the record's SHA-256, the digests of the project file and the lock it names, its files (record_only when the project states nothing for wai to build), what the site holds that it left out and why, and what could not be checked; refused, the checks as wai check reports them, each with its fix"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai project build",
        "mcp": "project_build",
        "c": "wai_project_build",
        "rust": "wai::project::build",
        "sdk": "wai.project.build"
      }
    },
    {
      "id": "dev.start",
      "summary": "A relay, a room service and the room page on one origin on this machine, for development; --check starts, checks every piece and stops",
      "cli": "wai dev",
      "aliases": [],
      "usage": [
        "wai dev [--port P] [--dir D] [--site DIR] [--watch FILE [--watch-ms MS]] [--call] [--remote]",
        "    [--show [--audience N]] [--messaging] [--e2ee] [--publishers N] [--check] [--for S] [--web DIR]",
        "    [--relay BIN] [--room BIN]",
        "  --port P         the origin's port on 127.0.0.1 (8080; 0 picks a free one)",
        "  --dir D          keys, configuration and logs (.wai/dev)",
        "  --site DIR       your page: DIR is served at /, the room client beside it at /room/",
        "  --publishers N   places in the room (4)",
        "  --watch FILE     a watch room: everyone in it watches FILE together (.wav, .webm, .mp4,",
        "                   .ogg, .mp3); --watch-ms MS its duration, read from a WAV file's header",
        "  --call           the room is a call: /room/call.html places one, rings, answers",
        "  --remote         the room is one host's shared screen; prints the host's invitation",
        "  --show           the room is a show: hosts on camera, an audience that votes in polls",
        "                   the room's clock opens and signs (co-performance); --audience N each",
        "                   viewer's inputs to a poll (1)",
        "  --messaging      a conversation beside the room, at /msg-api/: /room/messages.html",
        "  --e2ee           every room end-to-end encrypted",
        "  --check          start, check every piece through the origin, report, stop",
        "  --for S          stop after S seconds",
        "  --web DIR        the room client's files (beside this binary: ../share/wai/web; $WAI_WEB)",
        "  --relay BIN      wai-relay (beside this binary, then $PATH; $WAI_RELAY_BIN)",
        "  --room BIN       wai-room (beside this binary, then $PATH; $WAI_ROOM_BIN)",
        "  WAI Studio is served at /_wai/ when its files are found ($WAI_STUDIO, or share/wai/studio",
        "  beside this binary).",
        "  A wai.json in the current directory (`wai create` writes one) gives the defaults; a flag",
        "  wins over it. Ctrl-C stops everything. With --json and without --check, the first line",
        "  is {\"ready\": true, ...}."
      ],
      "placement": "local",
      "effect": "runs",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "dev",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "port": {
            "type": "integer",
            "description": "The origin's port on 127.0.0.1 (8080; 0 picks a free one).",
            "x-cli": {
              "flag": "--port"
            }
          },
          "dir": {
            "type": "string",
            "format": "path",
            "description": "Keys, configuration and logs (.wai/dev).",
            "x-cli": {
              "flag": "--dir"
            }
          },
          "site": {
            "type": "string",
            "format": "path",
            "description": "A directory served at /.",
            "x-cli": {
              "flag": "--site"
            }
          },
          "watch": {
            "type": "string",
            "format": "path",
            "description": "A file everyone in a watch room watches together.",
            "x-cli": {
              "flag": "--watch"
            }
          },
          "watch_ms": {
            "type": "integer",
            "description": "The watch file's duration in milliseconds.",
            "x-cli": {
              "flag": "--watch-ms"
            }
          },
          "call": {
            "type": "boolean",
            "description": "The room is a call.",
            "x-cli": {
              "flag": "--call"
            }
          },
          "remote": {
            "type": "boolean",
            "description": "The room is one host's shared screen.",
            "x-cli": {
              "flag": "--remote"
            }
          },
          "show": {
            "type": "boolean",
            "description": "The room is a show: hosts on camera, an audience that votes in polls.",
            "x-cli": {
              "flag": "--show"
            }
          },
          "audience": {
            "type": "integer",
            "description": "With --show, each viewer's inputs to a poll (1).",
            "x-cli": {
              "flag": "--audience"
            }
          },
          "messaging": {
            "type": "boolean",
            "description": "A conversation beside the room.",
            "x-cli": {
              "flag": "--messaging"
            }
          },
          "e2ee": {
            "type": "boolean",
            "description": "Every room end-to-end encrypted.",
            "x-cli": {
              "flag": "--e2ee"
            }
          },
          "publishers": {
            "type": "integer",
            "description": "Places in the room (4).",
            "x-cli": {
              "flag": "--publishers"
            }
          },
          "check": {
            "type": "boolean",
            "description": "Start, check every piece, report and stop.",
            "x-cli": {
              "flag": "--check"
            }
          },
          "for_s": {
            "type": "integer",
            "description": "Stop after this many seconds.",
            "x-cli": {
              "flag": "--for"
            }
          },
          "web": {
            "type": "string",
            "format": "path",
            "description": "The room client's files.",
            "x-cli": {
              "flag": "--web"
            }
          },
          "relay": {
            "type": "string",
            "format": "path",
            "description": "The relay's binary.",
            "x-cli": {
              "flag": "--relay"
            }
          },
          "room": {
            "type": "string",
            "format": "path",
            "description": "The room service's binary.",
            "x-cli": {
              "flag": "--room"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "ready",
          "seconds",
          "steps",
          "checks",
          "origin"
        ]
      },
      "stream": {
        "type": "object",
        "required": [
          "ready"
        ],
        "properties": {
          "ready": {
            "type": "boolean"
          },
          "origin": {
            "type": "string"
          }
        }
      },
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai dev start",
        "mcp": "dev_start",
        "c": "wai_dev_start",
        "rust": "wai::dev::start",
        "sdk": "wai.dev.start"
      }
    },
    {
      "id": "receipt.verify",
      "summary": "Every receipt index (*.wai.receipts) under each path, its group receipts and claims checked offline, and every conformance result, fleet report bundle and envelope there",
      "cli": "wai verify",
      "aliases": [],
      "usage": [
        "wai verify <path>... [--conformant [--root <wai-dir>]]   the receipts (receipt indexes *.wai.receipts), conformance",
        "    results (*.wai-conform.json), fleet report bundles (*.wai-fleet.json) and envelopes' pins (*.wai) under each path,",
        "    checked offline; --conformant admits a result only for a run that passed against this checkout's corpus,",
        "    and gives each area the results' suites are in a verdict"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "paths": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Files or directories holding receipt indexes, conformance results, fleet report bundles or envelopes.",
            "x-cli": {
              "positional": true
            }
          },
          "conformant": {
            "type": "boolean",
            "description": "Admit each conformance result only when its run passed, against the corpus of a checkout.",
            "x-cli": {
              "flag": "--conformant"
            }
          },
          "root": {
            "type": "string",
            "format": "path",
            "description": "With --conformant, the wai/ directory of the checkout whose corpus a result names.",
            "x-cli": {
              "flag": "--root"
            }
          }
        },
        "required": [
          "paths"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai receipt verify",
        "mcp": "receipt_verify",
        "c": "wai_receipt_verify",
        "rust": "wai::receipt::verify",
        "sdk": "wai.receipt.verify"
      }
    },
    {
      "id": "envelope.inspect",
      "summary": "What an envelope holds and whether this build decodes it: media, intent, pin, capability, fallback, the dispatch verdict and the conformance checks",
      "cli": "wai inspect",
      "aliases": [],
      "usage": [
        "wai inspect <in.wai>   what a WAI1 or WAI2 envelope holds, and the verdict of SPEC §4's dispatch here"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "format": "path",
            "description": "A .wai envelope.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "path"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai envelope inspect",
        "mcp": "envelope_inspect",
        "c": "wai_envelope_inspect",
        "rust": "wai::envelope::inspect",
        "sdk": "wai.envelope.inspect"
      }
    },
    {
      "id": "envelope.wrap",
      "summary": "Carry a registered capability's bytes in an envelope, byte for byte, under SPEC's intent, role and candidate rules",
      "cli": "wai wrap",
      "aliases": [],
      "usage": [
        "wai wrap <capability> <payload> [-o out.wai] [--fallback <cap>] [--intent <intent>]",
        "    [--companion <cap> <payload>]...   WAI2: companions bound to the payload"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string",
            "description": "A registered capability (`wai capabilities`).",
            "x-cli": {
              "positional": true
            }
          },
          "payload": {
            "type": "string",
            "format": "path",
            "description": "The bytes to carry.",
            "x-cli": {
              "positional": true
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The envelope (out.wai).",
            "x-cli": {
              "flag": "-o"
            }
          },
          "fallback": {
            "type": "string",
            "description": "A WAI1 fallback capability.",
            "x-cli": {
              "flag": "--fallback"
            }
          },
          "intent": {
            "type": "string",
            "description": "The envelope's intent (replicate where SPEC §7 allows it).",
            "x-cli": {
              "flag": "--intent"
            }
          },
          "companion": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A companion capability and its payload, bound to the payload.",
            "x-cli": {
              "flag": "--companion"
            }
          }
        },
        "required": [
          "capability",
          "payload"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai envelope wrap",
        "mcp": "envelope_wrap",
        "c": "wai_envelope_wrap",
        "rust": "wai::envelope::wrap",
        "sdk": "wai.envelope.wrap"
      }
    },
    {
      "id": "envelope.unwrap",
      "summary": "An envelope's capability and its checks, and with -o its payload or one component, exactly as wrapped",
      "cli": "wai unwrap",
      "aliases": [],
      "usage": [
        "wai unwrap <in.wai> [-o payload] [--component <i>]   extract any registered capability's bytes"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "format": "path",
            "description": "A .wai envelope.",
            "x-cli": {
              "positional": true
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "Where the payload is written.",
            "x-cli": {
              "flag": "-o"
            }
          },
          "component": {
            "type": "integer",
            "description": "A WAI2 component's index.",
            "x-cli": {
              "flag": "--component"
            }
          }
        },
        "required": [
          "path"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai envelope unwrap",
        "mcp": null,
        "c": "wai_envelope_unwrap",
        "rust": "wai::envelope::unwrap",
        "sdk": "wai.envelope.unwrap"
      }
    },
    {
      "id": "media.encode",
      "summary": "Encode a file with a codec this build holds, in an envelope; AVC and HEVC through the device's own encoders, with a signed record",
      "cli": "wai encode",
      "aliases": [],
      "usage": [
        "wai encode <codec> <input> [-o out.wai] [-q quality]   codecs: png jpeg avif jxl jxl-lossless opus flac av1 av1-lossless zstd xz",
        "    a build with `floor` alone encodes png and zstd; the others need `codecs`",
        "    image codecs: .rgb (with .meta holding 'H W') or a PNG/JPEG file; audio: .f32 (raw mono float32)",
        "    with .meta holding the sample rate; video: packed RGB frames with .meta 'N H W fps_num fps_den';",
        "    text codecs: any file",
        "wai encode avc|hevc <in.y4m> [-o out.wai] [--encoder auto|platform|va|gpu-driver|software] [--library <path>]",
        "    [--device <node|ordinal>] [--hardware yes|no] [--kbps <n>] [--size WxH] [--idr-every <frames> |",
        "    --idr-plan <plan.txt>] [--es <out>] [--record <out.json> --key <name|seed>] [--meter <counter> [--rounds <n>]]",
        "    (a build with `platform_encode`)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "codec": {
            "type": "string",
            "description": "png, jpeg, avif, jxl, jxl-lossless, opus, flac, av1, av1-lossless, zstd, xz; or avc, hevc.",
            "x-cli": {
              "positional": true
            }
          },
          "input": {
            "type": "string",
            "format": "path",
            "description": "The file to encode.",
            "x-cli": {
              "positional": true
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The envelope (out.wai).",
            "x-cli": {
              "flag": "-o"
            }
          },
          "quality": {
            "type": "integer",
            "description": "Quality, 1 to 100 (75).",
            "x-cli": {
              "flag": "-q"
            }
          }
        },
        "required": [
          "codec",
          "input"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "any": [
          "floor",
          "codecs",
          "platform_encode"
        ]
      },
      "names": {
        "cli": "wai media encode",
        "mcp": null,
        "c": "wai_media_encode",
        "rust": "wai::media::encode",
        "sdk": "wai.media.encode"
      }
    },
    {
      "id": "media.decode",
      "summary": "Decode an envelope through SPEC §4's dispatch to raw samples, with a .meta file beside them",
      "cli": "wai decode",
      "aliases": [],
      "usage": [
        "wai decode <in.wai> -o <output>   a build with `floor` decodes png, flac and zstd; `codecs` the rest"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "format": "path",
            "description": "A .wai envelope.",
            "x-cli": {
              "positional": true
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The decoded samples.",
            "x-cli": {
              "flag": "-o"
            }
          }
        },
        "required": [
          "path",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "any": [
          "floor",
          "codecs"
        ]
      },
      "names": {
        "cli": "wai media decode",
        "mcp": null,
        "c": "wai_media_decode",
        "rust": "wai::media::decode",
        "sdk": "wai.media.decode"
      }
    },
    {
      "id": "media.generate",
      "summary": "Make a wai.generate.spectral picture natively and print its SHA-256, or write its instruction object",
      "cli": "wai generate",
      "aliases": [],
      "usage": [
        "wai generate --model <json> (--prompt <s> --seed <u32> --steps <n> | --instr <object>) --size WxH -o <out.rgb>",
        "    make a wai.generate.spectral picture (RGB8) and print its SHA-256; --sizes WxH,... --write-instr",
        "    <object> writes the instruction object of form v0 (SPEC §5)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "model": {
            "type": "string",
            "format": "path",
            "description": "The model file.",
            "x-cli": {
              "flag": "--model"
            }
          },
          "prompt": {
            "type": "string",
            "description": "The prompt.",
            "x-cli": {
              "flag": "--prompt"
            }
          },
          "seed": {
            "type": "integer",
            "description": "The seed.",
            "x-cli": {
              "flag": "--seed"
            }
          },
          "steps": {
            "type": "integer",
            "description": "The steps.",
            "x-cli": {
              "flag": "--steps"
            }
          },
          "instr": {
            "type": "string",
            "format": "path",
            "description": "An instruction object of form v0.",
            "x-cli": {
              "flag": "--instr"
            }
          },
          "size": {
            "type": "string",
            "description": "WxH.",
            "x-cli": {
              "flag": "--size"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The picture, RGB8.",
            "x-cli": {
              "flag": "-o"
            }
          }
        },
        "required": [
          "model"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "description": "The picture's or instruction object's digests, as `wai generate --json` prints them"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "generate"
        ]
      },
      "names": {
        "cli": "wai media generate",
        "mcp": null,
        "c": "wai_media_generate",
        "rust": "wai::media::generate",
        "sdk": "wai.media.generate"
      }
    },
    {
      "id": "media.inspect",
      "summary": "What a file is, from its bytes alone: the formats they fit with the bytes that say so, its tracks, its protection, and measures where no format is recognised",
      "cli": "wai identify",
      "aliases": [],
      "usage": [
        "wai identify <file> [--json]   any file, not only an envelope (extensions/media-identify.md); unknown stays unknown"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "format": "path",
            "description": "Any file.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "path"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "format",
          "size",
          "verdict",
          "candidates",
          "probes_accepted",
          "embedded",
          "embedded_capped",
          "measures"
        ],
        "description": "The formats the bytes fit, each with the bytes that say so and how far they were followed; what a probe accepted; signatures found inside; and measures that hold whatever the bytes are"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "identify"
        ]
      },
      "names": {
        "cli": "wai media inspect",
        "mcp": "media_inspect",
        "c": "wai_media_inspect",
        "rust": "wai::media::inspect",
        "sdk": "wai.media.inspect"
      }
    },
    {
      "id": "media.upscale",
      "summary": "Upscale a PNG exactly, by an integer network under a pinned prior, with a signed record a verifier recomputes",
      "cli": "wai upscale run",
      "aliases": [],
      "usage": [
        "wai upscale run <in.png> --prior <p.wsr> [--derivation sr2|sr4] -o <out.png>",
        "    [--record <out.json> --envelope <in.wai> --key <name|seed>] [--issued-at <date-time>] [--json]",
        "    an 8-bit RGB PNG; --record signs what exact-upscale §7 recomputes from --envelope and the prior"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "format": "path",
            "description": "An 8-bit RGB PNG.",
            "x-cli": {
              "positional": true
            }
          },
          "prior": {
            "type": "string",
            "format": "path",
            "description": "The WSR1 prior.",
            "x-cli": {
              "flag": "--prior"
            }
          },
          "derivation": {
            "type": "string",
            "description": "sr2 (the default) or sr4.",
            "x-cli": {
              "flag": "--derivation"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The picture, a PNG.",
            "x-cli": {
              "flag": "-o"
            }
          },
          "record": {
            "type": "string",
            "format": "path",
            "description": "The signed upscale record.",
            "x-cli": {
              "flag": "--record"
            }
          },
          "envelope": {
            "type": "string",
            "format": "path",
            "description": "The WAI1 of the input, which the record names.",
            "x-cli": {
              "flag": "--envelope"
            }
          },
          "key": {
            "type": "string",
            "description": "The record's signing key: its name in the keystore (wai key list), 64 hexadecimal digits, or a file holding them.",
            "x-cli": {
              "flag": "--key"
            }
          }
        },
        "required": [
          "path",
          "prior",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "width",
          "height",
          "subpixels",
          "files"
        ],
        "description": "What `wai upscale run` or `wai tonemap run` made: the subpixels it would bill, each file it wrote with its digest, and the record's link hash"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "exact_upscale"
        ]
      },
      "names": {
        "cli": "wai media upscale",
        "mcp": null,
        "c": "wai_media_upscale",
        "rust": "wai::media::upscale",
        "sdk": "wai.media.upscale"
      }
    },
    {
      "id": "upscale.verify",
      "summary": "An upscale record recomputed from its input and its prior, and the picture held to it",
      "cli": "wai upscale verify",
      "aliases": [],
      "usage": [
        "wai upscale verify <record.json> --envelope <in.wai> --prior <p.wsr> [--picture <out.png>]",
        "    the record's outcome as JSON (extensions/exact-upscale.md §7, under require-proof); exit 1 when it is refused"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "record": {
            "type": "string",
            "format": "path",
            "description": "The upscale record.",
            "x-cli": {
              "positional": true
            }
          },
          "envelope": {
            "type": "string",
            "format": "path",
            "description": "The WAI1 of the input, which the record names.",
            "x-cli": {
              "flag": "--envelope"
            }
          },
          "prior": {
            "type": "string",
            "format": "path",
            "description": "The WSR1 prior the record names.",
            "x-cli": {
              "flag": "--prior"
            }
          },
          "picture": {
            "type": "string",
            "format": "path",
            "description": "The picture: its samples are held to the record's output.",
            "x-cli": {
              "flag": "--picture"
            }
          }
        },
        "required": [
          "record",
          "envelope",
          "prior"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "outcome"
        ],
        "description": "accept, with the record's link hash and the subpixels it states; or refuse, with the reason and where"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "exact_upscale"
        ]
      },
      "names": {
        "cli": "wai upscale verify",
        "mcp": null,
        "c": "wai_upscale_verify",
        "rust": "wai::upscale::verify",
        "sdk": "wai.upscale.verify"
      }
    },
    {
      "id": "media.tonemap",
      "summary": "Render a still's gain map exactly at the headrooms named, with a signed record a verifier recomputes",
      "cli": "wai tonemap run",
      "aliases": [],
      "usage": [
        "wai tonemap run <in.wai> --headrooms <h,h,...> --out <dir> [--input-class <class>]",
        "    [--record <out.json> --key <name|seed>] [--issued-at <date-time>] [--json]",
        "    a WAI2 of a PNG base and its gain map; a headroom is in 1/10000 of a stop; each rendition is RGB16"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "format": "path",
            "description": "A WAI2 of a PNG base and its gain map.",
            "x-cli": {
              "positional": true
            }
          },
          "headrooms": {
            "type": "string",
            "description": "The headrooms, in 1/10000 of a stop, joined by commas.",
            "x-cli": {
              "flag": "--headrooms"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The directory the renditions are written in.",
            "x-cli": {
              "flag": "--out"
            }
          },
          "input_class": {
            "type": "string",
            "description": "The input's class (captured).",
            "x-cli": {
              "flag": "--input-class"
            }
          },
          "record": {
            "type": "string",
            "format": "path",
            "description": "The signed rendition record.",
            "x-cli": {
              "flag": "--record"
            }
          },
          "key": {
            "type": "string",
            "description": "The record's signing key: its name in the keystore (wai key list), 64 hexadecimal digits, or a file holding them.",
            "x-cli": {
              "flag": "--key"
            }
          }
        },
        "required": [
          "path",
          "headrooms",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "width",
          "height",
          "subpixels",
          "files"
        ],
        "description": "What `wai upscale run` or `wai tonemap run` made: the subpixels it would bill, each file it wrote with its digest, and the record's link hash"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "exact_tonemap"
        ]
      },
      "names": {
        "cli": "wai media tonemap",
        "mcp": null,
        "c": "wai_media_tonemap",
        "rust": "wai::media::tonemap",
        "sdk": "wai.media.tonemap"
      }
    },
    {
      "id": "tonemap.verify",
      "summary": "A rendition record recomputed from its envelope, and the renditions held to it",
      "cli": "wai tonemap verify",
      "aliases": [],
      "usage": [
        "wai tonemap verify <record.json> --envelope <in.wai> [--renditions <dir>]",
        "    the record's outcome as JSON (extensions/exact-tonemap.md §8, under require-proof); exit 1 when it is refused"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "record": {
            "type": "string",
            "format": "path",
            "description": "The rendition record.",
            "x-cli": {
              "positional": true
            }
          },
          "envelope": {
            "type": "string",
            "format": "path",
            "description": "The WAI2 the record names.",
            "x-cli": {
              "flag": "--envelope"
            }
          },
          "renditions": {
            "type": "string",
            "format": "path",
            "description": "The directory `wai tonemap run` wrote: each rendition is held to its picture.",
            "x-cli": {
              "flag": "--renditions"
            }
          }
        },
        "required": [
          "record",
          "envelope"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "outcome"
        ],
        "description": "accept, with the record's link hash and the subpixels it states; or refuse, with the reason and where"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "exact_tonemap"
        ]
      },
      "names": {
        "cli": "wai tonemap verify",
        "mcp": null,
        "c": "wai_tonemap_verify",
        "rust": "wai::tonemap::verify",
        "sdk": "wai.tonemap.verify"
      }
    },
    {
      "id": "score.build",
      "summary": "A WSCR score from integer note fields",
      "cli": "wai score build",
      "aliases": [],
      "usage": [
        "wai score build <notes.json> -o <out.wscr>   a WSCR from integer note fields"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "notes": {
            "type": "string",
            "format": "path",
            "description": "The note fields, JSON.",
            "x-cli": {
              "positional": true
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The score.",
            "x-cli": {
              "flag": "-o"
            }
          }
        },
        "required": [
          "notes",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "description": "The score's digests, as `wai score build|render --json` print them"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "score"
        ]
      },
      "names": {
        "cli": "wai score build",
        "mcp": null,
        "c": "wai_score_build",
        "rust": "wai::score::build",
        "sdk": "wai.score.build"
      }
    },
    {
      "id": "score.decode",
      "summary": "A score's reference mixdown and its digests (pcm_sha256, mixdown_blake3, score_hash)",
      "cli": "wai score render",
      "aliases": [],
      "usage": [
        "wai score render <in.wscr> [--pcm <out.s16>]   the reference mixdown and its digests"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "score": {
            "type": "string",
            "format": "path",
            "description": "A WSCR score.",
            "x-cli": {
              "positional": true
            }
          },
          "pcm": {
            "type": "string",
            "format": "path",
            "description": "Where the mixdown is written.",
            "x-cli": {
              "flag": "--pcm"
            }
          }
        },
        "required": [
          "score"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "description": "The score's digests, as `wai score build|render --json` print them"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "score"
        ]
      },
      "names": {
        "cli": "wai score decode",
        "mcp": null,
        "c": "wai_score_decode",
        "rust": "wai::score::decode",
        "sdk": "wai.score.decode"
      }
    },
    {
      "id": "encoder.list",
      "summary": "What each encoder interface offers on this device, for AVC and HEVC",
      "cli": "wai encoders",
      "aliases": [],
      "usage": [
        "wai encoders [--library <path>]   what each encoder interface offers here"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "library": {
            "type": "string",
            "format": "path",
            "description": "A software encoder library.",
            "x-cli": {
              "flag": "--library"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "platform_encode"
        ]
      },
      "names": {
        "cli": "wai encoder list",
        "mcp": null,
        "c": "wai_encoder_list",
        "rust": "wai::encoder::list",
        "sdk": "wai.encoder.list"
      }
    },
    {
      "id": "encoder.verify",
      "summary": "A signed encode record checked, against the stream and its source where given",
      "cli": "wai encode-record verify",
      "aliases": [],
      "usage": [
        "wai encode-record verify <record.json> [--stream <es>] [--source <in.y4m>]"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "record": {
            "type": "string",
            "format": "path",
            "description": "The signed record.",
            "x-cli": {
              "positional": true
            }
          },
          "stream": {
            "type": "string",
            "format": "path",
            "description": "The elementary stream it names.",
            "x-cli": {
              "flag": "--stream"
            }
          },
          "source": {
            "type": "string",
            "format": "path",
            "description": "The source it names.",
            "x-cli": {
              "flag": "--source"
            }
          }
        },
        "required": [
          "record"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "platform_encode"
        ]
      },
      "names": {
        "cli": "wai encoder verify",
        "mcp": null,
        "c": "wai_encoder_verify",
        "rust": "wai::encoder::verify",
        "sdk": "wai.encoder.verify"
      }
    },
    {
      "id": "package.build",
      "summary": "A package packed by the reference packager wai-pack from a policy, a source per component and a supplied floor, with its signed package receipt",
      "cli": "wai package build",
      "aliases": [],
      "usage": [
        "wai package build --policy <policy.toml> --out <dir> --key <seed.hex> [--source <id>=<file>]... [--floor <dir>]",
        "    [--signer-id <id>] [--meter none|model:<mW>] [--packer <wai-pack>] [wai-pack pack's other flags]",
        "    the reference packager's pack (extensions/packaging.md): the policy's components packed into <dir>, new or empty,",
        "    with the package receipt (package.receipt.json); the packer is --packer, $WAI_PACK_BIN, wai-pack beside wai,",
        "    or wai-pack on PATH"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "policy": {
            "type": "string",
            "format": "path",
            "description": "The packaging policy (extensions/packaging.md §3).",
            "x-cli": {
              "flag": "--policy"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "A new or empty directory, written with the package.",
            "x-cli": {
              "flag": "--out"
            }
          },
          "key": {
            "type": "string",
            "format": "path",
            "description": "The packager's signing key: a 32-byte seed, in hexadecimal.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "source": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A component's source, <id>=<file>; each component's own by default.",
            "x-cli": {
              "flag": "--source"
            }
          },
          "floor": {
            "type": "string",
            "format": "path",
            "description": "A supplied floor's directory (floor/ beside the policy by default).",
            "x-cli": {
              "flag": "--floor"
            }
          },
          "signer_id": {
            "type": "string",
            "description": "The receipt's signer id (the key's did:key by default).",
            "x-cli": {
              "flag": "--signer-id"
            }
          },
          "meter": {
            "type": "string",
            "description": "none, or model:<milliwatts>: the meter of the receipt's figure.",
            "x-cli": {
              "flag": "--meter"
            }
          },
          "packer": {
            "type": "string",
            "format": "path",
            "description": "The packer's binary (wai-pack).",
            "x-cli": {
              "flag": "--packer"
            }
          }
        },
        "required": [
          "policy",
          "out",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": null,
      "names": {
        "cli": "wai package build",
        "mcp": null,
        "c": "wai_package_build",
        "rust": "wai::package::build",
        "sdk": "wai.package.build"
      }
    },
    {
      "id": "package.verify",
      "summary": "A package verified by the reference packager wai-pack: every reason it is refused, or its counts and pack digest",
      "cli": "wai package verify",
      "aliases": [],
      "usage": [
        "wai package verify <dir> [--parent <dir>] [--packer <wai-pack>]   the reference packager's verify",
        "    (extensions/packaging.md §9): the package's receipt, stage indexes, objects and floor; with --parent, a re-pack against",
        "    the package its receipt names; exit 1 when refused"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "dir": {
            "type": "string",
            "format": "path",
            "description": "The package's directory.",
            "x-cli": {
              "positional": true
            }
          },
          "parent": {
            "type": "string",
            "format": "path",
            "description": "The package a re-pack's receipt names.",
            "x-cli": {
              "flag": "--parent"
            }
          },
          "packer": {
            "type": "string",
            "format": "path",
            "description": "The packer's binary (wai-pack).",
            "x-cli": {
              "flag": "--packer"
            }
          }
        },
        "required": [
          "dir"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai package verify",
        "mcp": null,
        "c": "wai_package_verify",
        "rust": "wai::package::verify",
        "sdk": "wai.package.verify"
      }
    },
    {
      "id": "registry.list",
      "summary": "Every registered capability with its fidelity, licence class, replicate class and role, and whether this build decodes it",
      "cli": "wai capabilities",
      "aliases": [],
      "usage": [
        "wai capabilities   the registered capabilities, their tier, licence, replicate class and role"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai registry list",
        "mcp": "registry_list",
        "c": "wai_registry_list",
        "rust": "wai::registry::list",
        "sdk": "wai.registry.list"
      }
    },
    {
      "id": "registry.export",
      "summary": "Write, or with --check compare, the registry's machine-readable export and the generated table of REGISTRY.md",
      "cli": "wai registry export",
      "aliases": [],
      "usage": [
        "wai registry export [--root <wai-dir>] [--check]   write (or compare) registry/capabilities.json, its",
        "    schema, vocab/v2.* and the generated table of REGISTRY.md"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "maintainer",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory.",
            "x-cli": {
              "flag": "--root"
            }
          },
          "check": {
            "type": "boolean",
            "description": "Compare, write nothing.",
            "x-cli": {
              "flag": "--check"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai registry export",
        "mcp": null,
        "c": "wai_registry_export",
        "rust": "wai::registry::export",
        "sdk": "wai.registry.export"
      }
    },
    {
      "id": "prior.list",
      "summary": "The listing of a parameter set (wai.prior.set) on stdout, and its pin on stderr",
      "cli": "wai prior-set",
      "aliases": [],
      "usage": [
        "wai prior-set <root>   print the listing of a parameter set (wai.prior.set) and its pin"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "root": {
            "type": "string",
            "format": "path",
            "description": "The parameter set's directory.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "root"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai prior list",
        "mcp": null,
        "c": "wai_prior_list",
        "rust": "wai::prior::list",
        "sdk": "wai.prior.list"
      }
    },
    {
      "id": "stage.encode",
      "summary": "A refinement layer over a base and the layers below it, toward a target",
      "cli": "wai stage refine",
      "aliases": [],
      "usage": [
        "wai stage refine --base <b.wai> [--on <L.wai>]... --toward <file> --q N [--predictor identity|up2|rate:NUM/DEN]",
        "    [--span F:C] [--out-dims D0,D1,D2] [--max-symbols N] [--table-per-unit] -o L.wai"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "base": {
            "type": "string",
            "format": "path",
            "description": "The base envelope.",
            "x-cli": {
              "flag": "--base"
            }
          },
          "toward": {
            "type": "string",
            "format": "path",
            "description": "The samples the layer refines toward (--target, deprecated, is the same).",
            "x-cli": {
              "flag": "--toward",
              "aliases": [
                {
                  "flag": "--target",
                  "deprecated": {
                    "since": "0.5.0",
                    "use_instead": "--toward"
                  }
                }
              ]
            }
          },
          "q": {
            "type": "integer",
            "description": "The quantiser.",
            "x-cli": {
              "flag": "--q"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The layer.",
            "x-cli": {
              "flag": "-o"
            }
          }
        },
        "required": [
          "base",
          "toward",
          "q",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "staged",
          "video_int",
          "audio_int",
          "splat_int"
        ]
      },
      "names": {
        "cli": "wai stage encode",
        "mcp": null,
        "c": "wai_stage_encode",
        "rust": "wai::stage::encode",
        "sdk": "wai.stage.encode"
      }
    },
    {
      "id": "stage.decode",
      "summary": "Envelopes taken in order: each layer offered, each base decoded and refined, with each report and the units",
      "cli": "wai stage apply",
      "aliases": [],
      "usage": [
        "wai stage apply <envelope>...   each layer offered, a base decoded (SPEC §4) and refined; the reports and units, or a JSON trace"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "envelopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The base, then its layers.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "envelopes"
        ],
        "additionalProperties": false
      },
      "output": {
        "description": "The trace of every stage reached, as `wai stage apply --json` prints it"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "staged",
          "video_int",
          "audio_int",
          "splat_int"
        ]
      },
      "names": {
        "cli": "wai stage decode",
        "mcp": null,
        "c": "wai_stage_decode",
        "rust": "wai::stage::decode",
        "sdk": "wai.stage.decode"
      }
    },
    {
      "id": "stage.build",
      "summary": "A wai.video.int_motion base of N frames of RGB8 (WIV1, keyframe 0, zero motion)",
      "cli": "wai stage base",
      "aliases": [],
      "usage": [
        "wai stage base --frames <file> --dims N,H,W --q Q -o base.wai"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "frames": {
            "type": "string",
            "format": "path",
            "description": "The frames, packed RGB8.",
            "x-cli": {
              "flag": "--frames"
            }
          },
          "dims": {
            "type": "string",
            "description": "N,H,W.",
            "x-cli": {
              "flag": "--dims"
            }
          },
          "q": {
            "type": "integer",
            "description": "The quantiser.",
            "x-cli": {
              "flag": "--q"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The base envelope.",
            "x-cli": {
              "flag": "-o"
            }
          }
        },
        "required": [
          "frames",
          "dims",
          "q",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "staged",
          "video_int",
          "audio_int",
          "splat_int"
        ]
      },
      "names": {
        "cli": "wai stage build",
        "mcp": null,
        "c": "wai_stage_build",
        "rust": "wai::stage::build",
        "sdk": "wai.stage.build"
      }
    },
    {
      "id": "stage.inspect",
      "summary": "A refinement layer's refines, its WIR1 header and its declared cost",
      "cli": "wai stage inspect",
      "aliases": [],
      "usage": [
        "wai stage inspect <L.wai>"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "layer": {
            "type": "string",
            "format": "path",
            "description": "A layer envelope.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "layer"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "staged",
          "video_int",
          "audio_int",
          "splat_int"
        ]
      },
      "names": {
        "cli": "wai stage inspect",
        "mcp": null,
        "c": "wai_stage_inspect",
        "rust": "wai::stage::inspect",
        "sdk": "wai.stage.inspect"
      }
    },
    {
      "id": "stage.wrap",
      "summary": "WAI1 envelopes packed into one WAI2, their manifests verbatim",
      "cli": "wai stage pack",
      "aliases": [],
      "usage": [
        "wai stage pack <base.wai> <L.wai>... -o x.wai"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "envelopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The base, then its layers.",
            "x-cli": {
              "positional": true
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The WAI2 envelope.",
            "x-cli": {
              "flag": "-o"
            }
          }
        },
        "required": [
          "envelopes",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "staged",
          "video_int",
          "audio_int",
          "splat_int"
        ]
      },
      "names": {
        "cli": "wai stage wrap",
        "mcp": null,
        "c": "wai_stage_wrap",
        "rust": "wai::stage::wrap",
        "sdk": "wai.stage.wrap"
      }
    },
    {
      "id": "stage.unwrap",
      "summary": "One component of a WAI2 envelope as its WAI1 envelope",
      "cli": "wai stage explode",
      "aliases": [],
      "usage": [
        "wai stage explode <x.wai> <i> [-o out.wai]"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "format": "path",
            "description": "A WAI2 envelope.",
            "x-cli": {
              "positional": true
            }
          },
          "index": {
            "type": "integer",
            "description": "The component's index.",
            "x-cli": {
              "positional": true
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The WAI1 envelope.",
            "x-cli": {
              "flag": "-o"
            }
          }
        },
        "required": [
          "path",
          "index"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "staged",
          "video_int",
          "audio_int",
          "splat_int"
        ]
      },
      "names": {
        "cli": "wai stage unwrap",
        "mcp": null,
        "c": "wai_stage_unwrap",
        "rust": "wai::stage::unwrap",
        "sdk": "wai.stage.unwrap"
      }
    },
    {
      "id": "http.export",
      "summary": "Envelopes named by their content hash, each with its head proof and entity tag, ready for an origin",
      "cli": "wai http publish",
      "aliases": [],
      "usage": [
        "wai http publish <in.wai>... --out <dir>"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "envelopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The envelopes.",
            "x-cli": {
              "positional": true
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The directory.",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "envelopes",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http"
        ]
      },
      "names": {
        "cli": "wai http export",
        "mcp": null,
        "c": "wai_http_export",
        "rust": "wai::http::export",
        "sdk": "wai.http.export"
      }
    },
    {
      "id": "http.inspect",
      "summary": "The codecs parameter a sequence of envelopes advertises: its union and its floor",
      "cli": "wai http codecs",
      "aliases": [],
      "usage": [
        "wai http codecs <in.wai>..."
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "envelopes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The envelopes.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "envelopes"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http"
        ]
      },
      "names": {
        "cli": "wai http inspect",
        "mcp": null,
        "c": "wai_http_inspect",
        "rust": "wai::http::inspect",
        "sdk": "wai.http.inspect"
      }
    },
    {
      "id": "http.start",
      "summary": "An origin on loopback serving a published directory with http-delivery's headers, ranges and If-Range",
      "cli": "wai http origin",
      "aliases": [],
      "usage": [
        "wai http origin --root <dir> [--port P] [--delay-range FIRST-LAST:MS]"
      ],
      "placement": "local",
      "effect": "runs",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "root": {
            "type": "string",
            "format": "path",
            "description": "The published directory.",
            "x-cli": {
              "flag": "--root"
            }
          },
          "port": {
            "type": "integer",
            "description": "The port on 127.0.0.1.",
            "x-cli": {
              "flag": "--port"
            }
          }
        },
        "required": [
          "root"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http"
        ]
      },
      "names": {
        "cli": "wai http start",
        "mcp": null,
        "c": "wai_http_start",
        "rust": "wai::http::start",
        "sdk": "wai.http.start"
      }
    },
    {
      "id": "hls.build",
      "summary": "An HLS rendition of published objects",
      "cli": "wai http hls",
      "aliases": [],
      "usage": [
        "wai http hls --objects <list.json> --out <dir> [--master NAME]"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "objects": {
            "type": "string",
            "format": "path",
            "description": "The objects, JSON.",
            "x-cli": {
              "flag": "--objects"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The directory.",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "objects",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http"
        ]
      },
      "names": {
        "cli": "wai hls build",
        "mcp": null,
        "c": "wai_hls_build",
        "rust": "wai::hls::build",
        "sdk": "wai.hls.build"
      }
    },
    {
      "id": "dash.build",
      "summary": "A DASH manifest of published objects",
      "cli": "wai http mpd",
      "aliases": [],
      "usage": [
        "wai http mpd --objects <list.json> --out <wai.mpd> [--period-id ID] [--set-id N]"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "objects": {
            "type": "string",
            "format": "path",
            "description": "The objects, JSON.",
            "x-cli": {
              "flag": "--objects"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The manifest.",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "objects",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http"
        ]
      },
      "names": {
        "cli": "wai dash build",
        "mcp": null,
        "c": "wai_dash_build",
        "rust": "wai::dash::build",
        "sdk": "wai.dash.build"
      }
    },
    {
      "id": "playlist.lock",
      "summary": "A media playlist sealed with a signed manifest receipt",
      "cli": "wai http seal-playlist",
      "aliases": [],
      "usage": [
        "wai http seal-playlist <m3u8> --key <name|seed> [--signer-id ID] [--content-id ID] [--parent <mr.json>] [--out <dir>]"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "playlist": {
            "type": "string",
            "format": "path",
            "description": "The playlist.",
            "x-cli": {
              "positional": true
            }
          },
          "key": {
            "type": "string",
            "description": "The signing key: its name in the keystore (wai key list), 64 hexadecimal digits, or a file holding them.",
            "x-cli": {
              "flag": "--key"
            }
          }
        },
        "required": [
          "playlist",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "http",
          "video_manifest"
        ]
      },
      "names": {
        "cli": "wai playlist lock",
        "mcp": null,
        "c": "wai_playlist_lock",
        "rust": "wai::playlist::lock",
        "sdk": "wai.playlist.lock"
      }
    },
    {
      "id": "playlist.verify",
      "summary": "A media playlist checked against its manifest receipt",
      "cli": "wai http check-playlist",
      "aliases": [],
      "usage": [
        "wai http check-playlist <m3u8> --receipt <mr.json> [--parent <mr.json>] [--classical <m3u8>]"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "playlist": {
            "type": "string",
            "format": "path",
            "description": "The playlist.",
            "x-cli": {
              "positional": true
            }
          },
          "receipt": {
            "type": "string",
            "format": "path",
            "description": "Its manifest receipt.",
            "x-cli": {
              "flag": "--receipt"
            }
          }
        },
        "required": [
          "playlist",
          "receipt"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http",
          "video_manifest"
        ]
      },
      "names": {
        "cli": "wai playlist verify",
        "mcp": null,
        "c": "wai_playlist_verify",
        "rust": "wai::playlist::verify",
        "sdk": "wai.playlist.verify"
      }
    },
    {
      "id": "corpus.generate",
      "summary": "The HTTP conformance corpus: generated, verified, or its differential and fuzz cases written",
      "cli": "wai http vectors",
      "aliases": [],
      "usage": [
        "wai http vectors gen|verify <http-conformance dir>",
        "wai http vectors diff|fuzz <dir> --seed S --count N --out F"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "maintainer",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "description": "gen, verify, diff or fuzz.",
            "x-cli": {
              "positional": true
            }
          },
          "dir": {
            "type": "string",
            "format": "path",
            "description": "The corpus directory.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "mode",
          "dir"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http"
        ]
      },
      "names": {
        "cli": "wai corpus generate",
        "mcp": null,
        "c": "wai_corpus_generate",
        "rust": "wai::corpus::generate",
        "sdk": "wai.corpus.generate"
      }
    },
    {
      "id": "http.load",
      "summary": "An object fetched by the byte-range procedure, repeatedly, and the record of each run",
      "cli": "wai http bench",
      "aliases": [],
      "usage": [
        "wai http bench --url URL --runs N --advertise CAP [--advertise CAP]... --out F"
      ],
      "placement": "client",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "The object's URL.",
            "x-cli": {
              "flag": "--url"
            }
          },
          "runs": {
            "type": "integer",
            "description": "How many runs.",
            "x-cli": {
              "flag": "--runs"
            }
          },
          "advertise": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A capability this sink advertises.",
            "x-cli": {
              "flag": "--advertise"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The record.",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "url",
          "runs",
          "advertise",
          "out"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http"
        ]
      },
      "names": {
        "cli": "wai http load",
        "mcp": null,
        "c": "wai_http_load",
        "rust": "wai::http::load",
        "sdk": "wai.http.load"
      }
    },
    {
      "id": "receipt.fetch",
      "summary": "An object's receipt index fetched over HTTP and checked, its signers confirmed under the origin's key log where named",
      "cli": "wai http receipts",
      "aliases": [],
      "usage": [
        "wai http receipts --url URL [--advertise CAP]... [--held fetch|none] [--join] [--max-walk N] [--fetch-budget N]",
        "    [--deadline-ms MS] [--key-origin https://HOST[:PORT] [--pin-key-log FILE | --test-plaintext-connect HOST:PORT]]"
      ],
      "placement": "client",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "The object's URL.",
            "x-cli": {
              "flag": "--url"
            }
          }
        },
        "required": [
          "url"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "http",
          "receipt_claims"
        ]
      },
      "names": {
        "cli": "wai receipt fetch",
        "mcp": null,
        "c": "wai_receipt_fetch",
        "rust": "wai::receipt::fetch",
        "sdk": "wai.receipt.fetch"
      }
    },
    {
      "id": "compat.check",
      "summary": "What the working tree breaks against a git ref, by category (wire, record, api); a break passes once the CHANGELOG names it",
      "cli": "wai breaking",
      "aliases": [],
      "usage": [
        "wai breaking --against <git-ref> [--category wire|record|api] [--only <surface>,...] [--skip <surface>,...]",
        "    [--root <dir>] [--target-dir <dir>] [--all]   exit 1 on a break the CHANGELOG does not acknowledge"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "against": {
            "type": "string",
            "description": "The git ref to compare with.",
            "x-cli": {
              "flag": "--against"
            }
          },
          "category": {
            "type": "string",
            "description": "wire, record or api: the categories checked, cumulative (api).",
            "x-cli": {
              "flag": "--category"
            }
          },
          "only": {
            "type": "string",
            "description": "Only these surfaces, comma-separated.",
            "x-cli": {
              "flag": "--only"
            }
          },
          "skip": {
            "type": "string",
            "description": "Not these surfaces, comma-separated.",
            "x-cli": {
              "flag": "--skip"
            }
          },
          "root": {
            "type": "string",
            "format": "path",
            "description": "The repository's root (.).",
            "x-cli": {
              "flag": "--root"
            }
          },
          "target_dir": {
            "type": "string",
            "format": "path",
            "description": "Where the Rust API's description is built.",
            "x-cli": {
              "flag": "--target-dir"
            }
          },
          "all": {
            "type": "boolean",
            "description": "List every finding, compatible ones too.",
            "x-cli": {
              "flag": "--all"
            }
          }
        },
        "required": [
          "against"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "against",
          "findings"
        ],
        "description": "Each finding's id, category, what changed and whether the CHANGELOG acknowledges it"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai compat check",
        "mcp": null,
        "c": "wai_compat_check",
        "rust": "wai::compat::check",
        "sdk": "wai.compat.check"
      }
    },
    {
      "id": "conformance.run",
      "summary": "WAI's conformance corpus run against another implementation, through a command or an HTTP adapter, or every corpus's independent verifier; each result a signed record wai verify checks",
      "cli": "wai conform",
      "aliases": [],
      "usage": [
        "wai conform <kind> --suite <suite> --impl <command or URL> [--independent] [--key <file>] [--out <file>]",
        "    [--root <wai-dir>] [--timeout <seconds>] [--name <text>] [--version <text>] [--python <program>] [--all]",
        "    [--level required|all] [--format text|json|junit|html] [--yes]   `wai conformance list` names the kinds and",
        "    suites; --independent runs the corpus's independent verifier beside the implementation, and both must conform;",
        "    a case is required unless its corpus marks it informative, and --level all counts every case",
        "wai conform --independent [--suite <area|name>[,...]] [--out <dir>] [--key <file>] [--root <wai-dir>]",
        "    [--timeout <seconds>] [--python <program>] [--format text|json|junit|html] [--yes]   every corpus's",
        "    independent verifier (or those named), a record each in <dir>; a record that exists is replaced only with",
        "    --yes (--confirm, deprecated, is the same)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "description": "The kind of implementation (wai conformance list): a decoder, a verifier, an origin, a cache, a packager, a sink; none with --independent alone.",
            "x-cli": {
              "positional": true
            }
          },
          "suite": {
            "type": "string",
            "description": "The suite (wai conformance list); with --independent alone, areas and independent verifiers, comma-separated.",
            "x-cli": {
              "flag": "--suite"
            }
          },
          "impl": {
            "type": "string",
            "description": "The implementation: a command with {case}/{in}/{out}/{corpus}/{model} placeholders (a cache's: {port} and {origin}), or a URL; required with a kind.",
            "x-cli": {
              "flag": "--impl"
            }
          },
          "independent": {
            "type": "boolean",
            "description": "Run the corpus's independent verifier beside the implementation, held to the same cases; without a kind, every independent verifier.",
            "x-cli": {
              "flag": "--independent"
            }
          },
          "key": {
            "type": "string",
            "format": "path",
            "description": "The seed the records are signed with.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The record (<suite>.wai-conform.json); with --independent alone, a directory for a record a corpus.",
            "x-cli": {
              "flag": "--out"
            }
          },
          "root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory whose corpora are run.",
            "x-cli": {
              "flag": "--root"
            }
          },
          "timeout": {
            "type": "integer",
            "description": "Seconds a case may take (60), or an independent verifier its whole corpus (1800).",
            "x-cli": {
              "flag": "--timeout"
            }
          },
          "name": {
            "type": "string",
            "description": "The implementation's name, for the record.",
            "x-cli": {
              "flag": "--name"
            }
          },
          "version": {
            "type": "string",
            "description": "The implementation's version, for the record.",
            "x-cli": {
              "flag": "--version"
            }
          },
          "python": {
            "type": "string",
            "description": "The Python the independent verifiers run with (python3).",
            "x-cli": {
              "flag": "--python"
            }
          },
          "format": {
            "type": "string",
            "description": "What is printed: text, json (the envelope, as --json), junit (JUnit XML) or html, the last two from the records.",
            "x-cli": {
              "flag": "--format"
            }
          },
          "all": {
            "type": "boolean",
            "description": "List every case, passed ones too.",
            "x-cli": {
              "flag": "--all"
            }
          },
          "level": {
            "type": "string",
            "description": "required (the default: a case the corpus marks informative is reported, not counted) or all (every case counted); for a suite whose corpus marks a case informative.",
            "x-cli": {
              "flag": "--level"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "conformant",
          "cases",
          "passed",
          "failed"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai conformance run",
        "mcp": "conformance_run",
        "c": "wai_conformance_run",
        "rust": "wai::conformance::run",
        "sdk": "wai.conformance.run"
      }
    },
    {
      "id": "conformance.list",
      "summary": "The kinds and suites wai conform runs, each suite's corpus and its cases, and every corpus's independent verifier",
      "cli": "wai conformance list",
      "aliases": [],
      "usage": [
        "wai conformance list [--root <wai-dir>]   the kinds and suites, and the independent verifiers (also wai conform --list)"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory whose corpora are listed.",
            "x-cli": {
              "flag": "--root"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "suites"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai conformance list",
        "mcp": "conformance_list",
        "c": "wai_conformance_list",
        "rust": "wai::conformance::list",
        "sdk": "wai.conformance.list"
      }
    },
    {
      "id": "enrolment.create",
      "summary": "A node's enrolment signed with the organisation key, written to a file and, with --target, given to a fleet service",
      "cli": "wai enrolment create",
      "aliases": [],
      "usage": [
        "wai enrolment create <node-key> --role <role> --key <name|file> [--label L] [--from µs] [--until µs] [--out F]",
        "    [--target <name|url>] [--yes]   a node's enrolment (WFE1), signed with the organisation key, written to F",
        "    (<node>.wfe without --target) and, with --target, given to the fleet service it names (never to the target in",
        "    use unless named); changing the service or replacing a file waits for --yes (--confirm, deprecated, is the same)"
      ],
      "placement": "client",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "when-changing-the-target-or-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "node": {
            "type": "string",
            "description": "The node's Ed25519 public key, 64 hexadecimal digits.",
            "x-cli": {
              "positional": true
            }
          },
          "role": {
            "type": "string",
            "description": "relay, compositor, ingest, room, ledger or audit.",
            "x-cli": {
              "flag": "--role"
            }
          },
          "key": {
            "type": "string",
            "description": "The organisation key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "label": {
            "type": "string",
            "description": "The node's label, at most 64 bytes.",
            "x-cli": {
              "flag": "--label"
            }
          },
          "from": {
            "type": "integer",
            "description": "The start of the span it holds, microseconds since 1970 (0).",
            "x-cli": {
              "flag": "--from"
            }
          },
          "until": {
            "type": "integer",
            "description": "The end of that span, microseconds since 1970 (none).",
            "x-cli": {
              "flag": "--until"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The enrolment's file (<node>.wfe when no --target is given).",
            "x-cli": {
              "flag": "--out"
            }
          },
          "target": {
            "type": "string",
            "description": "The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.",
            "x-cli": {
              "flag": "--target"
            }
          }
        },
        "required": [
          "node",
          "role",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "node",
          "role",
          "organisation",
          "digest",
          "enrolment"
        ],
        "description": "The enrolment (WFE1, hexadecimal), its digest, and the file and service it went to"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "fleet"
        ]
      },
      "names": {
        "cli": "wai enrolment create",
        "mcp": null,
        "c": "wai_enrolment_create",
        "rust": "wai::enrolment::create",
        "sdk": "wai.enrolment.create"
      }
    },
    {
      "id": "enrolment.list",
      "summary": "The nodes a fleet service holds enrolled, each with its role, label and how many records it gave",
      "cli": "wai enrolment list",
      "aliases": [],
      "usage": [
        "wai enrolment list [--target <name|url>]   the nodes the fleet service holds enrolled (the target in use when none is named)"
      ],
      "placement": "client",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.",
            "x-cli": {
              "flag": "--target"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "enrolments"
        ],
        "description": "Each node the fleet service holds enrolled: its key, role, label and records"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai enrolment list",
        "mcp": null,
        "c": "wai_enrolment_list",
        "rust": "wai::enrolment::list",
        "sdk": "wai.enrolment.list"
      }
    },
    {
      "id": "report.create",
      "summary": "The fleet report of a period, signed by a fleet service over the enrolments and records it holds",
      "cli": "wai report create",
      "aliases": [],
      "usage": [
        "wai report create [--target <name|url>] --start µs --end µs [--yes]   the fleet report of [start, end), signed by the",
        "    fleet service (the target in use when none is named); it changes the service, so it waits for --yes (--confirm,",
        "    deprecated, is the same)"
      ],
      "placement": "client",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.",
            "x-cli": {
              "flag": "--target"
            }
          },
          "start": {
            "type": "integer",
            "description": "The period's start, microseconds since 1970.",
            "x-cli": {
              "flag": "--start"
            }
          },
          "end": {
            "type": "integer",
            "description": "The period's end, after its start.",
            "x-cli": {
              "flag": "--end"
            }
          }
        },
        "required": [
          "start",
          "end"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "report",
          "outcome"
        ],
        "description": "The report's digest and its outcome as extensions/fleet.md §7.3 states it"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": null,
      "names": {
        "cli": "wai report create",
        "mcp": null,
        "c": "wai_report_create",
        "rust": "wai::report::create",
        "sdk": "wai.report.create"
      }
    },
    {
      "id": "report.export",
      "summary": "A fleet report's bundle fetched from a fleet service, its report recomputed here, then written to a file",
      "cli": "wai report export",
      "aliases": [],
      "usage": [
        "wai report export <digest> [--target <name|url>] [--out F] [--yes]   the report's bundle from the fleet service",
        "    (the target in use when none is named), recomputed by this build and written to F (<digest>.wai-fleet.json) for",
        "    `wai verify`; replacing a file waits for --yes (--confirm, deprecated, is the same)"
      ],
      "placement": "client",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "digest": {
            "type": "string",
            "description": "The report's digest, 64 hexadecimal digits.",
            "x-cli": {
              "positional": true
            }
          },
          "target": {
            "type": "string",
            "description": "The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.",
            "x-cli": {
              "flag": "--target"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The bundle's file (<digest>.wai-fleet.json).",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "digest"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "file",
          "outcome"
        ],
        "description": "The bundle's file and its outcome, recomputed here"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "fleet"
        ]
      },
      "names": {
        "cli": "wai report export",
        "mcp": null,
        "c": "wai_report_export",
        "rust": "wai::report::export",
        "sdk": "wai.report.export"
      }
    },
    {
      "id": "route.verify",
      "summary": "A route record checked offline against its request, price book and routing policy, and against its hops' OER/2 receipts where given",
      "cli": "wai route verify",
      "aliases": [],
      "usage": [
        "wai route verify <document.json>   a verification document (extensions/route-record.md §7.1): the record's outcome",
        "    (§7.3) as JSON, recomputed from the request, the price book and the policy; exit 1 when it is refused"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "document": {
            "type": "string",
            "format": "path",
            "description": "The verification document: the request, price book, policy and record, and the hops' receipts.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "document"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "outcome"
        ],
        "description": "The outcome of extensions/route-record.md §7.3: accept with the record's digest, the served and billed hops, the deadline, the order, the decision, the removals and the unmetered hops; or refuse with the reason and where"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "route_record"
        ]
      },
      "names": {
        "cli": "wai route verify",
        "mcp": null,
        "c": "wai_route_verify",
        "rust": "wai::route::verify",
        "sdk": "wai.route.verify"
      }
    },
    {
      "id": "channel.import",
      "summary": "A linear channel's feeds (an XMLTV schedule, Media RSS catalogues or the JSON form, and a Media Playlist's SCTE-35 date ranges) imported into its signed receipt, its signed lineup and its breaks' cues",
      "cli": "wai channel import",
      "aliases": [],
      "usage": [
        "wai channel import --channel ID (--xmltv F [--mrss F]... | --mrss F... | --feed F) [--playlist F] --key K",
        "    [--mrss-owner O]... [--owner O] [--signer-id S] [--id-system N] [--xmltv-channel X] [--start-ms T] [--artwork DIR]",
        "    [--window-start T --window-end T] [--parent HEX] [--out-dir D] [--yes]   the receipt (channel.json), the lineup",
        "    (lineup.wlu) and the cues (cues.json), written to D (.); a refusal's code is its reason; replacing a file waits",
        "    for --yes (--confirm, deprecated, is the same)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "channel": {
            "type": "string",
            "description": "The channel id.",
            "x-cli": {
              "flag": "--channel"
            }
          },
          "xmltv": {
            "type": "string",
            "format": "path",
            "description": "An XMLTV document: the schedule.",
            "x-cli": {
              "flag": "--xmltv"
            }
          },
          "mrss": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A Media RSS document: a catalogue. Repeated.",
            "x-cli": {
              "flag": "--mrss"
            }
          },
          "mrss_owner": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The rights holder of each --mrss document's items, in their order: none, or one each.",
            "x-cli": {
              "flag": "--mrss-owner"
            }
          },
          "feed": {
            "type": "string",
            "format": "path",
            "description": "The JSON form of a schedule, its catalogue and its breaks.",
            "x-cli": {
              "flag": "--feed"
            }
          },
          "playlist": {
            "type": "string",
            "format": "path",
            "description": "The channel's HLS Media Playlist, whose SCTE-35 date ranges are its breaks.",
            "x-cli": {
              "flag": "--playlist"
            }
          },
          "key": {
            "type": "string",
            "description": "The operator's key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "owner": {
            "type": "string",
            "description": "The rights holder of every asset no other input gives one.",
            "x-cli": {
              "flag": "--owner"
            }
          },
          "signer_id": {
            "type": "string",
            "description": "The receipt's signer id (the operator key's did:key).",
            "x-cli": {
              "flag": "--signer-id"
            }
          },
          "id_system": {
            "type": "string",
            "description": "The XMLTV episode-num system that names a programme's asset (wai-asset-id).",
            "x-cli": {
              "flag": "--id-system"
            }
          },
          "xmltv_channel": {
            "type": "string",
            "description": "The XMLTV channel id whose programmes are read (the channel id).",
            "x-cli": {
              "flag": "--xmltv-channel"
            }
          },
          "start_ms": {
            "type": "integer",
            "description": "Where a schedule of Media RSS items alone begins, milliseconds since 1970.",
            "x-cli": {
              "flag": "--start-ms"
            }
          },
          "artwork": {
            "type": "string",
            "format": "path",
            "description": "The directory holding the artwork files the feeds' icons and thumbnails name.",
            "x-cli": {
              "flag": "--artwork"
            }
          },
          "window_start": {
            "type": "integer",
            "description": "The receipt's window's start (the schedule's first start).",
            "x-cli": {
              "flag": "--window-start"
            }
          },
          "window_end": {
            "type": "integer",
            "description": "The receipt's window's end (the schedule's last end).",
            "x-cli": {
              "flag": "--window-end"
            }
          },
          "parent": {
            "type": "string",
            "description": "The receipt hash of the window before this one, 64 hexadecimal digits.",
            "x-cli": {
              "flag": "--parent"
            }
          },
          "out_dir": {
            "type": "string",
            "format": "path",
            "description": "Where channel.json, lineup.wlu and cues.json are written (.).",
            "x-cli": {
              "flag": "--out-dir"
            }
          }
        },
        "required": [
          "channel",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "channel",
          "receipt",
          "receipt_hash",
          "schedule_root",
          "lineup",
          "lineup_digest",
          "cues"
        ],
        "description": "The files written (the receipt, the lineup, the cues), the receipt's identity and schedule root, the lineup's digest, and their counts"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "channel_lineup"
        ]
      },
      "names": {
        "cli": "wai channel import",
        "mcp": null,
        "c": "wai_channel_import",
        "rust": "wai::channel::import",
        "sdk": "wai.channel.import"
      }
    },
    {
      "id": "channel.guide",
      "summary": "A channel's guide, an XMLTV document or a now/next document, rendered from its receipt and its lineup and naming both",
      "cli": "wai channel guide",
      "aliases": [],
      "usage": [
        "wai channel guide --receipt R --lineup L [--from T --to T | --now-next --at T] [--out F] [--yes]   the XMLTV guide",
        "    of a range (the whole schedule), or the now/next document of an instant, written to F (guide.xml, now-next.json);",
        "    replacing a file waits for --yes (--confirm, deprecated, is the same)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "receipt": {
            "type": "string",
            "format": "path",
            "description": "The channel receipt, in its JSON carriage.",
            "x-cli": {
              "flag": "--receipt"
            }
          },
          "lineup": {
            "type": "string",
            "format": "path",
            "description": "The lineup's file.",
            "x-cli": {
              "flag": "--lineup"
            }
          },
          "from": {
            "type": "integer",
            "description": "The range's start, milliseconds since 1970 (the schedule's first start).",
            "x-cli": {
              "flag": "--from"
            }
          },
          "to": {
            "type": "integer",
            "description": "The range's end (the schedule's last end).",
            "x-cli": {
              "flag": "--to"
            }
          },
          "now_next": {
            "type": "boolean",
            "description": "The now/next document of --at instead.",
            "x-cli": {
              "flag": "--now-next"
            }
          },
          "at": {
            "type": "integer",
            "description": "The instant of a now/next document, milliseconds since 1970.",
            "x-cli": {
              "flag": "--at"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The guide's file (guide.xml, or now-next.json).",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "receipt",
          "lineup"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "file",
          "format",
          "schedule_root",
          "lineup"
        ],
        "description": "The guide's file and format (xmltv or now-next), the sources it names, and its range or instant"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "channel_lineup"
        ]
      },
      "names": {
        "cli": "wai channel guide",
        "mcp": null,
        "c": "wai_channel_guide",
        "rust": "wai::channel::guide",
        "sdk": "wai.channel.guide"
      }
    },
    {
      "id": "channel.verify",
      "summary": "A channel's receipt, its lineup and a guide verified together: the guide recomputed from the two and compared, each programme with whether it aired",
      "cli": "wai channel verify",
      "aliases": [],
      "usage": [
        "wai channel verify --receipt R --lineup L [--guide G]   the receipt, the lineup and the guide checked together;",
        "    exit 1 with the reason when one does not verify"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "receipt": {
            "type": "string",
            "format": "path",
            "description": "The channel receipt, in its JSON carriage.",
            "x-cli": {
              "flag": "--receipt"
            }
          },
          "lineup": {
            "type": "string",
            "format": "path",
            "description": "The lineup's file.",
            "x-cli": {
              "flag": "--lineup"
            }
          },
          "guide": {
            "type": "string",
            "format": "path",
            "description": "An XMLTV guide or a now/next document.",
            "x-cli": {
              "flag": "--guide"
            }
          }
        },
        "required": [
          "receipt",
          "lineup"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "verdict",
          "part",
          "receipt",
          "lineup",
          "guide",
          "entry"
        ],
        "description": "What extensions/channel-lineup.md §8.3 states: the verdict and the part it is about, the receipt's identity, the lineup's digest, and the guide's programmes, each with whether it aired"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "channel_lineup"
        ]
      },
      "names": {
        "cli": "wai channel verify",
        "mcp": null,
        "c": "wai_channel_verify",
        "rust": "wai::channel::verify",
        "sdk": "wai.channel.verify"
      }
    },
    {
      "id": "mcp.start",
      "summary": "WAI's operations as tools for a coding agent: a Model Context Protocol server on standard input and output, in toolsets",
      "cli": "wai mcp",
      "aliases": [],
      "usage": [
        "wai mcp [--toolset core,dev,app] [--read-only] [--project DIR] [--spec-root DIR] [--room-bin BIN]",
        "    [--target <name|url> [--allow-write]]   serves until standard input closes; --dry-run names the tools it would",
        "    serve and serves nothing. With --target, the operations of the service's API are tools too, each sent to its",
        "    route on that target alone: those that read it, and those that change it where the server may (a target on",
        "    this machine, or another with --allow-write; never with --read-only or to a read-only target)"
      ],
      "placement": "client",
      "effect": "runs",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "toolset": {
            "type": "string",
            "description": "The toolsets to offer, comma-separated (core when none is named).",
            "x-cli": {
              "flag": "--toolset"
            }
          },
          "read_only": {
            "type": "boolean",
            "description": "Offer only the tools that read or run a verifier.",
            "x-cli": {
              "flag": "--read-only"
            }
          },
          "project": {
            "type": "string",
            "format": "path",
            "description": "The directory the server may write in (the current one).",
            "x-cli": {
              "flag": "--project"
            }
          },
          "spec_root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory whose text and corpora the tools read.",
            "x-cli": {
              "flag": "--spec-root"
            }
          },
          "room_bin": {
            "type": "string",
            "format": "path",
            "description": "The room service the development room runs.",
            "x-cli": {
              "flag": "--room-bin"
            }
          },
          "target": {
            "type": "string",
            "description": "The service it acts on: a target's name (wai target list) or a service's http:// or https:// address.",
            "x-cli": {
              "flag": "--target"
            }
          },
          "allow_write": {
            "type": "boolean",
            "description": "Offer the tools that change the target where it is on another machine.",
            "x-cli": {
              "flag": "--allow-write"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": {
        "description": "One JSON-RPC 2.0 message per line, the Model Context Protocol"
      },
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "mcp"
        ]
      },
      "names": {
        "cli": "wai mcp start",
        "mcp": null,
        "c": "wai_mcp_start",
        "rust": "wai::mcp::start",
        "sdk": "wai.mcp.start"
      }
    },
    {
      "id": "agent.setup",
      "summary": "A project made ready for coding agents: AGENTS.md, an import of it in a CLAUDE.md already there, and wai mcp registered in its MCP configuration",
      "cli": "wai setup-agent",
      "aliases": [],
      "usage": [
        "wai setup-agent [--dir D] [--all] [--only FILE,...] [--toolset core,dev,app] [--command PROGRAM]",
        "    a file that exists changes only once confirmed (--yes, or yes at a terminal); --dry-run shows each diff"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "dir": {
            "type": "string",
            "format": "path",
            "description": "The project directory (the current one).",
            "x-cli": {
              "flag": "--dir"
            }
          },
          "all": {
            "type": "boolean",
            "description": "Write every agent's configuration file, not only those whose directory is there.",
            "x-cli": {
              "flag": "--all"
            }
          },
          "only": {
            "type": "string",
            "description": "Only these files, comma-separated.",
            "x-cli": {
              "flag": "--only"
            }
          },
          "toolset": {
            "type": "string",
            "description": "The toolsets the registered server offers.",
            "x-cli": {
              "flag": "--toolset"
            }
          },
          "command": {
            "type": "string",
            "description": "The program the registration runs (wai).",
            "x-cli": {
              "flag": "--command"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "project",
          "dry_run",
          "files"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai agent setup",
        "mcp": null,
        "c": "wai_agent_setup",
        "rust": "wai::agent::setup",
        "sdk": "wai.agent.setup"
      }
    },
    {
      "id": "app.guide",
      "summary": "The line language and every WAI widget, as a model writing a WAI app is told them",
      "cli": "wai app guide",
      "aliases": [],
      "usage": [
        "wai app guide   what a model writing an app made with Create is told"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "app",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "app"
        ]
      },
      "names": {
        "cli": "wai app guide",
        "mcp": "app_guide",
        "c": "wai_app_guide",
        "rust": "wai::app::guide",
        "sdk": "wai.app.guide"
      }
    },
    {
      "id": "app.check",
      "summary": "An app program checked against the WAI registry and WAI's rules, every error with its line and reason code; in a project, its room and runtime too",
      "cli": "wai app check",
      "aliases": [],
      "usage": [
        "wai app check [<dir> | <app.oui>]   exit 1 when something does not hold, each failure named"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "app",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "program": {
            "type": "string",
            "format": "path",
            "description": "A project directory or a program (.).",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "program",
          "errors",
          "failures",
          "checked"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "app"
        ]
      },
      "names": {
        "cli": "wai app check",
        "mcp": "app_check",
        "c": "wai_app_check",
        "rust": "wai::app::check",
        "sdk": "wai.app.check"
      }
    },
    {
      "id": "app.export",
      "summary": "An app made with Create written as a project: the program, wai.json naming its room, the page and its runtime, a README, AGENTS.md and the licence",
      "cli": "wai app export",
      "aliases": [],
      "usage": [
        "wai app export <app.oui> <dir> [--runtime DIR]   the same as wai create <dir> --from <app.oui>"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "app",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "program": {
            "type": "string",
            "format": "path",
            "description": "The program made with Create.",
            "x-cli": {
              "positional": true
            }
          },
          "dir": {
            "type": "string",
            "format": "path",
            "description": "A directory that does not exist or is empty.",
            "x-cli": {
              "positional": true
            }
          },
          "runtime": {
            "type": "string",
            "format": "path",
            "description": "A Create runtime ($WAI_APP_RUNTIME, or share/wai/app beside wai).",
            "x-cli": {
              "flag": "--runtime"
            }
          }
        },
        "required": [
          "program",
          "dir"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          }
        },
        "required": [
          "text"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "app"
        ]
      },
      "names": {
        "cli": "wai app export",
        "mcp": "app_export",
        "c": "wai_app_export",
        "rust": "wai::app::export",
        "sdk": "wai.app.export"
      }
    },
    {
      "id": "app.stream",
      "summary": "A program streamed into the person's open Create page through the bridge wai mcp runs on loopback",
      "cli": null,
      "aliases": [],
      "usage": [
        "wai (wai mcp --toolset app: app_stream)"
      ],
      "placement": "local",
      "effect": "runs",
      "dry_run": false,
      "confirm": null,
      "route": null,
      "doors": {
        "cli": false,
        "mcp": true,
        "http": false
      },
      "toolset": "app",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "program": {
            "type": "string",
            "description": "The program's text."
          },
          "chunk": {
            "type": "integer",
            "description": "Characters a chunk (24)."
          },
          "pace_ms": {
            "type": "integer",
            "description": "Milliseconds between chunks (30)."
          }
        },
        "required": [
          "program"
        ],
        "additionalProperties": false
      },
      "output": {
        "description": "The tool's structured result"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "app"
        ]
      },
      "names": {
        "cli": null,
        "mcp": "app_stream",
        "c": "wai_app_stream",
        "rust": "wai::app::stream",
        "sdk": "wai.app.stream"
      }
    },
    {
      "id": "registry.show",
      "summary": "One capability's registry entry, whether this build decodes it, its role, and the specification lines that name it",
      "cli": "wai registry show",
      "aliases": [],
      "usage": [
        "wai registry show <capability> [--spec-root <wai-dir>]   one capability's registry entry, whether this build decodes it,",
        "    its role, and the specification lines that name it, where the specification's text is here (--spec-root,",
        "    $WAI_SPEC_ROOT, or the tree this binary was built from)"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string",
            "description": "A capability string, e.g. wai.image.avif.",
            "x-cli": {
              "positional": true
            }
          },
          "spec_root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory whose text is read, on the command line (wai mcp has a --spec-root of its own).",
            "x-cli": {
              "flag": "--spec-root"
            }
          }
        },
        "required": [
          "capability"
        ],
        "additionalProperties": false
      },
      "output": {
        "description": "The tool's structured result"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "mcp"
        ]
      },
      "names": {
        "cli": "wai registry show",
        "mcp": "registry_show",
        "c": "wai_registry_show",
        "rust": "wai::registry::show",
        "sdk": "wai.registry.show"
      }
    },
    {
      "id": "docs.search",
      "summary": "Lines of the specification and its extensions holding every word of a query, each with its file, line and section",
      "cli": "wai docs search",
      "aliases": [],
      "usage": [
        "wai docs search <word>... [--limit N] [--spec-root <wai-dir>]   the lines of the specification and its extensions that hold",
        "    every word, with each one's file, line and section, offline; the text is --spec-root's, $WAI_SPEC_ROOT's, or the",
        "    tree this binary was built from"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Words that must all appear on a line.",
            "x-cli": {
              "positional": true
            }
          },
          "limit": {
            "type": "integer",
            "description": "At most this many hits (20).",
            "x-cli": {
              "flag": "--limit"
            }
          },
          "spec_root": {
            "type": "string",
            "format": "path",
            "description": "The wai/ directory whose text is searched, on the command line (wai mcp has a --spec-root of its own).",
            "x-cli": {
              "flag": "--spec-root"
            }
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      },
      "output": {
        "description": "The tool's structured result"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "mcp"
        ]
      },
      "names": {
        "cli": "wai docs search",
        "mcp": "docs_search",
        "c": "wai_docs_search",
        "rust": "wai::docs::search",
        "sdk": "wai.docs.search"
      }
    },
    {
      "id": "dev.stop",
      "summary": "The development relay and room service a wai mcp server started, stopped",
      "cli": null,
      "aliases": [],
      "usage": [
        "wai (wai mcp: dev_stop)"
      ],
      "placement": "local",
      "effect": "runs",
      "dry_run": false,
      "confirm": null,
      "route": null,
      "doors": {
        "cli": false,
        "mcp": true,
        "http": false
      },
      "toolset": "dev",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "description": "The tool's structured result"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": null,
        "mcp": "dev_stop",
        "c": "wai_dev_stop",
        "rust": "wai::dev::stop",
        "sdk": "wai.dev.stop"
      }
    },
    {
      "id": "room.join",
      "summary": "A test principal enters the development room with its grant, publishes its tracks, and is seen joined by the room's clock",
      "cli": null,
      "aliases": [],
      "usage": [
        "wai (wai mcp: room_join)"
      ],
      "placement": "client",
      "effect": "writes-target",
      "dry_run": false,
      "confirm": null,
      "route": null,
      "doors": {
        "cli": false,
        "mcp": true,
        "http": false
      },
      "toolset": "dev",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "local: the development room on this machine."
          },
          "principal": {
            "type": "string",
            "description": "A test principal granted the publisher role."
          },
          "objects": {
            "type": "integer",
            "description": "Objects on each track (1)."
          }
        },
        "required": [
          "principal"
        ],
        "additionalProperties": false
      },
      "output": {
        "description": "The tool's structured result"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": null,
        "mcp": "room_join",
        "c": "wai_room_join",
        "rust": "wai::room::join",
        "sdk": "wai.room.join"
      }
    },
    {
      "id": "room.leave",
      "summary": "A test principal's session in the development room closed, and its leave seen by the room's clock",
      "cli": null,
      "aliases": [],
      "usage": [
        "wai (wai mcp: room_leave)"
      ],
      "placement": "client",
      "effect": "writes-target",
      "dry_run": false,
      "confirm": null,
      "route": null,
      "doors": {
        "cli": false,
        "mcp": true,
        "http": false
      },
      "toolset": "dev",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "local: the development room on this machine."
          },
          "principal": {
            "type": "string",
            "description": "The test principal's name."
          }
        },
        "required": [
          "principal"
        ],
        "additionalProperties": false
      },
      "output": {
        "description": "The tool's structured result"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": null,
        "mcp": "room_leave",
        "c": "wai_room_leave",
        "rust": "wai::room::leave",
        "sdk": "wai.room.leave"
      }
    },
    {
      "id": "session.show",
      "summary": "The development room's session as a verifier is given it: descriptor, grants, key-log head and the clock's event chain",
      "cli": null,
      "aliases": [],
      "usage": [
        "wai (wai mcp: session_show)"
      ],
      "placement": "client",
      "effect": "reads",
      "dry_run": false,
      "confirm": null,
      "route": null,
      "doors": {
        "cli": false,
        "mcp": true,
        "http": false
      },
      "toolset": "dev",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "description": "local: the development room on this machine."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "description": "The tool's structured result"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": null,
        "mcp": "session_show",
        "c": "wai_session_show",
        "rust": "wai::session::show",
        "sdk": "wai.session.show"
      }
    },
    {
      "id": "service.show",
      "summary": "The service's health",
      "cli": "wai service show",
      "aliases": [],
      "usage": [
        "wai service show [--target <name|url>] [--query <name>=<value>]...   GET / on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai service show",
        "mcp": null,
        "c": "wai_service_show",
        "rust": "wai::service::show",
        "sdk": "wai.service.show"
      }
    },
    {
      "id": "service.check",
      "summary": "The service's health",
      "cli": "wai service check",
      "aliases": [],
      "usage": [
        "wai service check [--target <name|url>] [--query <name>=<value>]...   GET /health on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/health"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1health/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai service check",
        "mcp": null,
        "c": "wai_service_check",
        "rust": "wai::service::check",
        "sdk": "wai.service.check"
      }
    },
    {
      "id": "room.show",
      "summary": "The current room",
      "cli": "wai room show",
      "aliases": [],
      "usage": [
        "wai room show [--target <name|url>] [--query <name>=<value>]...   GET /room on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/room"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1room/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai room show",
        "mcp": null,
        "c": "wai_room_show",
        "rust": "wai::room::show",
        "sdk": "wai.room.show"
      }
    },
    {
      "id": "room.grant",
      "summary": "A grant for a key",
      "cli": "wai room grant",
      "aliases": [],
      "usage": [
        "wai room grant [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /grant on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/grant"
      },
      "doors": {
        "cli": true,
        "mcp": true,
        "http": true
      },
      "toolset": "dev",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1grant/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai room grant",
        "mcp": "room_grant",
        "c": "wai_room_grant",
        "rust": "wai::room::grant",
        "sdk": "wai.room.grant"
      }
    },
    {
      "id": "admission.show",
      "summary": "The room's admission receipt so far",
      "cli": "wai admission show",
      "aliases": [],
      "usage": [
        "wai admission show [--target <name|url>] [--query <name>=<value>]...   GET /age/receipt on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/age/receipt"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1age~1receipt/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai admission show",
        "mcp": null,
        "c": "wai_admission_show",
        "rust": "wai::admission::show",
        "sdk": "wai.admission.show"
      }
    },
    {
      "id": "mls.tail",
      "summary": "The room's log of MLS messages",
      "cli": "wai mls tail",
      "aliases": [],
      "usage": [
        "wai mls tail [--target <name|url>] [--query <name>=<value>]...   GET /mls on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/mls"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1mls/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai mls tail",
        "mcp": null,
        "c": "wai_mls_tail",
        "rust": "wai::mls::tail",
        "sdk": "wai.mls.tail"
      }
    },
    {
      "id": "mls.import",
      "summary": "A KeyPackage for a granted principal's Add",
      "cli": "wai mls import",
      "aliases": [],
      "usage": [
        "wai mls import [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /mls/key-package on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/mls/key-package"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1mls~1key-package/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai mls import",
        "mcp": null,
        "c": "wai_mls_import",
        "rust": "wai::mls::import",
        "sdk": "wai.mls.import"
      }
    },
    {
      "id": "mls.update",
      "summary": "A GroupInfo, or a commit and its Welcome",
      "cli": "wai mls update",
      "aliases": [],
      "usage": [
        "wai mls update [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /mls/post on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/mls/post"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1mls~1post/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai mls update",
        "mcp": null,
        "c": "wai_mls_update",
        "rust": "wai::mls::update",
        "sdk": "wai.mls.update"
      }
    },
    {
      "id": "performance.list",
      "summary": "The clock's log of objects",
      "cli": "wai performance list",
      "aliases": [],
      "usage": [
        "wai performance list [--target <name|url>] [--query <name>=<value>]...   GET /co/objects on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/co/objects"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1co~1objects/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai performance list",
        "mcp": null,
        "c": "wai_performance_list",
        "rust": "wai::performance::list",
        "sdk": "wai.performance.list"
      }
    },
    {
      "id": "performance.show",
      "summary": "The room's co-performance as the clock holds it",
      "cli": "wai performance show",
      "aliases": [],
      "usage": [
        "wai performance show [--target <name|url>] [--query <name>=<value>]...   GET /co/state on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/co/state"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1co~1state/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai performance show",
        "mcp": null,
        "c": "wai_performance_show",
        "rust": "wai::performance::show",
        "sdk": "wai.performance.show"
      }
    },
    {
      "id": "schedule.create",
      "summary": "A turn schedule the clock signs",
      "cli": "wai schedule create",
      "aliases": [],
      "usage": [
        "wai schedule create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /co/schedule on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/co/schedule"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1co~1schedule/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai schedule create",
        "mcp": null,
        "c": "wai_schedule_create",
        "rust": "wai::schedule::create",
        "sdk": "wai.schedule.create"
      }
    },
    {
      "id": "handover.create",
      "summary": "A handover the clock signs",
      "cli": "wai handover create",
      "aliases": [],
      "usage": [
        "wai handover create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /co/handover on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/co/handover"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1co~1handover/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai handover create",
        "mcp": null,
        "c": "wai_handover_create",
        "rust": "wai::handover::create",
        "sdk": "wai.handover.create"
      }
    },
    {
      "id": "window.create",
      "summary": "A selection window the clock signs",
      "cli": "wai window create",
      "aliases": [],
      "usage": [
        "wai window create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /co/window on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/co/window"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1co~1window/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai window create",
        "mcp": null,
        "c": "wai_window_create",
        "rust": "wai::window::create",
        "sdk": "wai.window.create"
      }
    },
    {
      "id": "fidelity.create",
      "summary": "A fidelity statement now",
      "cli": "wai fidelity create",
      "aliases": [],
      "usage": [
        "wai fidelity create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /co/fidelity on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/co/fidelity"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1co~1fidelity/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai fidelity create",
        "mcp": null,
        "c": "wai_fidelity_create",
        "rust": "wai::fidelity::create",
        "sdk": "wai.fidelity.create"
      }
    },
    {
      "id": "time.show",
      "summary": "The service's clock",
      "cli": "wai time show",
      "aliases": [],
      "usage": [
        "wai time show [--target <name|url>] [--query <name>=<value>]...   GET /watch/time on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/watch/time"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1watch~1time/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai time show",
        "mcp": null,
        "c": "wai_time_show",
        "rust": "wai::time::show",
        "sdk": "wai.time.show"
      }
    },
    {
      "id": "source.fetch",
      "summary": "The watch room's source, whole",
      "cli": "wai source fetch",
      "aliases": [],
      "usage": [
        "wai source fetch [--target <name|url>] [--query <name>=<value>]...   GET /watch/source on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/watch/source"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1watch~1source/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai source fetch",
        "mcp": null,
        "c": "wai_source_fetch",
        "rust": "wai::source::fetch",
        "sdk": "wai.source.fetch"
      }
    },
    {
      "id": "watch.setup",
      "summary": "A challenge for a join's proof",
      "cli": "wai watch setup",
      "aliases": [],
      "usage": [
        "wai watch setup [--target <name|url>] [--query <name>=<value>]... [--yes]   GET /watch/challenge on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/watch/challenge"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1watch~1challenge/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai watch setup",
        "mcp": null,
        "c": "wai_watch_setup",
        "rust": "wai::watch::setup",
        "sdk": "wai.watch.setup"
      }
    },
    {
      "id": "watch.tail",
      "summary": "The watch room's log",
      "cli": "wai watch tail",
      "aliases": [],
      "usage": [
        "wai watch tail [--target <name|url>] [--query <name>=<value>]...   GET /watch on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/watch"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1watch/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai watch tail",
        "mcp": null,
        "c": "wai_watch_tail",
        "rust": "wai::watch::tail",
        "sdk": "wai.watch.tail"
      }
    },
    {
      "id": "watch.show",
      "summary": "The room as a co-watch verifier is given it",
      "cli": "wai watch show",
      "aliases": [],
      "usage": [
        "wai watch show [--target <name|url>] [--query <name>=<value>]...   GET /watch/room on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/watch/room"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1watch~1room/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai watch show",
        "mcp": null,
        "c": "wai_watch_show",
        "rust": "wai::watch::show",
        "sdk": "wai.watch.show"
      }
    },
    {
      "id": "watch.join",
      "summary": "A viewer enters by a proof of its key",
      "cli": "wai watch join",
      "aliases": [],
      "usage": [
        "wai watch join [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /watch/join on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/watch/join"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1watch~1join/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai watch join",
        "mcp": null,
        "c": "wai_watch_join",
        "rust": "wai::watch::join",
        "sdk": "wai.watch.join"
      }
    },
    {
      "id": "watch.update",
      "summary": "A viewer's events, checked and carried in order",
      "cli": "wai watch update",
      "aliases": [],
      "usage": [
        "wai watch update [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /watch/post on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/watch/post"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1watch~1post/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai watch update",
        "mcp": null,
        "c": "wai_watch_update",
        "rust": "wai::watch::update",
        "sdk": "wai.watch.update"
      }
    },
    {
      "id": "control.grant",
      "summary": "The host hands control over",
      "cli": "wai control grant",
      "aliases": [],
      "usage": [
        "wai control grant [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /remote/control on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/remote/control"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1remote~1control/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai control grant",
        "mcp": null,
        "c": "wai_control_grant",
        "rust": "wai::control::grant",
        "sdk": "wai.control.grant"
      }
    },
    {
      "id": "remote.show",
      "summary": "The session as the clock holds it",
      "cli": "wai remote show",
      "aliases": [],
      "usage": [
        "wai remote show [--target <name|url>] [--query <name>=<value>]...   GET /remote/room on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/remote/room"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1remote~1room/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai remote show",
        "mcp": null,
        "c": "wai_remote_show",
        "rust": "wai::remote::show",
        "sdk": "wai.remote.show"
      }
    },
    {
      "id": "remote.verify",
      "summary": "That session verified",
      "cli": "wai remote verify",
      "aliases": [],
      "usage": [
        "wai remote verify [--target <name|url>] [--query <name>=<value>]...   GET /remote/state on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/remote/state"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1remote~1state/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai remote verify",
        "mcp": null,
        "c": "wai_remote_verify",
        "rust": "wai::remote::verify",
        "sdk": "wai.remote.verify"
      }
    },
    {
      "id": "conversation.show",
      "summary": "The conversation",
      "cli": "wai conversation show",
      "aliases": [],
      "usage": [
        "wai conversation show [--target <name|url>] [--query <name>=<value>]...   GET /msg on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/msg"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai conversation show",
        "mcp": null,
        "c": "wai_conversation_show",
        "rust": "wai::conversation::show",
        "sdk": "wai.conversation.show"
      }
    },
    {
      "id": "conversation.setup",
      "summary": "A challenge for a proof",
      "cli": "wai conversation setup",
      "aliases": [],
      "usage": [
        "wai conversation setup [--target <name|url>] [--query <name>=<value>]... [--yes]   GET /msg/challenge on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/msg/challenge"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1challenge/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai conversation setup",
        "mcp": null,
        "c": "wai_conversation_setup",
        "rust": "wai::conversation::setup",
        "sdk": "wai.conversation.setup"
      }
    },
    {
      "id": "conversation.join",
      "summary": "A key that proves itself is admitted",
      "cli": "wai conversation join",
      "aliases": [],
      "usage": [
        "wai conversation join [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/join on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/msg/join"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1join/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai conversation join",
        "mcp": null,
        "c": "wai_conversation_join",
        "rust": "wai::conversation::join",
        "sdk": "wai.conversation.join"
      }
    },
    {
      "id": "conversation.tail",
      "summary": "The log as it is owed to the caller",
      "cli": "wai conversation tail",
      "aliases": [],
      "usage": [
        "wai conversation tail [--target <name|url>] [--query <name>=<value>]...   GET /msg/log on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/msg/log"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1log/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai conversation tail",
        "mcp": null,
        "c": "wai_conversation_tail",
        "rust": "wai::conversation::tail",
        "sdk": "wai.conversation.tail"
      }
    },
    {
      "id": "conversation.import",
      "summary": "A member's KeyPackage",
      "cli": "wai conversation import",
      "aliases": [],
      "usage": [
        "wai conversation import [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/key-package on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/msg/key-package"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1key-package/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai conversation import",
        "mcp": null,
        "c": "wai_conversation_import",
        "rust": "wai::conversation::import",
        "sdk": "wai.conversation.import"
      }
    },
    {
      "id": "conversation.update",
      "summary": "A GroupInfo, or a commit and its Welcome",
      "cli": "wai conversation update",
      "aliases": [],
      "usage": [
        "wai conversation update [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/mls on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/msg/mls"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1mls/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai conversation update",
        "mcp": null,
        "c": "wai_conversation_update",
        "rust": "wai::conversation::update",
        "sdk": "wai.conversation.update"
      }
    },
    {
      "id": "message.create",
      "summary": "A message",
      "cli": "wai message create",
      "aliases": [],
      "usage": [
        "wai message create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/post on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/msg/post"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1post/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai message create",
        "mcp": null,
        "c": "wai_message_create",
        "rust": "wai::message::create",
        "sdk": "wai.message.create"
      }
    },
    {
      "id": "acknowledgement.create",
      "summary": "An acknowledgement",
      "cli": "wai acknowledgement create",
      "aliases": [],
      "usage": [
        "wai acknowledgement create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/ack on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/msg/ack"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1ack/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai acknowledgement create",
        "mcp": null,
        "c": "wai_acknowledgement_create",
        "rust": "wai::acknowledgement::create",
        "sdk": "wai.acknowledgement.create"
      }
    },
    {
      "id": "conversation.leave",
      "summary": "The caller leaves",
      "cli": "wai conversation leave",
      "aliases": [],
      "usage": [
        "wai conversation leave [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/leave on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/msg/leave"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1leave/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai conversation leave",
        "mcp": null,
        "c": "wai_conversation_leave",
        "rust": "wai::conversation::leave",
        "sdk": "wai.conversation.leave"
      }
    },
    {
      "id": "member.delete",
      "summary": "The owner removes a member",
      "cli": "wai member delete",
      "aliases": [],
      "usage": [
        "wai member delete [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /msg/remove on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/msg/remove"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1msg~1remove/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai member delete",
        "mcp": null,
        "c": "wai_member_delete",
        "rust": "wai::member::delete",
        "sdk": "wai.member.delete"
      }
    },
    {
      "id": "call.setup",
      "summary": "A challenge for a proof",
      "cli": "wai call setup",
      "aliases": [],
      "usage": [
        "wai call setup [--target <name|url>] [--query <name>=<value>]... [--yes]   GET /call/challenge on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/call/challenge"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1call~1challenge/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai call setup",
        "mcp": null,
        "c": "wai_call_setup",
        "rust": "wai::call::setup",
        "sdk": "wai.call.setup"
      }
    },
    {
      "id": "call.create",
      "summary": "Place a call",
      "cli": "wai call create",
      "aliases": [],
      "usage": [
        "wai call create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /call/place on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/call/place"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1call~1place/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai call create",
        "mcp": null,
        "c": "wai_call_create",
        "rust": "wai::call::create",
        "sdk": "wai.call.create"
      }
    },
    {
      "id": "call.invite",
      "summary": "Ring invitees",
      "cli": "wai call invite",
      "aliases": [],
      "usage": [
        "wai call invite [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /call/ring on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/call/ring"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1call~1ring/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai call invite",
        "mcp": null,
        "c": "wai_call_invite",
        "rust": "wai::call::invite",
        "sdk": "wai.call.invite"
      }
    },
    {
      "id": "inbox.show",
      "summary": "The caller's inbox",
      "cli": "wai inbox show",
      "aliases": [],
      "usage": [
        "wai inbox show [--target <name|url>] [--query <name>=<value>]...   GET /inbox on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/inbox"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1inbox/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai inbox show",
        "mcp": null,
        "c": "wai_inbox_show",
        "rust": "wai::inbox::show",
        "sdk": "wai.inbox.show"
      }
    },
    {
      "id": "answer.create",
      "summary": "Accept, decline or cancel",
      "cli": "wai answer create",
      "aliases": [],
      "usage": [
        "wai answer create [--target <name|url>] [--body <json>|@<file>] [--yes]   POST /call/answer on the room service"
      ],
      "placement": "service",
      "effect": "writes-target",
      "dry_run": true,
      "confirm": "always",
      "route": {
        "service": "wai-room",
        "method": "POST",
        "path": "/call/answer"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1call~1answer/post"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai answer create",
        "mcp": null,
        "c": "wai_answer_create",
        "rust": "wai::answer::create",
        "sdk": "wai.answer.create"
      }
    },
    {
      "id": "call.show",
      "summary": "The current call",
      "cli": "wai call show",
      "aliases": [],
      "usage": [
        "wai call show [--target <name|url>] [--query <name>=<value>]...   GET /call on the room service"
      ],
      "placement": "service",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": {
        "service": "wai-room",
        "method": "GET",
        "path": "/call"
      },
      "doors": {
        "cli": true,
        "mcp": false,
        "http": true
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "$ref": "joule-code/joule-code-rs/crates/joule-moq-room/openapi.json#/paths/~1call/get"
      },
      "output": {
        "type": "object",
        "required": [
          "target",
          "request",
          "status",
          "body"
        ],
        "description": "The service's answer: the target the request went to (its name, and its address), the request (method and path), the HTTP status, the body (its JSON, or {\"text\": ...}), and where the key it carried came from (WAI_TOKEN, stored, or none), never the key"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai call show",
        "mcp": null,
        "c": "wai_call_show",
        "rust": "wai::call::show",
        "sdk": "wai.call.show"
      }
    },
    {
      "id": "contract.create",
      "summary": "A channel's share contract from its terms, signed with the operator key; each owner countersigns it",
      "cli": "wai contract create",
      "aliases": [],
      "usage": [
        "wai contract create <terms.json> --key <name|file> [--out F] [--yes]   the share contract (WRC1) of the terms, signed",
        "    with the operator key, every countersignature still to come, written to F (<digest>.wrc); each owner adds",
        "    its own with `wai contract accept`; replacing a file waits for --yes (--confirm, deprecated, is the same)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "terms": {
            "type": "string",
            "format": "path",
            "description": "The terms: start, end, currency, channel, channel_signer, rule, between, carriers, owners, splits and assets.",
            "x-cli": {
              "positional": true
            }
          },
          "key": {
            "type": "string",
            "description": "The operator key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The contract's file (<digest>.wrc).",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "terms",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "digest",
          "operator",
          "channel",
          "owners",
          "in_force",
          "contract",
          "file"
        ],
        "description": "The share contract (WRC1, hexadecimal), its digest, each owner and whether it has countersigned, and the file it went to"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "revenue_share"
        ]
      },
      "names": {
        "cli": "wai contract create",
        "mcp": null,
        "c": "wai_contract_create",
        "rust": "wai::contract::create",
        "sdk": "wai.contract.create"
      }
    },
    {
      "id": "contract.update",
      "summary": "An owner's countersignature added to a share contract, after its rules and the operator's signature are checked",
      "cli": "wai contract accept",
      "aliases": [],
      "usage": [
        "wai contract accept <contract> --key <name|file> [--out F] [--yes]   the owner's countersignature added to the contract,",
        "    written to F (the contract's own file when F is not given); replacing a file waits for --yes (--confirm,",
        "    deprecated, is the same)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "contract": {
            "type": "string",
            "format": "path",
            "description": "The contract's file (WRC1).",
            "x-cli": {
              "positional": true
            }
          },
          "key": {
            "type": "string",
            "description": "The owner key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "Where the countersigned contract goes (the contract's own file).",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "contract",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "digest",
          "operator",
          "channel",
          "owners",
          "in_force",
          "contract",
          "file"
        ],
        "description": "The share contract (WRC1, hexadecimal), its digest, each owner and whether it has countersigned, and the file it went to"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "revenue_share"
        ]
      },
      "names": {
        "cli": "wai contract update",
        "mcp": null,
        "c": "wai_contract_update",
        "rust": "wai::contract::update",
        "sdk": "wai.contract.update"
      }
    },
    {
      "id": "statement.create",
      "summary": "A party's revenue-share statement for a period, recomputed from the ledger's invoices and the channel's program-as-run, signed with the operator key",
      "cli": "wai statement create",
      "aliases": [],
      "usage": [
        "wai statement create <inputs.json> --party <key> --start µs --end µs --key <name|file> [--out F] [--yes]   the statement",
        "    (WRS1) of the party for [start, end), computed from a verification document without its statement (the",
        "    contract, other contracts, runs and ledger documents), signed with the operator key and written with its",
        "    document to F (<digest>.wai-share.json) for `wai statement verify`; replacing a file waits for --yes"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "inputs": {
            "type": "string",
            "format": "path",
            "description": "A verification document without its statement: contract, contracts, runs and ledgers.",
            "x-cli": {
              "positional": true
            }
          },
          "party": {
            "type": "string",
            "description": "The party's key, 64 hexadecimal digits: the operator or an owner.",
            "x-cli": {
              "flag": "--party"
            }
          },
          "start": {
            "type": "integer",
            "description": "The period's start, microseconds since 1970.",
            "x-cli": {
              "flag": "--start"
            }
          },
          "end": {
            "type": "integer",
            "description": "The period's end, after its start.",
            "x-cli": {
              "flag": "--end"
            }
          },
          "key": {
            "type": "string",
            "description": "The operator key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The verification document's file (<digest>.wai-share.json).",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "inputs",
          "party",
          "start",
          "end",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "file",
          "statement",
          "outcome"
        ],
        "description": "The statement (WRS1, hexadecimal), the file its verification document went to, and its outcome, recomputed here"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "revenue_share"
        ]
      },
      "names": {
        "cli": "wai statement create",
        "mcp": null,
        "c": "wai_statement_create",
        "rust": "wai::statement::create",
        "sdk": "wai.statement.create"
      }
    },
    {
      "id": "statement.verify",
      "summary": "A revenue-share statement's verification document checked: every line recomputed from the public records, or the reason it is refused",
      "cli": "wai statement verify",
      "aliases": [],
      "usage": [
        "wai statement verify <document.json>   the outcome of a statement's verification document: each line, each split's",
        "    division and each impression's attribution, recomputed; exit 1 with the reason on a refusal"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "document": {
            "type": "string",
            "format": "path",
            "description": "The verification document: contract, contracts, statement, runs and ledgers.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "document"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "outcome",
          "statement",
          "contract",
          "party",
          "role",
          "lines",
          "total"
        ],
        "description": "An accepted statement's outcome (revenue-share §8.3): its lines, each split's division, every impression attributed, and the total"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "revenue_share"
        ]
      },
      "names": {
        "cli": "wai statement verify",
        "mcp": null,
        "c": "wai_statement_verify",
        "rust": "wai::statement::verify",
        "sdk": "wai.statement.verify"
      }
    },
    {
      "id": "opportunity.create",
      "summary": "A party's opportunity report for a period: the ad breaks a channel's signed cues and program-as-run prove in the programmes it shares in, signed with the issuer key",
      "cli": "wai opportunity create",
      "aliases": [],
      "usage": [
        "wai opportunity create <inputs.json> --party <key> --start µs --end µs --key <name|file> [--out F] [--yes]   the report",
        "    (WOR1) of the party for [start, end), computed from a verification document without its report (the",
        "    contract, other contracts, runs and rooms), signed with the issuer key and written with its document to F",
        "    (<digest>.wai-opportunity.json) for `wai opportunity verify`; replacing a file waits for --yes"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "inputs": {
            "type": "string",
            "format": "path",
            "description": "A verification document without its report: contract, contracts, runs and rooms.",
            "x-cli": {
              "positional": true
            }
          },
          "party": {
            "type": "string",
            "description": "The party's key, 64 hexadecimal digits: the operator or an owner.",
            "x-cli": {
              "flag": "--party"
            }
          },
          "start": {
            "type": "integer",
            "description": "The period's start, microseconds since 1970.",
            "x-cli": {
              "flag": "--start"
            }
          },
          "end": {
            "type": "integer",
            "description": "The period's end, after its start.",
            "x-cli": {
              "flag": "--end"
            }
          },
          "key": {
            "type": "string",
            "description": "The issuer key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The verification document's file (<digest>.wai-opportunity.json).",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "inputs",
          "party",
          "start",
          "end",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "file",
          "report",
          "outcome"
        ],
        "description": "The opportunity report (WOR1, hexadecimal), the file its verification document went to, and its outcome, recomputed here"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "opportunity_report"
        ]
      },
      "names": {
        "cli": "wai opportunity create",
        "mcp": null,
        "c": "wai_opportunity_create",
        "rust": "wai::opportunity::create",
        "sdk": "wai.opportunity.create"
      }
    },
    {
      "id": "opportunity.verify",
      "summary": "An opportunity report's or a statement check's verification document checked: every break, line and flag recomputed from the records, or the reason it is refused",
      "cli": "wai opportunity verify",
      "aliases": [],
      "usage": [
        "wai opportunity verify <document.json>   the outcome of a report's or a check's verification document: each break",
        "    attributed, each line and flag recomputed; exit 1 with the reason on a refusal"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "document": {
            "type": "string",
            "format": "path",
            "description": "The verification document: a report's (contract, contracts, report, runs, rooms) or a check's (report, reported, statement, check).",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "document"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "outcome"
        ],
        "description": "An accepted report's outcome (opportunity-report §8.3: every break attributed, each line and the totals) or an accepted check's (§11.3: each line's opportunities, reported and signed figures and flags)"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "opportunity_report"
        ]
      },
      "names": {
        "cli": "wai opportunity verify",
        "mcp": null,
        "c": "wai_opportunity_verify",
        "rust": "wai::opportunity::verify",
        "sdk": "wai.opportunity.verify"
      }
    },
    {
      "id": "statement.check",
      "summary": "A platform's reported statement checked against an opportunity report and, when given, the operator's signed statement, signed with the issuer key",
      "cli": "wai statement check",
      "aliases": [],
      "usage": [
        "wai statement check <report.json> <reported> [--statement <document.json>] [--floor ppm] [--ceiling ppm] --key <name|file> [--out F] [--yes]",
        "    the check (WCK1) of a reported statement (JSON, or CSV for a file named .csv) beside a report's verification",
        "    document and a signed statement's, at the bounds given (500000 and 2000000 when not), signed with the issuer",
        "    key and written with its document to F (<digest>.wai-check.json); replacing a file waits for --yes"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "report": {
            "type": "string",
            "format": "path",
            "description": "A report's verification document, with its report.",
            "x-cli": {
              "positional": true
            }
          },
          "reported": {
            "type": "string",
            "format": "path",
            "description": "The reported statement: JSON, or CSV for a file named .csv.",
            "x-cli": {
              "positional": true
            }
          },
          "statement": {
            "type": "string",
            "format": "path",
            "description": "A signed revenue-share statement's verification document of the same party and period.",
            "x-cli": {
              "flag": "--statement"
            }
          },
          "floor": {
            "type": "integer",
            "description": "The lower bound, in millionths of the period's rate (500000).",
            "x-cli": {
              "flag": "--floor"
            }
          },
          "ceiling": {
            "type": "integer",
            "description": "The upper bound, in millionths of the period's rate (2000000).",
            "x-cli": {
              "flag": "--ceiling"
            }
          },
          "key": {
            "type": "string",
            "description": "The issuer key: its name in the keystore (wai key list), or its file: 32 bytes, or 64 hexadecimal digits.",
            "x-cli": {
              "flag": "--key"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "The verification document's file (<digest>.wai-check.json).",
            "x-cli": {
              "flag": "--out"
            }
          }
        },
        "required": [
          "report",
          "reported",
          "key"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "file",
          "check",
          "outcome"
        ],
        "description": "The statement check (WCK1, hexadecimal), the file its verification document went to, and its outcome, recomputed here"
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": true,
      "needs": {
        "all": [
          "opportunity_report"
        ]
      },
      "names": {
        "cli": "wai statement check",
        "mcp": null,
        "c": "wai_statement_check",
        "rust": "wai::statement::check",
        "sdk": "wai.statement.check"
      }
    },
    {
      "id": "key.create",
      "summary": "A new Ed25519 signing key kept under a name, for one role, its secret in macOS's keychain or in a seed file; every signing operation's --key takes the name",
      "cli": "wai key create",
      "aliases": [],
      "usage": [
        "wai key create <name> --for <role> [--store keychain|file] [--keystore DIR]   a new signing key named <name>",
        "    (1 to 48 of a-z, 0-9, - and _), for one role: origin, signer, room, audit, ledger, release, remote-host,",
        "    quantum or dev. Its secret is kept in the login keychain (--store keychain, the default on macOS) or in a",
        "    file of the keystore (--store file, the default elsewhere: mode 0600 on Unix; on Windows an access list for",
        "    this account alone, inheritance off), and is never printed; a seed file another account may read is refused.",
        "    The keystore is DIR, $WAI_KEYSTORE, or ~/.config/wai/keys (%APPDATA%\\wai\\keys on Windows). --key <name> signs",
        "    with it"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The key's name: 1 to 48 of a-z, 0-9, - and _, beginning with a letter or a digit.",
            "x-cli": {
              "positional": true
            }
          },
          "role": {
            "type": "string",
            "description": "The key's role: origin, signer, room, audit, ledger, release, remote-host, quantum or dev.",
            "x-cli": {
              "flag": "--for"
            }
          },
          "store": {
            "type": "string",
            "description": "Where the secret is kept: keychain (the default on macOS) or file (the default elsewhere: mode 0600 on Unix; on Windows, an access list for this account alone).",
            "x-cli": {
              "flag": "--store"
            }
          },
          "keystore": {
            "type": "string",
            "format": "path",
            "description": "The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).",
            "x-cli": {
              "flag": "--keystore"
            }
          }
        },
        "required": [
          "name",
          "role"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "name",
          "role",
          "id",
          "key",
          "store",
          "keystore"
        ],
        "description": "The key kept: its name, role and key id, its public key in hexadecimal and its did:key (null in a dry run, which makes no key), where its secret is kept (store: keychain or file), and the keystore"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai key create",
        "mcp": null,
        "c": "wai_key_create",
        "rust": "wai::key::create",
        "sdk": "wai.key.create"
      }
    },
    {
      "id": "key.list",
      "summary": "Every key of the keystore: its name, role, key id, public key, status and where its secret is kept",
      "cli": "wai key list",
      "aliases": [],
      "usage": [
        "wai key list [--for <role>] [--keystore DIR]   every key of the keystore, its newest version, and where its secret is kept"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "role": {
            "type": "string",
            "description": "Only the keys of this role.",
            "x-cli": {
              "flag": "--for"
            }
          },
          "keystore": {
            "type": "string",
            "format": "path",
            "description": "The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).",
            "x-cli": {
              "flag": "--keystore"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "keystore",
          "keys"
        ],
        "description": "Each key of the keystore: its name, role, newest key id, public key, did:key and status, and where its secret is kept"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai key list",
        "mcp": null,
        "c": "wai_key_list",
        "rust": "wai::key::list",
        "sdk": "wai.key.list"
      }
    },
    {
      "id": "key.show",
      "summary": "One key: its public key and did:key, its role, every version with its status as a key log states it, and the version --key signs with",
      "cli": "wai key show",
      "aliases": [],
      "usage": [
        "wai key show <name> [--keystore DIR]   one key's versions, each active, retired (until) or revoked (compromised since), as",
        "    jwp-receipts §7.2's key log states them, and the one --key <name> signs with"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The key's name.",
            "x-cli": {
              "positional": true
            }
          },
          "keystore": {
            "type": "string",
            "format": "path",
            "description": "The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).",
            "x-cli": {
              "flag": "--keystore"
            }
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "keystore",
          "name",
          "role",
          "signs_with",
          "versions"
        ],
        "description": "The key's versions, oldest first, each with its key id, public key, did:key, status (active, retired, revoked) and times as a key log states them (jwp-receipts §7.2), and where its secret is kept (store; null once destroyed); and the key id --key signs with"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai key show",
        "mcp": null,
        "c": "wai_key_show",
        "rust": "wai::key::show",
        "sdk": "wai.key.show"
      }
    },
    {
      "id": "key.rotate",
      "summary": "A key's successor made under the same name and a new key id, the old version retired now and its secret destroyed",
      "cli": "wai key rotate",
      "aliases": [],
      "usage": [
        "wai key rotate <name> [--store keychain|file] [--keystore DIR] [--yes]   a successor under a new key id (<name>.<n>),",
        "    which --key <name> signs with from now; the old version is retired now and its secret destroyed (jwp-receipts",
        "    §7.6), so it waits for --yes"
      ],
      "placement": "local",
      "effect": "destructive",
      "dry_run": true,
      "confirm": "always",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The key's name.",
            "x-cli": {
              "positional": true
            }
          },
          "store": {
            "type": "string",
            "description": "Where the successor's secret is kept (where the old one's was).",
            "x-cli": {
              "flag": "--store"
            }
          },
          "keystore": {
            "type": "string",
            "format": "path",
            "description": "The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).",
            "x-cli": {
              "flag": "--keystore"
            }
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "name",
          "previous",
          "id",
          "key",
          "store"
        ],
        "description": "The version retired (previous, with until) and the successor made: its key id, public key (null in a dry run) and where its secret is kept (store)"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai key rotate",
        "mcp": null,
        "c": "wai_key_rotate",
        "rust": "wai::key::rotate",
        "sdk": "wai.key.rotate"
      }
    },
    {
      "id": "key.revoke",
      "summary": "A key's version revoked as compromised from a time, its secret destroyed, so --key signs nothing with it",
      "cli": "wai key revoke",
      "aliases": [],
      "usage": [
        "wai key revoke <name> [--id <key-id>] [--compromised-since <date-time>] [--keystore DIR] [--yes]   the key's newest",
        "    version (or --id's) revoked, compromised since the time given (now; YYYY-MM-DDTHH:MM:SSZ), and its secret",
        "    destroyed (jwp-receipts §7.6); it waits for --yes"
      ],
      "placement": "local",
      "effect": "destructive",
      "dry_run": true,
      "confirm": "always",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The key's name.",
            "x-cli": {
              "positional": true
            }
          },
          "id": {
            "type": "string",
            "description": "The version to revoke, by its key id (the newest).",
            "x-cli": {
              "flag": "--id"
            }
          },
          "compromised_since": {
            "type": "string",
            "description": "From when another party may have held it: a date-time in UTC, YYYY-MM-DDTHH:MM:SSZ (now).",
            "x-cli": {
              "flag": "--compromised-since"
            }
          },
          "keystore": {
            "type": "string",
            "format": "path",
            "description": "The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).",
            "x-cli": {
              "flag": "--keystore"
            }
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "name",
          "id",
          "compromised_since"
        ],
        "description": "The version revoked, the time from which it is held compromised, and whether its secret was destroyed"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai key revoke",
        "mcp": null,
        "c": "wai_key_revoke",
        "rust": "wai::key::revoke",
        "sdk": "wai.key.revoke"
      }
    },
    {
      "id": "key.import",
      "summary": "A key file's seed kept under a name, as wai key create keeps a new one; a published test seed is refused unless named one",
      "cli": "wai key import",
      "aliases": [],
      "usage": [
        "wai key import <name> --for <role> --from <file> [--store keychain|file] [--published-test-seed] [--keystore DIR]",
        "    the seed of a key file (64 hexadecimal digits or the 32 bytes, as every --key file holds) kept as wai key create",
        "    keeps one; a seed of one byte repeated 32 times, the form of every seed WAI publishes, is refused unless",
        "    --published-test-seed names it a test key"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The key's name.",
            "x-cli": {
              "positional": true
            }
          },
          "role": {
            "type": "string",
            "description": "The key's role: origin, signer, room, audit, ledger, release, remote-host, quantum or dev.",
            "x-cli": {
              "flag": "--for"
            }
          },
          "from": {
            "type": "string",
            "format": "path",
            "description": "The key file: 64 hexadecimal digits, or the 32 bytes.",
            "x-cli": {
              "flag": "--from"
            }
          },
          "store": {
            "type": "string",
            "description": "Where the secret is kept: keychain (the default on macOS) or file.",
            "x-cli": {
              "flag": "--store"
            }
          },
          "published_test_seed": {
            "type": "boolean",
            "description": "Keep a published test seed, marked as one.",
            "x-cli": {
              "flag": "--published-test-seed"
            }
          },
          "keystore": {
            "type": "string",
            "format": "path",
            "description": "The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).",
            "x-cli": {
              "flag": "--keystore"
            }
          }
        },
        "required": [
          "name",
          "role",
          "from"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "name",
          "role",
          "id",
          "key",
          "store",
          "keystore"
        ],
        "description": "The key kept: its name, role and key id, its public key in hexadecimal and its did:key (null in a dry run, which makes no key), where its secret is kept (store: keychain or file), and the keystore"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai key import",
        "mcp": null,
        "c": "wai_key_import",
        "rust": "wai::key::import",
        "sdk": "wai.key.import"
      }
    },
    {
      "id": "key.export",
      "summary": "A key's public half, never its secret: in hexadecimal, as a did:key, as key-log entries, or as the line wai-keys lists it by",
      "cli": "wai key export",
      "aliases": [],
      "usage": [
        "wai key export <name> [--format hex|did-key|entry|wai-keys] [--may-sign <authority>,...] [--out F] [--keystore DIR]",
        "    the public half alone: hex (the default), did-key, entry (each version as a key-log entry, jwp-receipts §7.2) or",
        "    wai-keys (the newest as wai-keys init --key and append --add take it); entry and wai-keys name the authorities",
        "    an origin gives it (--may-sign); to stdout, or to F (replacing a file waits for --yes)"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The key's name.",
            "x-cli": {
              "positional": true
            }
          },
          "format": {
            "type": "string",
            "description": "hex (the default), did-key, entry or wai-keys.",
            "x-cli": {
              "flag": "--format"
            }
          },
          "may_sign": {
            "type": "string",
            "description": "With entry and wai-keys: the authorities an origin gives the key (jwp-receipts §7.5), comma-separated.",
            "x-cli": {
              "flag": "--may-sign"
            }
          },
          "out": {
            "type": "string",
            "format": "path",
            "description": "Write it to this file.",
            "x-cli": {
              "flag": "--out"
            }
          },
          "keystore": {
            "type": "string",
            "format": "path",
            "description": "The keystore's directory ($WAI_KEYSTORE, or ~/.config/wai/keys).",
            "x-cli": {
              "flag": "--keystore"
            }
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "name",
          "id",
          "format",
          "text"
        ],
        "description": "The key's public half in the format asked for (the text, and for entry the key-log entries), and the file it went to"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": {
        "all": [
          "quickstart"
        ]
      },
      "names": {
        "cli": "wai key export",
        "mcp": null,
        "c": "wai_key_export",
        "rust": "wai::key::export",
        "sdk": "wai.key.export"
      }
    },
    {
      "id": "credential.create",
      "summary": "The key a service takes, read from standard input and kept for its origin in the keychain or a file only its owner reads",
      "cli": "wai auth login",
      "aliases": [],
      "usage": [
        "wai auth login --url <URL> [--store keychain|file] [--yes]   the key for the service at URL, read from standard input",
        "    (one line; never from the command line), kept for its origin: in the login keychain on macOS, else in a file of",
        "    the configuration directory that only its owner reads; WAI_TOKEN, when set, is sent ahead of every kept key.",
        "    A key goes over https://, or over http:// to this machine alone. Replacing an origin's key waits for --yes"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "The service's http:// or https:// address; the key is kept for its origin.",
            "x-cli": {
              "flag": "--url"
            }
          },
          "store": {
            "type": "string",
            "description": "keychain (the default on macOS) or file (the default elsewhere).",
            "x-cli": {
              "flag": "--store"
            }
          }
        },
        "required": [
          "url"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "origin",
          "store"
        ],
        "description": "The origin a key is kept for and where it is kept (keychain or file), never the key"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai credential create",
        "mcp": null,
        "c": "wai_credential_create",
        "rust": "wai::credential::create",
        "sdk": "wai.credential.create"
      }
    },
    {
      "id": "credential.list",
      "summary": "The origins a key is kept for and where each is kept, never a key, and whether WAI_TOKEN is set",
      "cli": "wai auth status",
      "aliases": [],
      "usage": [
        "wai auth status   each origin a key is kept for (wai auth login) and where it is kept, and whether WAI_TOKEN is set; no key is printed"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "credentials",
          "wai_token"
        ],
        "description": "Each origin a key is kept for and where it is kept (keychain or file), never a key; and whether WAI_TOKEN is set, which every request sends ahead of them"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai credential list",
        "mcp": null,
        "c": "wai_credential_list",
        "rust": "wai::credential::list",
        "sdk": "wai.credential.list"
      }
    },
    {
      "id": "credential.delete",
      "summary": "The key kept for a service's origin removed from the keychain or its file",
      "cli": "wai auth logout",
      "aliases": [],
      "usage": [
        "wai auth logout --url <URL> [--yes]   the key kept for URL's origin removed, from the keychain or its file; it waits for --yes"
      ],
      "placement": "local",
      "effect": "destructive",
      "dry_run": true,
      "confirm": "always",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "The service's address; the key kept for its origin is removed.",
            "x-cli": {
              "flag": "--url"
            }
          }
        },
        "required": [
          "url"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "origin",
          "store"
        ],
        "description": "The origin a key is kept for and where it is kept (keychain or file), never the key"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai credential delete",
        "mcp": null,
        "c": "wai_credential_delete",
        "rust": "wai::credential::delete",
        "sdk": "wai.credential.delete"
      }
    },
    {
      "id": "target.create",
      "summary": "A target: a name for a service's address, kept in the project's wai.json or in the person's own list, and never with a key",
      "cli": "wai target add",
      "aliases": [],
      "usage": [
        "wai target add <name> --url <URL> [--read-only] [--user] [--yes]   kept in ./wai.json where there is one, else (or with",
        "    --user) in the person's own list; --read-only refuses every operation that would change the service; a target is",
        "    never kept with a key (wai auth login keeps it). Replacing a target of that name waits for --yes"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-a-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The target's name: lowercase letters, digits and hyphens, beginning with a letter (local is the development room's).",
            "x-cli": {
              "positional": true
            }
          },
          "url": {
            "type": "string",
            "description": "The service's http:// or https:// address, with no user, query or fragment.",
            "x-cli": {
              "flag": "--url"
            }
          },
          "read_only": {
            "type": "boolean",
            "description": "Refuse every operation that would change the service.",
            "x-cli": {
              "flag": "--read-only"
            }
          },
          "user": {
            "type": "boolean",
            "description": "Keep it in the person's own list, not the project's wai.json.",
            "x-cli": {
              "flag": "--user"
            }
          }
        },
        "required": [
          "name",
          "url"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "name",
          "url",
          "read_only",
          "kept_in"
        ],
        "description": "The target: its name, its service's address, whether it refuses every operation that would change the service, and the file it is kept in (the project's wai.json, or the person's own list)"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai target create",
        "mcp": null,
        "c": "wai_target_create",
        "rust": "wai::target::create",
        "sdk": "wai.target.create"
      }
    },
    {
      "id": "target.update",
      "summary": "The target an operation that needs a service acts on when --target names none",
      "cli": "wai target use",
      "aliases": [],
      "usage": [
        "wai target use <name> | --none   the target taken where --target names none, kept in the person's own list; --none",
        "    takes none"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "A target's name (wai target list).",
            "x-cli": {
              "positional": true
            }
          },
          "none": {
            "type": "boolean",
            "description": "Take no target where none is named.",
            "x-cli": {
              "flag": "--none"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "use",
          "targets"
        ],
        "description": "Each target: its name, address, whether it is read-only, the file it is kept in, whether a key is kept for its origin, and whether another of that name hides it; and the target in use"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai target update",
        "mcp": null,
        "c": "wai_target_update",
        "rust": "wai::target::update",
        "sdk": "wai.target.update"
      }
    },
    {
      "id": "target.list",
      "summary": "Every target, its address, whether it is read-only, where it is kept and whether a key is kept for it; and the one in use",
      "cli": "wai target list",
      "aliases": [],
      "usage": [
        "wai target list   the project's targets (./wai.json) and the person's own, and the one in use"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "use",
          "targets"
        ],
        "description": "Each target: its name, address, whether it is read-only, the file it is kept in, whether a key is kept for its origin, and whether another of that name hides it; and the target in use"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai target list",
        "mcp": null,
        "c": "wai_target_list",
        "rust": "wai::target::list",
        "sdk": "wai.target.list"
      }
    },
    {
      "id": "target.delete",
      "summary": "A target removed from the project's wai.json or the person's own list",
      "cli": "wai target remove",
      "aliases": [],
      "usage": [
        "wai target remove <name> [--user] [--yes]   from ./wai.json where it is kept there, else (or with --user) from the",
        "    person's own list; it waits for --yes"
      ],
      "placement": "local",
      "effect": "destructive",
      "dry_run": true,
      "confirm": "always",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The target's name.",
            "x-cli": {
              "positional": true
            }
          },
          "user": {
            "type": "boolean",
            "description": "Remove it from the person's own list.",
            "x-cli": {
              "flag": "--user"
            }
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "name",
          "url",
          "read_only",
          "kept_in"
        ],
        "description": "The target: its name, its service's address, whether it refuses every operation that would change the service, and the file it is kept in (the project's wai.json, or the person's own list)"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai target delete",
        "mcp": null,
        "c": "wai_target_delete",
        "rust": "wai::target::delete",
        "sdk": "wai.target.delete"
      }
    },
    {
      "id": "ops.list",
      "summary": "Every operation of this catalogue: its id, command line, effect and whether this build holds it",
      "cli": "wai ops list",
      "aliases": [],
      "usage": [
        "wai ops list   every operation, its id and command line"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "array",
        "items": {
          "type": "object",
          "required": [
            "id",
            "summary",
            "cli",
            "effect",
            "placement",
            "toolset",
            "stability",
            "available"
          ]
        }
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai ops list",
        "mcp": null,
        "c": "wai_ops_list",
        "rust": "wai::ops::list",
        "sdk": "wai.ops.list"
      }
    },
    {
      "id": "ops.search",
      "summary": "The operations that match a task, ranked, offline: up to five",
      "cli": "wai ops search",
      "aliases": [],
      "usage": [
        "wai ops search \"<task>\"   up to five operations that match, ranked, offline"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "task": {
            "type": "string",
            "description": "What you want to do, in words.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "task"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "array",
        "maxItems": 5,
        "items": {
          "type": "object",
          "required": [
            "id",
            "summary",
            "cli",
            "score"
          ],
          "properties": {
            "id": {
              "type": "string"
            },
            "summary": {
              "type": "string"
            },
            "cli": {
              "type": [
                "string",
                "null"
              ]
            },
            "score": {
              "type": "integer"
            }
          }
        }
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai ops search",
        "mcp": null,
        "c": "wai_ops_search",
        "rust": "wai::ops::search",
        "sdk": "wai.ops.search"
      }
    },
    {
      "id": "ops.show",
      "summary": "One operation's entry: its input and output schemas, effect, placement and command line",
      "cli": "wai ops show",
      "aliases": [
        "wai ops schema"
      ],
      "usage": [
        "wai ops show <id>   one operation's entry, as JSON (also wai ops schema)"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "An operation id, noun.verb.",
            "x-cli": {
              "positional": true
            }
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "id",
          "summary",
          "input",
          "output",
          "effect",
          "placement"
        ]
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai ops show",
        "mcp": null,
        "c": "wai_ops_show",
        "rust": "wai::ops::show",
        "sdk": "wai.ops.show"
      }
    },
    {
      "id": "ops.export",
      "summary": "The catalogue as JSON (wai.ops/1), what other tools and CI read; --check compares a file with it",
      "cli": "wai ops export",
      "aliases": [],
      "usage": [
        "wai ops export [--out FILE | --check FILE]   the catalogue as JSON, to stdout, to FILE, or compared with FILE"
      ],
      "placement": "local",
      "effect": "writes-project",
      "dry_run": true,
      "confirm": "when-replacing-an-unnamed-file",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "stable",
      "input": {
        "type": "object",
        "properties": {
          "out": {
            "type": "string",
            "format": "path",
            "description": "Write the export here.",
            "x-cli": {
              "flag": "--out"
            }
          },
          "check": {
            "type": "string",
            "format": "path",
            "description": "Compare this file with the export; exit 1 when they differ.",
            "x-cli": {
              "flag": "--check"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "format",
          "toolchain",
          "envelope",
          "operations"
        ],
        "properties": {
          "format": {
            "const": "wai.ops/1"
          }
        }
      },
      "stream": null,
      "since": "0.3.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai ops export",
        "mcp": null,
        "c": "wai_ops_export",
        "rust": "wai::ops::export",
        "sdk": "wai.ops.export"
      }
    },
    {
      "id": "toolchain.show",
      "summary": "This wai's version, the digests of its catalogue and its registry, the release of the standard it implements, and the build features it holds",
      "cli": "wai --version",
      "aliases": [
        "wai version"
      ],
      "usage": [
        "wai --version [--json]   this binary's version, the SHA-256 of its catalogue (wai/catalogue/ops.json) and of its",
        "    registry (wai/registry/capabilities.json), the release of the standard it implements with the envelope formats",
        "    it reads, and the build features it holds (also wai version; wai/VERSIONING.md says what each promises)"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": false,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "toolchain",
          "catalogue",
          "envelope",
          "registry",
          "specification",
          "features"
        ],
        "description": "This binary's version, its catalogue's format, operations and SHA-256, the JSON envelope's version, its registry's capabilities and SHA-256, the release of the standard it implements with the envelope formats it reads, and the build features it holds"
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai toolchain show",
        "mcp": null,
        "c": "wai_toolchain_show",
        "rust": "wai::toolchain::show",
        "sdk": "wai.toolchain.show"
      }
    },
    {
      "id": "toolchain.doctor",
      "summary": "Whether this machine can run the toolchain: this wai and PATH, the relay and room service, the local stack's ports, browsers, and where keys are kept",
      "cli": "wai doctor",
      "aliases": [],
      "usage": [
        "wai doctor [--keystore DIR] [--json]   one check to a line: pass, FAIL with its fix, or not checked with the reason. Exit 1 when",
        "    one failed; result says passed, failed, or passed-with-not-checked. No secret is read and no prompt raised (wai/quickstart/README.md)"
      ],
      "placement": "local",
      "effect": "reads",
      "dry_run": false,
      "confirm": "never",
      "route": null,
      "doors": {
        "cli": true,
        "mcp": true,
        "http": false
      },
      "toolset": "core",
      "stability": "preview",
      "input": {
        "type": "object",
        "properties": {
          "keystore": {
            "type": "string",
            "format": "path",
            "description": "The keystore to look at (default: where wai key keeps keys).",
            "x-cli": {
              "flag": "--keystore"
            }
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output": {
        "type": "object",
        "required": [
          "result",
          "counts",
          "checks"
        ],
        "description": "The result (passed, failed, or passed-with-not-checked), how many checks are in each state, and each check: its id, its state (pass, fail, not-checked, or not-applicable), what it found or why it could not be run, the fix when it failed, and what it found as data",
        "properties": {
          "result": {
            "enum": [
              "passed",
              "failed",
              "passed-with-not-checked"
            ]
          },
          "counts": {
            "type": "object",
            "required": [
              "pass",
              "fail",
              "not_checked",
              "not_applicable"
            ]
          },
          "checks": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "state",
                "message",
                "fix",
                "facts"
              ],
              "properties": {
                "state": {
                  "enum": [
                    "pass",
                    "fail",
                    "not-checked",
                    "not-applicable"
                  ]
                }
              }
            }
          }
        }
      },
      "stream": null,
      "since": "0.5.0",
      "deprecated": null,
      "receipt": false,
      "needs": null,
      "names": {
        "cli": "wai toolchain doctor",
        "mcp": "toolchain_doctor",
        "c": "wai_toolchain_doctor",
        "rust": "wai::toolchain::doctor",
        "sdk": "wai.toolchain.doctor"
      }
    }
  ]
}
