### `wai.json` names its schema, its version and its project, and the schema is committed

- **Three members.** `$schema`, the URL of the file's JSON Schema
  (`https://wai.transaction.science/schema/wai.json/1`); `wai`, the file's version, `1`; and
  `name`, the project's machine name, the name it is deployed by: a DNS label (lowercase letters,
  digits and hyphens, at most 63, beginning with a letter and not ending with a hyphen). The
  reader refuses a file of a later version by name (`upgrade wai`) rather than reading half of
  it: by its `wai` or by its `$schema`, before any other member is read, so a member the later
  version adds is never refused as unknown in its place. It refuses a `$schema` of another
  schema, and a name that breaks the rule. A file without them reads as before, as version 1.
- **The schema**, [schema/wai-json-1.schema.json](schema/wai-json-1.schema.json) (JSON Schema
  2020-12), states every member and every rule the reader holds. The reader's tests hold the two
  together: the same members, modes and name rule, and the same verdict on every template's file
  and on files each breaking one rule, with the schema read as a validator reads it: its name
  pattern run as a regular expression, and numbers compared by value. So the reader takes a
  whole number however it is written (`4.0` and `4e0` are `4`, as the schema's `integer` and
  `const` take them), and none above 2^53 - 1, the largest every JSON reader holds exactly,
  which the schema states as `dev.watch_ms`'s maximum.
- **Served before it is named.** The site is to serve the schema at its `$id`, and the release
  waits for it: the tag build's first job (`wai-release.yml`) fetches the URL and fails unless
  it answers with this schema, so no release writes a `$schema` that editors and agents cannot
  fetch. Until the site serves it, a tag of `wai` does not build.
- **Version 1 is fixed by the first release that writes it**, and the members the toolchain's
  design adds beside these (`requires`, `room`, `package`, `conform`, `breaking`, `targets`,
  `receipts` and `dev.port`) are version 2's, each with the operation that reads it. Adding them
  to version 1 after that release would make every reader of it refuse such a file as having an
  unknown member, unable to say `upgrade wai`; adding them now, with nothing to read them, would
  make the strict reader accept members it ignores. [schema/README.md](schema/README.md) says
  so.
- **`wai create`** writes the three members, and names the project for its directory when that is
  a project name (`wai create my-room --template video-room` makes `my-room`), else for its
  template; the rest of the template's file is unchanged. Every template's `wai.json` carries
  them, named for the template. An app exported from Create carries them too.
