### The registry as one table, candidate capabilities, the codec glossary under test, and the public text retrofit

- **Candidate capabilities** (SPEC §5): a registered string whose payload format no
  revision has pinned — `wai.tensor.nnc` and `wai.splat.sog` — MUST NOT be emitted, and a
  sink treats it as unsupported. This is a MINOR rule: it enforces the candidate
  registrations as they were made (§8). Envelopes it makes non-conforming: a `WAI1` naming
  a candidate as its `capability` or `fallback`, and a `WAI2` with a component of a
  candidate; they still parse. `codecs::is_candidate`, `Wai::check_candidates` and
  `WaiMulti::check_candidates` report them. `Wai::to_emit_bytes` and
  `WaiMulti::to_emit_bytes` check, then serialise: the C packers `wai_envelope_pack` and
  `wai_envelope_pack_multi` emit through them, the browser writers `pack` and `packMulti`
  refuse the same envelopes (`container::check_candidates_v1`,
  `check_component_candidates`), and `wai wrap` refuses a candidate before any other rule,
  in every place including a `WAI2` companion. A candidate's licence class is provisional:
  `wai.splat.sog` is classified patent-pool, conservatively (it was royalty-free, never
  established). `wai.splat.sog` no longer claims an MPEG attribution: no MPEG page or
  output document read names the format it was registered for ([research
  registry](research/media-codec-registry.md), *MPEG's Gaussian-splat and point-cloud
  work*).
- **One registry table** (`wai-rs/src/codecs/registry.rs`, no feature): every registered
  string with its **kind** (`payload`, `companion`, `derivation`, `record`), its
  **status** (`registered` or `candidate`; `RegistrationStatus`), its **media** class,
  the SPEC §5 heading that registers it, the edition its registration names and the date
  it was registered; the named identifiers that are not capabilities (`wai.det.fixed64`,
  `wai.world.sim.*`); and the receipt labels no revision registers
  (`wai.quantum.{mitigate,decode,compile,rearrange,qbom}`). SPEC §5 states the kinds:
  records and derivations name no payload format. Every payload and companion
  capability carries a licence class (records do not).
- **Dispatchable** (SPEC §4, normative): steps 3 and 5 take only a dispatchable
  capability, and a capability is dispatchable unless this revision registers it as a
  candidate, a companion-only capability, a record or a derivation. A string this
  revision does not register stays dispatchable — a later MINOR revision may register
  it (§8) — and is decoded only where the sink advertises it. `codecs::is_dispatchable`
  implements it and is the one predicate every dispatch and selection function of the
  reference implementation uses (`Wai::dispatch_verified`, formerly
  `dispatch_capability`; `WaiMulti::pick`; `WaiMulti::primary`;
  `RenditionMeta::is_selectable`; the CLI's `inspect`; and, below, the neural sink, the
  C ABI and wai-web); §7.1's selection sentence says the same. A later dispatch or
  selection function uses it too.
- **`wai registry export`** writes `registry/capabilities.json`, its JSON Schema
  (`registry/capabilities.schema.json`), the generated table of
  [`REGISTRY.md`](REGISTRY.md) and **vocab v2** (`vocab/v2.{ttl,jsonld,shapes.ttl}`,
  namespace `https://wai.transaction.science/vocab/v2#`, one IRI per registered string,
  enumeration individuals named `<class prefix>-<label>` so no two terms share an IRI,
  the registration date as `registeredOn`; its JSON-LD context maps a `WAI1` or `WAI2`
  manifest as written, with `kind` and a component's `role` under terms of their own;
  its SHACL shapes apply to a manifest with no `@type` and to every `WAI2` component,
  check the capabilities against the registry, and leave `media` open, as SPEC §3 and §8
  require). `--check` fails on drift; a library test and a CI step run it, and
  `vocab/check_shapes.py` validates typed and untyped sample manifests in CI. vocab v1
  is stable: no IRI is removed and no term changes meaning. REGISTRY.md states the
  registration procedure; CONTRIBUTING.md is rewritten around it.
- **The `wai` binary builds without the `codecs` feature** (encode and decode are
  compiled out); `tests/cli_wrap_intent.rs` and the new `tests/cli_registry.rs` run in
  CI. `wai wrap` now writes the registry's media class: `volumetric` for `wai.mesh.*`,
  `wai.pc.*` and `wai.splat.*` (was `model`), `image` for the learned image codecs such
  as `wai.neural.bmshj2018` (was `binary`). SPEC §3 lists the media values, informational.
  Without `codecs`, `inspect`, `capabilities` and `unwrap` claim no native decode.
- **Editions** (SPEC §8): a registration that names no edition carries the edition of
  its standard current on the date it was registered, and no later edition or
  amendment, which takes a new string. `wai.pc.gpcc` and `wai.pc.vpcc` therefore do not
  carry the Gaussian-splat amendments of ISO/IEC 23090-9 and 23090-5; Enhanced G-PCC
  (ISO/IEC 23090-38) is not a `wai.pc.gpcc` payload. Which edition of each part was
  current on their registration date is unresolved, and what they admit beyond the
  part's first edition is unspecified until a revision records it.
- SPEC: `wai.world.replay`, `wai.world.live`, `wai.semantic.clip` and
  `wai.semantic.perco2` are spelled out or given rows, and a test holds SPEC and the
  registry to the same strings in both directions; the opening, §1 and the floor
  paragraph agree with §5; citations: PNG (W3C Recommendation, Third Edition), FLAC
  (RFC 9639), Zstandard (RFC 8878), AVIF (the AOM AVIF specification, HEIF-based,
  MIAF-conforming), JPEG AI (ISO/IEC 6048-1:2025); the neural tables state each model's
  published operating point; Appendices B and C are rewritten; confidentiality's
  implementation is a companion implementation under its own licence.
- **The codec glossary** links each registered capability that has an entry, with the
  registry's licence and replicate classes, through a reviewed table
  (`GLOSSARY_LINKS`); every other payload and companion capability is listed with a
  reason (`GLOSSARY_NO_ENTRY`). `org` became `body`, from a closed allowlist of
  standards bodies, designations and open-source projects; new modality values `text`,
  `volumetric`, `haptic`, `metadata`; new entries for the registered formats that had
  none; descriptions scrubbed of company names and comparisons; entries titled by the
  format's own name, FourCC, file extension or designation, never by a company, a
  product or a person (the research codecs by their method); HEVC regraded `success`;
  JPEG AI dated 2025; AVS3 video's body is the designation the registry pins. The file
  now carries `"schema_version": 2`: a reader of the earlier form, which had `org` and no
  version, finds no `org` field in version 2.
  `glossary_links_agree_with_the_registry` holds it to its schema and the registry.
- **quantum-ops vectors regenerated with neutral ids** (`example:lab3-device`,
  `example:qpu-a`) through `wai_quantum_ops_vectors gen`. Changed receipt hashes:
  `cal_q3` `7c53298929a1261959315c91f9540781b4bff0669b5f4b783becee93dbf5f8fa`, `cal_cz`
  `4c6374ee05c956f928455f86326357f10d08f3466e88d569a6ef49975001f526`, `job_bell`
  `08b142d29dadc466b294b89d2127f39ee9fa1aa0b6b5a4c6c5d226baf343b9e3`. The wai-quantum
  calibration pin (`receipt_pins::calibration_legacy_bytes`) was recomputed by the code
  before the acquisition class, with the neutral id. wai-quantum's version is unchanged.
- **CI**: the feature-gated test targets the conformance workflow names are declared
  with `required-features`, so dropping a feature stops cargo instead of running nothing;
  `tests/int_audio.rs` and `tests/int_splat.rs` now run; the registry export is checked;
  the glossary, SPEC, registry and vocab paths fire the conformance workflow. wai-web is
  built for wasm32 (`wai-web-wasm.yml`, and the int_hyper vectors in
  `wai-sota-vectors.yml`), and its verify scripts fail on a missing artifact when
  `WAI_REQUIRE_SOTA_VECTORS` is set or a directory is named. The Windows x86_64 legs are
  out of the conformance and byte-equality matrices while their runner is offline (each
  matrix says how to restore it). The nested `wai/.github/workflows/ci.yml`, which no
  forge reads, is removed.
- **Public text**: two checks, `scripts/check-comparative-prose.sh` (a public phrase
  list) and `scripts/check-public-names.sh` (patterns kept private), now run in CI over
  `wai/`'s text, code, data, markup and ignore files. Both fail closed (a grep error or
  a pattern that does not compile exits 2), an opt-out needs a reason, and
  `scripts/test-public-text-checks.sh` proves both on every run. Without the private
  list a push to main fails. The list is given only to the run on a push to main, never to
  a pull request's code; a pull request shows a failed step saying the name check did not
  run. The specification, extensions, research notes, READMEs, CONTRIBUTING, the
  glossary and source comments name no company, vendor or product and make no
  comparisons; functional identifiers (capability strings, model-hub ids, OS API names,
  advisory ids) stay, marked. Dated research records keep their findings: corrections are
  dated annotations (the MoQ Transport revision, the MPEG splat stages, WebTransport's
  status, the October 2026 call for content); names are redacted, and comparative
  framing is restated, in place. In this changelog's history, names are redacted and
  nothing else changes.
- For later changes: a new dispatch or selection path uses `codecs::is_dispatchable`;
  a newly registered string (for example a prior set) goes into the registry table,
  `wai registry export` regenerates the exports and vocab v2 (vocab v1 is stable and only
  gains terms), and the string is listed in the glossary's `GLOSSARY_NO_ENTRY` or linked.
  The quantum-ops corpus and the wai-quantum calibration pin have the values above; the
  pwsh steps of the conformance workflow remain, inactive.
- [`extensions/jwp-receipts.md`](extensions/jwp-receipts.md) §5: the MUST is over the
  cases §5.1–§5.5 define; verifying against their vectors becomes a MUST once the
  vectors are published in the tree.

