open-standards/wai/extensions/volumetric.md
Transaction Science 161d147767
Some checks failed
wai-quantum WebGPU member / member · discrete GPU, Vulkan (jetson-hub) (pull_request) Successful in 9m59s
spec citations resolve / Code cites no section its SPEC lacks (pull_request) Successful in 4s
standards workspaces build + test / arl-rs (pull_request) Successful in 1m12s
standards workspaces build + test / eoc-rs (pull_request) Successful in 2m15s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m48s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 1m10s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 1m13s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m35s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m14s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m35s
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Has been cancelled
no-vanity-metrics / WAI public text names no comparison (pull_request) Has been cancelled
no-vanity-metrics / WAI public text names no company or product (pull_request) Has been cancelled
no-vanity-metrics / No new orphan source files (pull_request) Has been cancelled
standards workspaces build + test / jouleclaw-rs (pull_request) Has been cancelled
standards workspaces build + test / aac-rs (pull_request) Has been cancelled
standards workspaces build + test / joule-code-rs (pull_request) Has been cancelled
standards workspaces build + test / joulecontract-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / map-rs (pull_request) Has been cancelled
standards workspaces build + test / mesh-rs (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
tests in CI / every test file is run by a job or listed with its reason (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI HTTP delivery / WAI HTTP · does this change touch it (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Has been cancelled
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been cancelled
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Has been cancelled
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Has been cancelled
wai-pack / wai-pack · does this change touch it (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Has been cancelled
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Has been cancelled
WAI section references / cited sections exist (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
workflow hygiene / every workflow supersedes its own queue (pull_request) Has been cancelled
lockfiles / every Cargo.lock is current (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
standards workspaces build + test / smart-byte-rs (pull_request) Has been cancelled
wai: reader limits for the extension formats' durations
A score, haptic signal, audio scene, splat4d clip or film declares its length in its
contract, and rendering allocates in proportion: a score's mixdown allocated `duration`
samples outright, a haptic channel `duration` × 2 bytes, a scene's stereo mix 20 bytes a
sample, and the splat4d and film receipts a hash a frame. Nothing bounded the
declaration, so a few bytes could ask a renderer for more memory than any machine has.
SECURITY.md recorded it as a gap when the fuzzing PR found the reader-side reservations.

Each extension's contract section (score, haptics, spatial-audio, volumetric,
linear-film and its reel) now has a reader limit shared with SPEC §2, through a new
always-on module `wai::limits`:
- score and haptics: `duration × channels` at most 2^27 samples;
- audio scene: `duration` at most 2^26, so the stereo floor is at most 2^27 samples;
- splat4d `n_frames`, film `frames`, a reel's shots together: at most 2^20 frames.
A reader may refuse past them (`duration_too_long`) when it reads the contract, before
anything is rendered; a conforming encoder writes none.

The film schedule's tick, `start_tick + f × ticks_per_frame`, wrapped in release builds
and panicked in debug ones. A reader must now refuse a schedule whose last tick passes
2^64 - 1 (a film's, and each shot's of a reel); `Film::frame_tick` saturates and
`Reel::frame_tick` uses checked arithmetic.

tests/extension_duration_limits.rs rewrites a committed vector of each format to declare
exactly its limit (it reads) and one past it (refused by name), and checks the film
schedule ending at 2^64 - 1 (reads) and past it (refused). Falsified: with the readers
as they were, all three tests fail. The world, audio, haptic, splat4d, score and film
corpora verify unchanged; the 275 lib tests with the container features pass. CI runs
the test beside container_reservations on every leg.

SECURITY.md drops the gap and keeps the one this exposes: replaying a world to a far
tick costs time in proportion (memory is bounded, time is not).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 11:07:16 -04:00

121 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WAI Extension: Volumetric / 4D Splats
> Status: Draft. Phase 5 of the cargo roadmap (the frontier). A scene
> that is volumetric *and* moves: ship a Gaussian cloud as per-Gaussian
> keyframed tracks, the sink interpolates the cloud at any frame and
> renders it with the EWA pipeline. Conformance is
> **frame-state-equivalence**. Reference impl: the `splat4d` feature of
> `wai-rs`; corpus: `volumetric-conformance/`; live sink:
> wai.transaction.science/volumetric.
Keywords **MUST**, **MUST NOT**, **SHOULD**, **MAY** are RFC 2119/8174.
## 1. Scope and model
A `wai.splat.4d` object is a **temporal Gaussian splat**: the static
splat (`wai.splat.spz`) is a single anisotropic-Gaussian cloud; this
extension gives each Gaussian a keyframed track — position, scale,
rotation, color, opacity over time — and the sink reconstructs the cloud
at any frame by interpolating the tracks in the `wai.det.fixed64` floor.
It is lever 3 (instructions-at-the-sink) for volumetric capture: the wire
carries the trajectories, the sink reconstructs the frame.
In scope: the container, the per-Gaussian keyframe model, the
deterministic reconstruct contract, the **frame-state-equivalence**
conformance criterion, and the receipt profile.
Out of scope: a transport; the render (EWA splatting, depth sort, alpha
blend — the sink's, exactly as the static splat's rasterization is); a
codec for the cloud bytes (a real capture is authored by an upstream
3DGS/4DGS pipeline; this extension carries and verifies its trajectories,
it does not fit Gaussians to video).
Relationship to the core spec: mirrors haptics / spatial audio. The
reconstruct runs in the `wai.det.fixed64` floor; `media` takes the
informational value `"volumetric"`; `wai.splat.4d` is authoritative.
## 2. Container (`W4DS`)
```
"W4DS" | u16 n_sections | section table (u8 kind, u32 off, u32 len) | sections
```
| kind | section | required |
|---|---|---|
| `0x01` | contract (canonical JSON) | REQUIRED |
| `0x02` | Gaussian tracks | REQUIRED |
### 2.1 Contract
```json
{ "frame_rate": 30, "n_frames": 13, "n_gaussians": 2,
"numeric": "wai.det.fixed64" }
```
**Reader limit.** A reader MUST NOT refuse a clip for its length while `n_frames` is at
most 1 048 576 (2²⁰, the video limit of SPEC §2), and MAY refuse one past it
(`duration_too_long`), when it reads the contract, before it reconstructs anything. A
conforming encoder writes no clip past it.
### 2.2 Gaussian tracks
`n_gaussians u32`, then per Gaussian: `n_keys u16`, then
`n × ( frame u64 | pos[3] | scale[3] | rot[4] | color[3] | opacity )`,
the 14 attributes as `i64` Fx in that field order. Each track MUST be
ascending by `frame`. `color` and `opacity` are in `[0, 1]`; `rot` is a
quaternion `(x, y, z, w)`.
## 3. Reconstruct contract
For each Gaussian, at frame `f`: each of the 14 attributes is the `Fx`
linear interpolation of the track's keyframes at `f`; before the first /
after the last key the endpoint holds. The canonical reconstruction of a
frame is `n_gaussians u32 | per-Gaussian 14×i64` in the field order
above. The floor stays trig-free — rotations interpolate component-wise
(nlerp without renormalization, deterministic); the sink normalizes the
quaternion for rendering, which is presentation.
## 4. Conformance — frame-state-equivalence
> Given the same `wai.splat.4d`, a conforming sink MUST reconstruct the
> identical Gaussian set at every frame, hence the identical BLAKE3 — on
> every machine, no tolerance parameter.
```
frame_hash = BLAKE3("wai:splat4d-frame\x01" || frame_le || canonical frame bytes)
clip_hash = BLAKE3("wai:splat4d-clip\x01" || contract_bytes || tracks)
```
`frame_hash` is the temporal counterpart of the static splat's content
hash; `clip_hash` is the frame-independent identity.
## 5. Fidelity and size (honest)
A splat **approximates** a captured scene, so `wai.splat.4d` is tiered
`Lossy` like `wai.splat.spz` — even though the per-frame reconstruction
from the tracks is *frame-state-exact*. Volumetric is **heavy**: a real
cloud is megabytes per frame. The win here is the same as the static
splat — content-addressing, dedup, one signed envelope, and a verifiable
per-frame state — **not** payload reduction. We state that plainly rather
than imply a compression claim the format does not make.
## 6. Receipt (JWP profile)
`clip_hash` is the identity; the group's objects are per-frame
reconstruction blocks (`frame_hash` per frame), Merkle-bound; one
Ed25519 signature (verified as SPEC §7 *Signatures* requires) over clip_hash + root + `work` (= n_frames ×
n_gaussians) + carried `joules_micro`; `parent_receipt_hash` chains — the
worlds / audio / haptics receipt shape reused. The figure's acquisition class rides beside it as an optional signed label
([energy-measurement](energy-measurement.md) §2.8): absent, the receipt keeps
its legacy bytes and the figure is unlabelled; present, it is inside the
signature. The reference meter labels every figure it measures
`OnChipCounter`, with its declared uncertainty.
## Appendix
Frame-state-equivalence is sample-equivalence with the haptic sample
replaced by a whole Gaussian cloud, and the static splat extended to
time. The same fixed-point floor that makes a world replay, a mix sum, an
actuator buzz, a feed converge, and a body pose now makes a volumetric
frame reconstruct — one floor, six cargo classes, one verification. The
representation is heavy and approximate; the *reconstruction* of it is
exact and auditable, and that is the honest thing the standard adds.