### `wai.splat.exact`: Gaussian splats in glTF as an exact WAI object, and frames that are the same everywhere

- **Carriage** ([splat-exact](extensions/splat-exact.md) §3): a `wai.splat.int_codec` object travels
  in a glTF 2.0 asset as the draft compression extension `EXT_gaussian_splatting_compression_wai`,
  nested in a mesh primitive's `KHR_gaussian_splatting` object. A buffer view holds the object's
  `WAI1` envelope; the extension states its content hash and its parameter set (carried in the
  asset, or held by digest) and, in another buffer view, the origin's commitment as its JCS text.
  The primitive's five accessors carry no data, so both extensions are required, and `POSITION`'s
  `min` and `max` are the decode's own. The draft JSON Schema is
  `extensions/gltf/EXT_gaussian_splatting_compression_wai.schema.json`. WAI submits nothing to the
  glTF registry; the extension name is registered here as a proposed wire identifier, of a new
  kind, `gltf-extension`.
- **Attributes** (§4): the 14 planes of `wai.splat.int_codec` dequantized at 2^16 from the
  payload's binary32 ranges, rounded half up exactly, and their mapping onto the base extension's
  `POSITION`, `ROTATION`, `SCALE`, `OPACITY` and `SH_DEGREE_0_COEF_0`.
- **The renderer `wai-splat-render:i1`** (§5): a fixed-point camera and projection (the elliptical
  weighted average model, its 0.3 px² low pass and 1.3× Jacobian clamp), culling with stated
  rules, an order by squared camera distance with the index breaking every tie, per-pixel alpha
  compositing with every rounding stated (`exp_neg_q16` of integer-operators §2, the 3σ cut-off,
  alpha within 1/255 and 0.99, a stop below 0.0001), and 16 × 16 tiles whose order does not change
  the frame. Every value compositing reads fits 32 bits, and only `e1` and `e2` need 64.
- **Commitment and view statement** (§6, §7): the origin signs the object, its set, its attribute
  digest and the frame digest at each canonical pose; a sink signs, under a session key, the frame
  it presented at a pose, canonical or its own.
- **Provenance** (§8): a view is a `convert` of the splat set under synthesis §3.2, so its class
  is the greater of `reconstructed` and the splat set's. Synthesis origin claims may now name
  `media` `volumetric` ([synthesis](extensions/synthesis.md) §3.1).
- **Quality cost, measured** (§12): against a floating-point renderer of the same model in `f64`,
  59.4 to 67.2 dB PSNR on the corpus's views, no byte off by more than 4; the same float renderer
  in `f32` gives other bytes than in `f64` on some views at the corpus's sizes and on nearly all
  at four times the side.
- **Reference and corpus**: the `splat_exact` module of `wai-rs` (feature `splat_exact`), the
  bins `wai_splat_exact_vectors gen|verify` and `wai_splat_exact_measure`, and the corpus
  `live-conformance/splat/`: the learned cloud of `tests/vectors/int_splat/`, two authored scenes
  carried through a one-layer identity set, and refused cases for every code of §10, among them a
  reordered sort, a frame that does not recompute, a commitment over other splats and a pose
  outside the pinned set claimed canonical. Its second implementation,
  `live-conformance/splat_exact_verify.py`, decodes with the repository's other second
  implementations, renders with its own integer renderer, and catches every mutated corpus copy,
  every dropped check and every changed renderer rule.
- **On a GPU**: `wai-ops-gpu` gains the compositing kernel `wgsl/splat.wgsl`; `splat_exact::gpu`
  (features `splat_exact`, `ops_gpu`) gives the CPU's frame on every view of the corpus on Metal,
  and its test catches three edited kernels. `wai-ops-gpu.yml` runs it on the `macos` runner.

