open-standards/wai/wai-rs/Cargo.toml
Transaction Science a46eba3c0a
All checks were successful
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Successful in 3m12s
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Successful in 6s
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Successful in 6s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 6s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m41s
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Successful in 12m41s
joule-code conformance gate / joule-moq-relay, every target (pull_request) Successful in 2m55s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m20s
joule-code conformance gate / joule-moq-ingest, every target (pull_request) Successful in 1m30s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 10s
wai cross-architecture byte-equality / does this change touch it (pull_request) Successful in 15s
WAI conformance / does this change touch it (pull_request) Successful in 10s
WAI energy receipts / does this change touch it (pull_request) Successful in 5s
WAI HTTP delivery / WAI HTTP · does this change touch it (pull_request) Successful in 5s
wai cross-architecture byte-equality / linux-x86_64 (pull_request) Successful in 31s
WAI JPEG-AI whole decode (pinned inputs, required) / does this change touch it (pull_request) Successful in 35s
WAI neural decoders end-to-end / does this change touch it (pull_request) Successful in 26s
WAI neural sink gates / does this change touch it (pull_request) Successful in 14s
wai-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Successful in 11s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 13s
wai-quantum studio and desktop / does this change touch it (pull_request) Successful in 11s
wai-quantum WebGPU member / does this change touch it (pull_request) Successful in 13s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 3m15s
WAI mbt2018_mean integer decode (regenerated vectors) / does this change touch it (pull_request) Successful in 8s
wai-web wasm32 / does this change touch it (pull_request) Successful in 9s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 2m15s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 35s
joule-moq-room room service / joule-moq-room, every target (pull_request) Successful in 2m10s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Successful in 30s
wai-quantum WebGPU member / member · integrated GPU, Vulkan (framework-128gb) (pull_request) Successful in 7m39s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 6m55s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 23s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 10m38s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 20m9s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 7m12s
WAI neural decoders end-to-end / synthetic fixtures → Rust decode → reference (±4) (pull_request) Successful in 1m30s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m35s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 17m13s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 11s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 24s
wai-pack / wai-pack · linux (pull_request) Successful in 1m41s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 3m10s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 1m26s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 2m48s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 3m25s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m14s
wai-quantum WebGPU member / member · discrete GPU, Vulkan (jetson-hub) (pull_request) Successful in 28m46s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 7m42s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 4m29s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m41s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 10m45s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 9m1s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 22s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 14m22s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 22s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 49s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h2m44s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 47m52s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 6m18s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 48m48s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 6m2s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 6m41s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 5s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 9m10s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m47s
wai-pack / wai-pack · macos (pull_request) Successful in 1m16s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m15s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 1m22s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 6m30s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 21s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 2m32s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m16s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 4m13s
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Successful in 4m22s
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Successful in 1m53s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 48m43s
Merge origin/main into train/wai-c (Train D landed: co-watch beside DRED, telemetry, splat, soft bindings and PQ)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-25 03:57:01 -04:00

1961 lines
89 KiB
TOML
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.

[package]
name = "wai"
version = "0.3.0"
edition = "2024"
rust-version = "1.97"
license = "Apache-2.0"
description = "WAI — Web AI media transport + execution, and a deterministic QUANTUM stack: byte-exact circuit simulation with statevector / stabilizer / tensor-network / sparse-Pauli backends, error mitigation, qLDPC decoding, noise learning, circuit-equivalence proofs and signed energy-accounted receipts — identical results native and in cloud WASM. Plus a capability-as-requirement envelope and zeroth-condition wrappers around standard codec libraries (AVIF / JPEG-XL / PNG / Opus / FLAC / AV1 / zstd / LZMA)."
repository = "https://git.transaction.science/Transaction-Science/open-standards"
homepage = "https://wai.transaction.science"
documentation = "https://wai.transaction.science/quantum-ide"
keywords = ["quantum", "simulation", "wasm", "deterministic", "codec"]
categories = ["science", "simulation", "wasm", "multimedia"]
[lib]
name = "wai"
crate-type = ["lib", "cdylib", "staticlib"] # cdylib + staticlib for FFI/SDK
# clippy.toml's `disallowed-methods` lists the float functions the JPEG AI exact
# decoder must not call. Allowed for the package here; each module on that decode path
# denies it with `#![deny(clippy::disallowed_methods)]`.
[lints.clippy]
disallowed_methods = "allow"
# `cfg(kani)` is set only by the model checker (wai-verify `#[path]`-includes the
# integer sources: rans, int_entropy, int_transform, int_kernels). Declared so an
# ordinary build or clippy run knows the name and does not warn on it.
[lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ["cfg(kani)"] }
[dependencies]
# Container manifest. preserve_order so JSON round-trips byte-identical.
serde = { version = "1", features = ["derive"] }
serde_json = { version = "1", features = ["preserve_order", "raw_value"] }
# ---- zeroth codec wrappers: lossy + lossless across all media ----
# All optional behind the (default-on) `codecs` feature: native sinks get
# the full menu; a wasm32 world sink builds with --no-default-features
# --features world and none of the C codec chain. Registration (the
# capability strings in codecs/mod.rs) is NOT gated — only the decoders.
# Image
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp", "avif"], optional = true } # PNG, JPEG decode, AVIF encode (via ravif)
jpeg-encoder = { version = "0.7", optional = true } # pure-Rust JPEG with optimized Huffman tables
libavif-sys = { version = "0.17", optional = true, default-features = false, features = ["codec-dav1d"] } # AVIF decode through libavif itself, with the reader limits as its decoder limits
jpegxl-rs = { version = "0.14", optional = true } # libjxl bindings (links system libjxl; 0.11.x and 0.12.x both work)
jpegxl-sys = { version = "0.12", optional = true } # libjxl itself, to read a payload's declared size before it decodes
# Audio
opus = { version = "0.3", optional = true } # libopus bindings (lossy)
ogg = { version = "0.9", optional = true } # Ogg container for standard .opus interop
claxon = { version = "0.4", optional = true } # FLAC decode (pure Rust)
flac-bound = { version = "0.5", optional = true } # FLAC encode (libFLAC)
# Video
rav1e = { version = "0.8", default-features = false, features = ["threading"], optional = true }
dav1d = { version = "0.11", optional = true } # AV1 decode (libdav1d)
# Text
zstd = { version = "0.13", optional = true } # zstd bindings
xz2 = { version = "0.1", optional = true } # liblzma bindings (XZ/LZMA)
# Bytestream framing for video container (we wrap rav1e packets into a
# minimal IVF-like sequence for self-contained .wai video payloads).
byteorder = { version = "1", optional = true }
# ---- neural runtime (optional, behind the `neural` feature) ----
# `ort` wraps ONNX Runtime — same ORT version (1.26) the
# browser-side wai-web demo uses, so models built with our exporters
# load identically here. The `download-binaries` feature fetches the
# right libonnxruntime build at compile time; no manual brew install.
ort = { version = "2.0.0-rc.12", default-features = false, features = ["std", "download-binaries", "ndarray", "tls-rustls"], optional = true }
ndarray = { version = "0.17", optional = true }
# ---- the `wai` CLI's TLS client (optional, behind the `cli_tls` feature) ----
# `wai http receipts --key-origin` retrieves an origin's key log over HTTPS itself
# (http-delivery §8.4), the origin's certificate validated against the operating system's
# trust store. The library never opens a connection: only the binary uses these, and no
# library or wasm32 build enables the feature. ring is the provider already in the graph.
rustls = { version = "0.23", default-features = false, features = ["std", "ring", "tls12"], optional = true }
rustls-platform-verifier = { version = "0.7", optional = true }
zstd-safe = { version = "7", optional = true, features = ["std"] } # for bmshj2018 latent unpack (std → WriteBuf for Vec)
# SHA-256 is WAI's digest for parameter-set identity, component identity and decoded-output
# conformance digests (SPEC §3.1, §7 *Digests*, §7.1). Pure Rust, so it is always on: the
# envelope reader verifies a component digest and a pin with no feature enabled.
sha2 = "0.10"
# ---- real C2PA manifest emission (optional, behind `c2pa_emit`) ----
# Writes an actual signed manifest carrying the energy + reconstruction
# bindings, rather than only defining their shapes. Off by default: the SDK
# is a large dependency chain and most consumers only need the types.
c2pa = { version = "0.90", optional = true, default-features = false, features = ["rust_native_crypto"] }
# ---- interactive worlds (optional, behind the `world` feature) ----
# extensions/interactive-worlds: WWLD container, signed CausalOps,
# deterministic fixed-point simulation, replay-equivalence conformance.
blake3 = { version = "1.8", optional = true } # state hashes, node minting, op/seal commitments; `hazmat` (1.8) for the HTTP head proof
ed25519-dalek = { version = "2", optional = true } # op + seal signatures
num-bigint = { version = "0.4", optional = true } # oer: exact decimal arithmetic in the composition checks; live_ads: RFC 9578's RSASSA-PSS
# The curve ed25519-dalek is built on, named directly only by `receipt_claims`: its
# conformance corpus builds the signatures jwp-receipts §3.1 step 3 must refuse (keys of
# small order, non-canonical encodings), which the signing API cannot produce, and the
# verifier checks S < L itself (§3.1 step 3).
curve25519-dalek = { version = "4", optional = true }
# QoE aggregation (telemetry_aggregate): TurboSHAKE128's permutation (Keccak-p[1600, 12]), and
# HPKE's AEAD and KDF (RFC 9180: AES-128-GCM, HKDF-SHA256). Each is a small RustCrypto crate,
# Apache-2.0 OR MIT.
keccak = { version = "0.1.6", optional = true }
aes-gcm = { version = "0.10.3", optional = true, default-features = false, features = ["aes", "alloc"] }
hkdf = { version = "0.12.4", optional = true }
# ML-DSA-65 (FIPS 204), the post-quantum half of a hybrid signature, named only by
# `pq_signatures` (extensions/pq-signatures.md). Pure Rust, Apache-2.0 OR MIT. Default
# features off: no random-number generator and no PKCS#8; keys come from 32-byte seeds and
# the reference signs in FIPS 204's deterministic variant.
ml-dsa = { version = "0.1.1", optional = true, default-features = false, features = ["alloc"] }
# ---- quantum (optional, behind the `quantum*` features) ----
# The quantum stack now lives in its own dependency-light crate so it can be used
# without the media/codec chain. `wai` re-exports it unchanged.
wai-quantum = { version = "0.6.0", path = "../wai-quantum", optional = true, default-features = false }
# ---- the integer operator set (behind `neural_int`) ----
# `wai-ops/1` (extensions/integer-operators.md): an integer decoder that decodes
# through it lowers its parameter set to WHG1 graphs and loads them under its
# capability's profile, the bounds certificate included (src/int_ops.rs). no_std, no
# dependencies of its own.
wai-ops = { path = "../wai-ops", optional = true }
# `wai-ops/1-i32` on GPUs (feature `ops_gpu`): WGSL kernels through wgpu. Optional and off
# by default, so a default build has no GPU interface in it.
wai-ops-gpu = { path = "../wai-ops-gpu", optional = true }
[features]
default = ["codecs"]
# The zeroth-condition codec wrappers (image/audio/video/text) + the C
# FFI surface built on them. Default-on: a native sink is a full sink.
# Disable for targets where the C codec chain can't follow (wasm32) —
# the envelope, manifest, and `world` engine build without it.
codecs = [
"dep:image", "dep:jpeg-encoder", "dep:libavif-sys", "dep:jpegxl-rs", "dep:jpegxl-sys",
"dep:opus", "dep:ogg", "dep:claxon", "dep:flac-bound",
"dep:rav1e", "dep:dav1d",
"dep:zstd", "dep:xz2", "dep:byteorder",
"ffi",
]
# The C ABI's envelope surface (buffers, errors, WAI1/WAI2 pack and unpack, §7.1
# selection), with no codec library: it builds and is tested where libjxl and the
# other C codec libraries are absent. `codecs` adds the codec wrappers to it.
ffi = []
# Pulls in the ONNX runtime + zstd unpack so the native sink can
# decode `wai.neural.<...>` envelopes. Off by default — the bare
# container + zeroth codecs build with no ML dep chain.
# The integer-exact synthesis decoder (`wai.neural.int_synth`). Pure i64
# arithmetic — no ONNX, no float, bit-identical on every machine by
# construction — so it sits behind its own light feature, checkable in a CI
# matrix with no ONNX Runtime present. `neural` pulls it in. blake3 is for the
# conformance corpus's content hash (the same hash the other classes freeze).
neural_int = ["dep:blake3", "dep:wai-ops"]
# Test-only: the integer decoders' direct decodes, as they were before they decoded
# through the integer operator set (`int_synth::legacy`). The differential tests decode
# random sets and payloads both ways and require the same output or the same refusal
# outside the planned breaks (tests/int_ops_differential.rs). No sink enables it.
legacy_int = ["neural_int"]
# The 32-bit forms of the stage operators that have one by identity (E9's,
# integer-operators §5E), and the decodes of `WIV1` and `WIR1` through them
# (`int_video::ops::decode_typed_i32`, `staged::wir1::ops::apply_unit_i32`): the
# arithmetic a 32-bit fabric runs, which the parity tests hold to the exact decode. For
# the integer GPU legs; no sink decodes through it by default.
i32_forms = ["neural_int", "wai-ops/i32_forms"]
# The integer decoders' graphs on a GPU (`int_ops::gpu`, `wai_ops_gpu`): `wai-ops/1-i32` in
# WGSL kernels through wgpu, at the width each graph's certificate admits. A decode runs
# its graphs there only inside `int_ops::gpu::with_gpu`; everywhere else, and for a graph
# with an operator outside `wai-ops/1-i32`, the interpreter runs them. Native only: on
# wasm32 the feature builds and changes nothing.
ops_gpu = ["neural_int", "dep:wai-ops-gpu"]
# Deterministic integer generative synthesis (`wai.generate.*`): byte-exact
# generation pinned to (model, prompt, seed, steps) — the create-side of the
# integer contract. Pure i64, no ONNX/float (serde_json is already a base dep),
# so it builds and is bit-checkable with no ML dep chain, and compiles to wasm32.
generate = []
# Deterministic integer inter-frame VIDEO (`wai.video.int_motion`): byte-exact
# frame-by-frame decode — integer block motion compensation + integer-quantized
# residual over the rANS coder. Frame-state-equivalence (per-frame hash); the
# temporal extension of the integer contract. Reuses the pure-i64 rANS (neural_int).
video_int = ["neural_int"]
# Integer-exact LEARNED audio codec (`wai.audio.int_codec`): a learned 1-D transform
# codec, integer transposed-conv synthesis → byte-exact int16 PCM (sample-equivalence,
# a portable PCM hash). The audio analog of int_hyper. Reuses pure-i64 rANS + IGDN.
audio_int = ["neural_int"]
# Integer-exact INTERACTIVE WORLD MODEL (the byte-exact renderer for wai.world.model):
# action-conditioned next-frame model, transition + synthesis both int_hyper IntModels.
# Reuses int_hyper_synth (neural_int).
world_int = ["neural_int"]
# Integer-exact LEARNED Gaussian-splat ATTRIBUTE codec ("the int_hyper of 3D"):
# learned transform over the [14,S,S] attribute image → byte-exact attribute tensor
# (splat-equivalence, a portable cloud hash). Reuses int_hyper_synth (neural_int).
splat_int = ["neural_int", "serde_json/float_roundtrip"]
neural = ["neural_int", "dep:ort", "dep:ndarray", "dep:zstd-safe"]
# The perceptual / generative-semantic path: CLIP-similarity conformance,
# regenerate-at-sink. Reuses the ONNX runtime for the reference CLIP embedder;
# the generator is always sink-supplied. Off by default like `neural`.
semantic = ["codecs", "dep:ort", "dep:ndarray"]
# Ed25519 verified as WAI verifies every signature (SPEC §7 *Signatures*, `src/sig.rs`):
# the dependency on its own, so the one verifier builds exactly when ed25519-dalek does
# and asks for no feature its caller does not need. Every signing feature enables it.
ed25519 = ["dep:ed25519-dalek"]
# Interactive worlds (extensions/interactive-worlds): media that consumes
# input. Pure-Rust, no ML dep chain — the sim is closed-form fixed-point.
world = ["dep:blake3", "ed25519"]
# Live events (extensions/live-events): `wai.live.events`, a signed, hash-chained,
# timeline-bound event track — the WEV1 record, its policy, its verifier, poll tallies
# replayed through the feed sim (wai.world.sim.feed0), and the MSF event timeline,
# EXT-X-DATERANGE and emsg mappings. SHA-256 and Ed25519 only; no new dependency.
live_events = ["world"]
# Live rooms (extensions/live-rooms): `wai.live.room` — the signed room descriptor (WRD1)
# and room grant (WRG1), revocation through the authority's key log (jwp-receipts §7),
# track naming, precedence and redundancy over slots, publish profiles, and the room
# verifier that replays every principal's events under the grant in effect at each t.
# Ed25519, SHA-256 and the key log only; no new dependency.
live_room = ["live_events", "key_discovery"]
# Capture binding (extensions/capture-binding): `wai.capture.take` — a device's master
# recording bound to a live room by rolling take_commit events (the take tree is
# staged-measurement Appendix C's, with RFC 9162 consistency proofs), the store's upload
# receipts (WUR1), the take manifest (WTM1), consent records (WCN1), and the take verifier
# with its single-take, aligned, complete and publishable verdicts. Ed25519, SHA-256 and
# the key log only; no new dependency.
capture_take = ["live_room"]
# Live composition (extensions/live-compose.md): `wai.live.compose` — the signed
# composition descriptor (WCD1), the participant set a room's lifecycle replay gives at
# each instant, the integer layout function (grid, featured tile, picture in picture, fill
# modes) and the saturating integer mixer, and the compositor's signed receipt (WCR1).
# The layout and the mixer use nothing beyond core and alloc. Ed25519 and SHA-256 only; no
# new dependency.
live_compose = ["live_room"]
# Live recording (extensions/live-recording): `wai.live.recording` — a finished room session as
# one WAI package (the SPEC §3.1 listing of its files; the room, its events, each take and the
# composite as components named by id and the SHA-256 of their listings; the signed WRM1
# recording manifest) with its complete and publishable verdicts, and provable clips: WCL1 clip
# records whose RFC 6962 range proofs reach a take's commitment, verified without the take.
# SHA-256, Ed25519 and the key log only; no new dependency.
live_record = ["capture_take"]
# Live metering (extensions/live-metering): `wai.live.metering` — the per-hop session record
# (WMH1) a relay, compositor or ingest gateway signs, with its ledger of the grants its sessions
# ran under and a size bound independent of the audience; the room-session receipt (WMR1) a room
# authority or a `live/meter` key signs, its units, joules per hop with their acquisition class and
# a total per class, each grant's consumption against its ceilings, and the QoE cell; and the QoE
# observations' CMCD event-timeline record and `application/cmcd` batch. It reads rooms, takes and
# composition receipts through their modules and the logs through the telemetry module. SHA-256,
# Ed25519 and the key log only; no new dependency.
live_metering = ["live_compose", "capture_take", "telemetry"]
# Energy-aware content steering (extensions/energy-steering): `wai.live.steering` — the signed
# steering policy (WSP1) and steering decision (WSD1): each pathway's joules per delivered byte or
# per delivered second at the floor tier from its hops' per-hop records (live-metering's WMH1), with
# their acquisition class, compared only within a class, a pathway with no figure never ranked above
# one with a figure; the integer decision rule with limits, minimum shares and hysteresis; the client's
# report from HLS and DASH steering requests and CMCD (an RFC 9651 parser of its own); and the
# steering manifest, the HLS tag and the DASH element, written exactly. SHA-256, Ed25519 and the key
# log only; no new dependency.
energy_steering = ["live_metering"]
# Browser sink (extensions/browser-sink.md): how a page routes each object to the user agent's
# decoder, a native host's or a wasm decoder (the WebCodecs Codec Registry gate, the tier an object
# needs, the probe), evaluates capability-constraints' sets over its register, reports a measured
# figure beside the user agent's powerEfficient, and binds each decoded frame to the receipted
# object it came from (contentBinding: the jwp-receipts §2.1 content hash, the group receipt's link
# hash, the tier), with the side table a page carries it in and the state of the frame on screen.
# BLAKE3 and serde_json at run time; Ed25519 to sign the corpus's group receipts. Builds for wasm32.
browser_sink = ["jwp_hash", "ed25519"]
# Live moderation (extensions/live-moderation): `wai.live.moderation` — the room authority's
# signed review policy (WMP1: what is held for review or reviewed after delivery, by whom, each
# deadline and fallback, and the reason codes with their grounds), the statement (WMS1) that
# follows a `decision` event, notices and complaints (WMN1), lines of decisions by digest, the
# review state machine, gaps that withheld events leave explained by the decisions that restrict
# them, clips of a redacted take through live-recording's clip verifier, and the export of each
# restricting decision as a statement of reasons in the DSA Transparency Database's format,
# written by hand. SHA-256, Ed25519 and the key log only; no new dependency.
live_moderation = ["live_events", "live_room", "live_record"]
# Co-watch (extensions/co-watch): `wai.live.cowatch` — a room watching one source together: the
# authority's co-watch policy (WXP1) naming the source and its bounds, controls (WXC1: play, pause,
# seek, rate) effective at a stated room-clock instant ahead of their sending and applied in a
# pinned order, the controlled position they define, players' signed presentation statements
# (WXS1), and the room clock's skew statements (WXK1) per window, recomputed from the statements:
# each viewer's error and each pair's skew as percentiles, with verdicts against the bound, a viewer
# with missing statements unknown. And the pinned catch-up rule. SHA-256 and Ed25519 only; no new
# dependency.
co_watch = ["live_events", "live_room"]
# Forensic watermark sessions (extensions/forensic-watermark): `wai.live.watermark` — the edge's
# signed session record (WWS1: the positions of an ETSI TS 104 002 pattern it embedded, the variant
# at each, the token by its digest, the content keys, and a salted commitment to the session's grant
# and principal), the claimant's recovered sequence (WWQ1) and the exact rule that matches it, and
# the room authority's disclosure (WWD1) that opens one commitment. The TS's token is read with a
# deterministic-CBOR reader of its own and RFC 9052's COSE_Mac0 / COSE_Sign1 structure. SHA-256,
# Ed25519 and the key log only; no new dependency.
live_watermark = ["live_room"]
# Live ads (extensions/live-ads): `wai.live.ads` — server-guided ad insertion for rooms: the
# room authority's signed ad policy (WAP1), the schedule of breaks the room's `cue` events open
# and close with the post-roll annotation (WAB1), each break's HLS interstitial and preload date
# ranges and DASH alternative-presentation event written exactly, the HLS asset lists and DASH
# list MPDs each viewer is served, and the room verifier extended to the break form of
# wai.video.ssai's receipt: the decision recomputed, the asset list bound, the spend held to the
# decider grant's ceiling. With it, ad presentation (extensions/ad-presentation):
# `wai.live.ad_presentation` — a player's signed claim (WPC1) that it presented one impression,
# its spans of visible and audible play under the viewability rule an ad policy of version 2
# names, an optional device attestation token of RFC 9577 checked against the impression's own
# challenge and RFC 9578's publicly verifiable type, and the room verifier's spend counting only
# the impressions whose claim verifies. SHA-256, SHA-384, BLAKE3, Ed25519 and the key log, and
# num-bigint (already a dependency of `oer`) for the RSA arithmetic.
live_ads = ["live_room", "video_ssai", "dep:num-bigint"]
# Live provenance (extensions/live-provenance): `wai.live.provenance` — the live video provenance
# of C2PA 2.4 §19 for a room's CMAF tracks and a device's CMAF take, written and verified with no
# C2PA library: ISO BMFF segments and the BMFF hash over whole-box exclusions, the JUMBF manifest
# store, COSE_Sign1 with EdDSA and the OKP key, the claim signer's X.509 chain (DER written and
# read here), per-segment manifests chained by manifest identifier, Verifiable Segment Info under
# rotating session keys, and each segment tied to the JWP group receipt and object receipts of the
# same chunks. CBOR through live_watermark's deterministic reader; the disclosure label and its
# IPTC and AI-disclosure mapping through timed_text. SHA-256, BLAKE3 and Ed25519 only; no new
# dependency.
live_provenance = ["live_watermark", "timed_text"]
# A still of packaging §5.7 (src/png_still.rs): one RGB8 frame as a `wai.image.png` payload,
# every byte a pure function of the frame, and the reader that decodes any 8-bit RGB PNG
# without interlace, with an inflater of its own. No dependency. The reference packager
# (wai-pack) and the deriving edge write and read stills with it.
png_still = []
# The deriving edge (extensions/deriving-edge.md): `wai.edge.derivation` — the record an edge
# signs for an object it derived from delivered objects (a wai.derive.* operation over 8-bit RGB
# samples, a frame of a wai.video.int_motion clip rebuilt as a still or a JPEG picture, a WAI2
# component exploded), naming each input by its content hash, its delivery receipt and the
# record that derived it; the derivations' arithmetic; the verifier that follows a derived
# object back to its source, re-executing each replicate hop whose inputs it holds; and the
# reference edge's derive. Its delivery receipts are jwp_delivery's (receipt_claims), its key
# logs key_log's (key_discovery), its clips int_video's (video_int); jpeg-encoder, already a
# dependency of `codecs`, writes its attested JPEG outputs. No new dependency.
derive_edge = ["key_discovery", "video_int", "png_still", "dep:jpeg-encoder"]
# Synthesis provenance (extensions/synthesis): `wai.media.synthesis` — the origin claim of an
# object, a group or a track (captured, reconstructed, assistive or synthesized; the class rises
# along a chain of derivations and never falls), its IPTC digital source type and C2PA statement,
# the two pinned integer derivations whose recomputation proves an assistive claim, the marking
# and detection records of the second marking layer and their agreement with the claim, the
# tracks of a room's AI participants, reviews that a player presents only on a decode path of
# the review's tier, and the label obligations of a player's signed log. SHA-256, BLAKE3,
# Ed25519 and the key log only; no new dependency.
synthesis = ["live_room", "neural_int"]
# Contribution records (extensions/contribution): `wai.media.contribution` — a tool's session of
# parties (people by key, each countersigning its membership; models by digest), the signed hash
# chain of steps (author, generate, candidates, select, edit, inpaint, transform, compose, reject)
# in a Merkle tree for selective disclosure, the authorship map computed by re-executing each
# act's dependency rule (made_by and directed_by per sample, unknown and undisclosed never
# credited), the checks a verifier makes (regions, selections, regeneration, recomputation), and
# the agreement with the output's origin claim. Reuses synthesis (its records and derivations)
# and generate (the pinned generator its exact steps regenerate with); no new dependency.
contribution = ["synthesis", "generate"]
# Takedown (extensions/takedown): `wai.media.takedown` — a service's signed takedown of a source
# (an object by content hash, a group, a track or a take) under a policy that pins a registry of
# regime clocks (registry/takedown-clocks.json) and names its stores; the derivation closure
# computed from deriving-edge records, synthesis origin claims and the delivery receipts of the
# groups it reaches, against the set the takedown states, with perceptual matches kept apart;
# the holders' signed purges and the time to removal held to the clock; and the signed counts
# per clock, ground, category and source, recomputed. Reuses derive_edge and synthesis (their
# readers), jwp_delivery (group expansion) and settlement (the acknowledgements that show who
# served or received an object); no new dependency.
takedown = ["derive_edge", "synthesis", "settlement"]
# Direction records (extensions/direction): `wai.media.direction` — a director's signed
# storyboard (shots, durations, subjects by reference picture, the framing each opens on, an
# order), keyframes (a subject's box and its size, position and angle classes, and a camera
# window, at stated frames, with pinned integer interpolation; regions held to a reference) and
# sequence (shots, their parts, order, cuts and dissolves); the tool's directed output naming
# them with every clip frame's layout, the timeline as made and its frames by digest; the pinned
# integer render that recomputes every frame from layers wai.generate.spectral regenerates; the
# framing measure; and the frames each element governs. Reuses generate and the claim reader;
# SHA-256, BLAKE3 and Ed25519 only; no new dependency.
direction = ["receipt_claims", "generate"]
# The second marking layer's registered scheme, wai-mark:tent64 (extensions/synthesis.md §7.5),
# measured: the attack battery (re-encoding with wai.video.int_motion's encoder, the pinned
# derivations of §4, area resampling, crops, rotations, noise from a fixed stream, brightness,
# contrast, a local blur), the measurement sets generated from fixed seeds (wai.generate.spectral's
# generator and a dead-leaves generator), PSNR and SSIM, and the scheme's conformance corpus. The
# scheme itself is under `synthesis`; this adds no dependency.
synthesis_mark = ["synthesis", "video_int", "generate", "png_still"]
# Exact upscale (extensions/exact-upscale): `wai.media.upscale` — the upscale record an origin
# signs for a picture a sink upscales with `wai-upscale:sr2` or `wai-upscale:sr4` (`int_sr`, the
# integer network over wai-ops/1 under a `WSR1` prior held by digest), with the residual (a WIR1
# payload of staged delivery, decoded over the upscaled picture) that brings it to the origin's
# target or to a stated bound; and the sink's presentation statement, which counts the pixels and
# frames of a span that were transmitted, derived exactly, edited by an unprovable step or
# generated, each held to its origin claim (synthesis). Its claims are synthesis's, its residuals
# staged's. SHA-256, BLAKE3 and Ed25519 only; no new dependency.
exact_upscale = ["synthesis", "staged"]
# Deep redundancy for Opus decoded exactly (extensions/opus-dred): `wai.audio.opus.dred.int` — the
# DRED extension of draft-ietf-mlcodec-opus-dred-07 found in an Opus packet's padding
# (draft-ietf-mlcodec-opus-extension-06's iterator, RFC 6716's framing and range decoder), its
# integers, and its decoder network as the wai-ops/1 graphs of the lowering `dred-int/1` (weights
# quantized from the draft's float32 bits, tanh and the sigmoid as lut16 tables of a fixed integer
# computation); a stream under a seeded loss pattern and the digest of its reconstruction; the
# measurement against the floating-point network; and the player's log entry that presents a
# reconstruction (synthesis). The weights file is pinned by digest and never committed. No new
# dependency.
dred_exact = ["neural_int", "synthesis", "jwp_hash"]
# Robustness evidence for soft bindings (extensions/robustness-evidence): `wai.media.robustness` —
# corpus documents naming pictures and clips by the SHA-256 of their samples, the attack battery
# as pinned integer transforms with parameters and seeds (synthesis_mark's battery, and gamma),
# the signed robustness record whose table the harness recomputes bit for bit with rates as exact
# fractions, and the robustness claim held to the records it cites; wai-mark:tent64's records
# and claim. Reuses synthesis_mark; no new dependency.
robustness = ["synthesis_mark"]
# Exact splats (extensions/splat-exact): `wai.splat.exact` — a wai.splat.int_codec object carried in
# a glTF 2.0 asset as the compression extension EXT_gaussian_splatting_compression_wai of
# KHR_gaussian_splatting (its WAI1 envelope in a buffer view, its content hash, its parameter set and
# the origin's commitment); the attribute planes mapped onto the base extension's attributes; the
# pinned integer renderer wai-splat-render:i1 (a fixed-point camera and projection, an order by
# squared camera distance with the index breaking ties, integer alpha compositing, 16 x 16 tiles);
# the commitment to the frames at canonical poses; a sink's view statement; a view's class under
# synthesis's lattice; and a float renderer of the same model, for measurement only. Reuses
# splat_int (the decode) and synthesis (origin claims). SHA-256, BLAKE3 and Ed25519 only; no new
# dependency.
splat_exact = ["splat_int", "synthesis"]
# AI usage preferences and consumption claims (extensions/ai-usage): `wai.ai.usage` — the usage
# statement (draft-ietf-aipref-vocab-08's Structured Field form, the TDM Reservation Protocol's
# properties and the Training and Data Mining Assertion's entries, verbatim) in an envelope's
# manifest, a room's WAU1 record and a grant's terms; the HTTP and catalog fields checked
# against it; and the jwp-receipts `consumption` claim checked against its objects and room.
# RFC 9651's Dictionary parser is written here. SHA-256, Ed25519 and the room's records only;
# no new dependency.
ai_usage = ["live_room"]
# Delivery settlement (extensions/settlement): `wai.delivery.settlement` — the acknowledgement a
# downstream party signs of what it received (WDA1: per object class, the objects by content hash
# under jwp-receipts §2.2's tree, their byte ranges and byte count, chained per window) and the
# declaration a hop signs of a delivery nobody acknowledged; the byte-range proof over BLAKE3's
# chunk tree (WBR1, through blake3's hazmat API, as the HTTP head proof); paid retrieval billed only
# to a grant whose WRP1 proof the request carried; and the settlement statement (WSS1) whose lines,
# declared bytes, per-class joules from live-metering's WMH1 and integer amount a verifier
# recomputes. SHA-256, BLAKE3, Ed25519 and the room's records only; no new dependency.
settlement = ["live_metering", "jwp_hash"]
# Co-performance (extensions/co-performance): `wai.live.coperformance` — the room authority's
# co-performance policy (WPP1); intents (WPI1) by digest or as notes, a text line or a camera
# move, compared with what played under pinned rules, and the clock's fidelity statement
# (WPF1), recomputed; turn schedules in microseconds or bars at a tempo, call-and-response
# pairs and handovers (WPT1, WPH1), the floor, latency budgets and the clock's marks (WPM1);
# audience inputs to selection windows (WPA1, WPW1), the commitment (WPC1) and the three
# selection rules with their credits (WPS1). SHA-256, Ed25519 and the room's records only; no
# new dependency.
co_performance = ["live_events", "live_room"]
# Age assurance (extensions/age-assurance): `wai.age.assurance` — rating claims (`wai-rating`)
# for an object, a track, a span or a room under named schemes, carried through every
# derivation; a room's age policy (`wai-age-policy`) of Privacy Pass issuers with one key per
# threshold; admission by a token of RFC 9578's publicly verifiable type and the serving rule;
# a sink's age state and predicate with no return path; admission receipts with every count
# under 50 suppressed; and the minors' profile over a room's role bitmaps. It reuses the
# ad-presentation module's RSASSA-PSS and token reader (`live_ads`): no new cryptography and
# no new dependency.
age_assurance = ["live_room", "live_ads"]
# Influence attribution (extensions/influence): `wai.media.influence` — an owner's signed terms for
# a work (its usage statement, the acts it allows, a per-use price or a revenue share, the tier a
# use must reach) and signed catalogues; the conditioning record beside a contribution step that
# names every work that conditioned it, and the pinned conditioned generator that regenerates the
# step from them; the step map, the declared share rule and the attribution a verifier recomputes
# (unknown and undisclosed never credited, an estimate never added); the attribution lines of a
# WSS1 statement; and the owner's transparency report. Reuses contribution, settlement and
# ai_usage; no new dependency.
influence = ["contribution", "settlement", "ai_usage"]
# Bearer receipts (extensions/bearer-receipts): `wai.bearer.receipts` — one receipt on every
# bearer. The jwp-receipts `transmission` and `reconciliation` claims (their bodies are
# claim_receipt's), the verdict over a group a verifier derives from them (published,
# transmitted or reconciled, never delivered on the publisher's word), the upper bound on a
# receiver's share of a shared transmission's energy, and confirmation with no return path,
# where a key log that arrives on the bearer anchors nothing. Ed25519, BLAKE3 and the key log
# only; no new dependency.
bearer_receipts = ["key_discovery"]
# Exploration (extensions/exploration): `wai.media.exploration` — six integer descriptors over a
# picture's RGB8 samples; quality-diversity archives (MAP-Elites over a declared grid, run by a
# pinned schedule over wai.generate.spectral, so every elite regenerates and the archive replays
# bit for bit); the default set of a prompt and a work's default-distance (measured for the exact
# generator, an estimate otherwise, unknown never zero); collection statements (coverage and
# pairwise distances); taste priors (integer ranking models, signed by their owners, carrying a
# wai.ai.usage statement), rankings under them, and the disclosure of what steered a pick.
# SHA-256, BLAKE3, Ed25519 and ai_usage's statement reader; no new dependency.
exploration = ["generate", "ai_usage"]
# Exact tone mapping (extensions/exact-tonemap): the companions wai.meta.gainmap (an ISO 21496-1
# gain map: its metadata and its picture, as PNG, in a WGM1 frame) and wai.meta.st2094_50 (SMPTE
# ST 2094-50 metadata sets with their frames, in a WD50 frame); the integer derivations
# wai-tonemap:gainmap and wai-tonemap:st2094-50, which make the rendition for a display's
# headroom with a pinned fixed-point log2 and exp2 and one rounding rule, so every sink at a
# headroom presents the same RGB16 bytes; and the record wai.media.tonemap a sink signs for the
# renditions it presented, which a verifier recomputes. The corpus tone-maps the int_video clip,
# so the feature decodes it (video_int). SHA-256, BLAKE3, Ed25519, png_still; no new dependency.
exact_tonemap = ["receipt_claims", "ed25519", "png_still", "video_int"]
# Timed text and live captions (extensions/timed-text): `wai.text.timed` — the cue model,
# live caption revisions (`caption` events of wai.live.events with the WTX1 annotation),
# and their exact mappings onto WebVTT documents and segments, the IMSC1 Text Profile,
# the MoQ caption timelines, CTA-608 (CC1, pop-on and roll-up) and HLS, with the
# machine-generation disclosure carried through each. No new dependency: the XML is
# written by hand.
timed_text = ["live_events"]
# Access services (extensions/access-services): `wai.access.services` — a caption track's
# latency, stability and accuracy computed from its signed revisions (sources placed on the
# room clock through a take's opening commitment, a reference transcript, word alignment in
# integer arithmetic) and the check of a stated figure; audio description (script, ducking,
# voicing, synchronisation to DAPT §5.5's bounds) and its DAPT document, written by hand;
# sign language as a pose or video track bound to final caption revisions, with a review; and
# the completeness claim of a room session. SHA-256, Ed25519 and JCS only; no new dependency.
access_services = ["timed_text", "capture_take"]
# Object-based spatial audio (extensions/spatial-audio): the deterministic
# Fx mixdown engine. Reuses the world `Fx` floor + blake3; no codec/ML deps
# (sources arrive as decoded mono PCM — decoding the wai.audio.* assets is
# the sink's job, exactly as glb/spz decode is).
audio_scene = ["world"]
# Haptics (extensions/haptics): touch as a tiny keyframed envelope,
# reconstructed in the Fx floor. Sample-equivalence; no codec/ML deps.
haptic = ["world"]
# Volumetric / 4D temporal Gaussian splats (extensions/volumetric): each
# Gaussian's keyframed tracks reconstructed at frame N in the Fx floor.
# Frame-state-equivalence; no codec/ML deps (the render is the sink's).
splat4d = ["world"]
# Music as instructions (extensions/score): a note-event score rendered to
# a canonical PCM mixdown by a deterministic trig-free synth in the Fx
# floor. Mixdown-equivalence; no codec/ML deps (the instrument is the sink's).
score = ["world"]
# Asset provenance (extensions/provenance): a signed, energy-accounted
# lineage receipt for opaque captured content WAI does not reconstruct.
# Reuses the JWP Merkle + Ed25519; no codec/ML deps.
provenance = ["world"]
# OER/2 outcome-and-energy receipts (extensions/oer-receipts.md): a verifier for
# receipts that grade what a unit of work cost (projected/simulated/derived/measured),
# content-address and chain it, and sign it. Conformance is reason-set equality with
# the reference verifier and the portable C kernel over oer-conformance/.
oer = ["dep:blake3", "ed25519", "dep:num-bigint", "serde_json/float_roundtrip"]
# jwp-receipts §2.1's object content hash (src/jwp_hash.rs), on its own so any
# receipt family that names an object can compute it with BLAKE3 alone.
jwp_hash = ["dep:blake3"]
# Staged delivery (extensions/staged-delivery.md): a base first, then refinements as
# their own objects, each bound to what it refines by content hash. The residual form
# (WIR1) is integer rANS (neural_int); content hashes are jwp_hash's BLAKE3; stage
# hashes are SHA-256, always on.
staged = ["neural_int", "jwp_hash"]
# HTTP delivery (extensions/http-delivery.md): objects named by their content hash, the
# WHP1 head proof (BLAKE3's tree, through jwp_hash's BLAKE3), verified range fetch of one
# WAI2 component, the codecs union and floor, and an origin's responses. Component
# digests are SHA-256, always on. No I/O in the library; `wai http` does it.
http = ["jwp_hash"]
# Staged-delivery measurement (extensions/staged-measurement.md): the counted bytes of
# an envelope, the output tree, and the deterministic evaluation of a staged title —
# its prefixes' counted bytes, outputs and quality integers, first presentable,
# layering overhead and deduplication — over the staged sink and the integer decoders.
# Pure integer, no ONNX, no file system on wasm32.
stage_measure = ["staged", "video_int", "audio_int", "splat_int"]
# Delivery telemetry (extensions/delivery-telemetry.md): unsigned, advisory observations,
# their CMCD version 2 and CMSD reports as RFC 9651 Structured Field Values, and session
# metrics. No dependency beyond serde_json; wasm32-clean.
telemetry = []
# QoE aggregation (extensions/telemetry-aggregation.md): `wai.telemetry.aggregate` — Prio3Count,
# Prio3Sum, Prio3SumVec and Prio3Histogram written from draft-irtf-cfrg-vdaf-22 (fields, XOF,
# FLP, sharding, verification, aggregation) and checked against the draft's test vectors; DAP
# (draft-ietf-ppm-dap-20) messages, a reference leader and helper and the collection flow, with
# HPKE base mode (RFC 9180: X25519, HKDF-SHA256, AES-128-GCM); the QoE measures over session
# metrics; the aggregate share statement (WQS1) each aggregator signs and the aggregate
# receipt (WQA1) a reader verifies. New dependencies: keccak, aes-gcm and hkdf (RustCrypto).
telemetry_aggregate = ["telemetry", "ed25519", "dep:keccak", "dep:aes-gcm", "dep:hkdf", "dep:curve25519-dalek"]
# Typed receipt classes on the JWP chain (extensions/jwp-receipts.md §2.4.3–§2.4.7,
# §2.6, §3.1–§3.2): `claim` receipts of class energy / lawful-basis / log-inclusion,
# the soft-binding class, and recovery under the ancestor rule. Needs `provenance`
# for the coverage vocabulary and `oer` for the evidential grades and the OER receipt
# an energy claim may name, which it reads and verifies through `crate::oer`; and
# `staged`, so a session verifier holding envelopes counts a refinement layer's `WIR1`
# payload (staged-measurement §3) and reads its `refines`. Its one direct dependency,
# curve25519-dalek, is already in the graph under ed25519-dalek.
receipt_claims = ["provenance", "oer", "jwp_hash", "staged", "dep:curve25519-dalek"]
# Key discovery and signing authority (extensions/jwp-receipts.md §7): the origin key
# log a `did:web` signer_id names, anchoring, the confirmation reported beside a receipt's
# or claim's verdict, and the authorisation and revocation of decoder and reconstruct
# modules (§7.9). Adds no dependency: it signs and hashes with what `receipt_claims`
# already brings, and a module digest is the SHA-256 `oer` already brings.
key_discovery = ["receipt_claims"]
# Hybrid signatures (extensions/pq-signatures.md): Ed25519 with ML-DSA-65 under the composite
# id-MLDSA65-Ed25519-SHA512 of draft-ietf-lamps-pq-composite-sigs-19, on key logs (a key
# entry's ML-DSA key, a revision's hybrid root, a pinned anchor that requires hybrid), group
# receipts (the payload's third version), claims, and every record signed as
# `wai:<domain>\x01 ‖ JCS`; the verifier policy that requires hybrid, and the refusal of a
# classical-only item under a hybrid key. Its one new dependency is ml-dsa.
pq_signatures = ["key_discovery", "dep:ml-dsa"]
# The `wai` CLI's TLS client for anchoring an origin (`wai http receipts --key-origin`,
# http-delivery §8.4): rustls with the operating system's trust store. Built into the
# binary only; without it the CLI refuses to anchor rather than fetch over plaintext.
cli_tls = ["http", "key_discovery", "dep:rustls", "dep:rustls-platform-verifier"]
# Emit a REAL C2PA manifest (not just the assertion shapes). Off by default:
# the SDK is a large dependency chain and most WAI consumers only need the
# binding types, which `provenance` already gives them.
c2pa_emit = ["provenance", "dep:c2pa"]
# wai.world.model — generative-world transport: a signed, replay-equivalent action
# trace (reuses the world CausalOp log) + per-frame provenance. The neural sibling
# of wai.world.replay; the renderer is a declared world model (sink-supplied, or the
# int_* family for byte-exact frames).
world_model = ["world", "provenance"]
# Linear film (extensions/linear-film): a film is a sealed camera-on-rails
# world — the world replay (replay-equivalence) + a keyframed camera track
# (Fx floor) + a frame schedule, verified frame-by-frame (film-equivalence).
# Composes the world engine; pulls `score` so a reel can embed a soundtrack
# (one envelope = movie + sound). No codec/ML deps (the render is the sink's).
film = ["world", "score"]
# Deterministic quantum-circuit SIMULATION (extensions/quantum-sim,
# `wai.quantum.circuit2` and the frozen `wai.quantum.circuit`): the wire carries a
# gate op-log (WQC container), the sink
# classically simulates it in a fixed-point complex floor, the statevector is
# byte-identical on every machine (statevector-equivalence). Pure i64, no float —
# blake3 for the conformance/receipt hashes, same discipline as the other floor
# classes. No quantum hardware (it would break determinism). Compiles to wasm32.
quantum = ["dep:wai-quantum", "wai-quantum/quantum"]
# The energy-accounted seal for a quantum reconstruction (extensions/quantum-sim
# § Receipt): a signed receipt that separates the portable-exact WORK (n_ops·2^n
# amplitude updates, recomputable) from the measured-attested ENERGY (joules_micro
# from the sink's meter), both bound to a re-simulatable statevector hash. Reuses
# the JWP Merkle + Ed25519 from `world` — reuse, not reinvention.
quantum_receipt = ["quantum", "wai-quantum/quantum_receipt"]
# The JWP receipt profile for the integer inter-frame video codec. Follows the
# same shape as `quantum_receipt`: the class feature plus `world`, which is what
# supplies blake3, ed25519 and the shared `merkle_root`. Kept OUT of `video_int`
# on purpose — `int_video.rs` is #[path]-included by the byte-exact conformance
# crate, and that crate must keep its three-dependency set to stay runnable on
# every leg of the cross-arch matrix.
video_receipt = ["video_int", "world"]
# wai.video.manifest — attested, deduplicating, energy-accounted per-session
# manifest. Reuses the world Merkle + Ed25519 and the JCP GrantRef (quantum_ops);
# carries no pixel-decode dependency, so it stays a light, pure-Rust surface.
# Depends on `world` EXPLICITLY: these receipts use
# `crate::world::receipt::merkle_root`. That used to arrive transitively via
# `quantum_ops`, which no longer provides it now the quantum stack lives in
# its own crate — a dependency this feature always had and never declared.
video_manifest = ["quantum_ops", "world"]
# Energy meters — the source of a receipt's joules_micro. Reuses the
# EnergyProvenance ladder; hardware counter vs calibrated model, mechanically.
energy_meter = ["video_manifest"]
# wai.video.ssai — attested ad decisioning + per-impression receipt. Reuses the
# manifest module's EnergyProvenance + the GrantRef/Merkle/Ed25519 floor.
# Pure decision policy (no deps) — separable so it can be model-checked.
video_policy = []
video_ssai = ["video_manifest", "video_policy"]
# wai.video.keys — attested content-key release; the DRM audit trail as a
# recomputable decision. Reuses the manifest floor (EnergyProvenance, GrantRef,
# Ed25519).
video_keys = ["video_manifest"]
# wai.video.package — deterministic segmentation + attested, deduplicating
# SegmentMap. Reuses the manifest floor (EnergyProvenance, GrantRef, Merkle). Also the
# packaging extension's stage index (WSIX) and version-2 package receipt, which name
# each object by jwp-receipts §2.1's content hash (jwp_hash).
video_package = ["video_manifest", "jwp_hash"]
# wai.video.channel — virtual linear / FAST assembly; the program-as-run hash
# chain. Reuses the manifest floor (EnergyProvenance, GrantRef, Merkle).
video_channel = ["video_manifest"]
# The whole OTT workflow suite in one switch.
video_workflow = ["video_manifest", "video_ssai", "video_keys", "video_package", "video_channel"]
# Balanced-ternary matrix-product-state transform (`wai.ternary.tt`,
# extensions/ternary-tt): quantum-INSPIRED (tensor-network) compression whose
# novel delta is an INTEGER core scale — the whole decode is pure i64/i128, so a
# ternary-MPS reconstruction is byte-identical on every machine (a portable
# reconstruction hash), unlike the float-scale ternary/MPS fabric it ports from.
# Lossy codec, deterministic decode. Encoder-side float (SVD) only. Reuses
# int_transform's fixed-point idiom (neural_int) + blake3 for the recon hash.
ternary = ["neural_int"]
# The energy-accounted seal for a ternary-MPS reconstruction (extensions/ternary-tt
# § Receipt): a signed receipt separating portable-exact WORK (trit_macs) from
# measured-attested ENERGY (joules_micro), bound to the WQTT payload hash + a
# re-decodable reconstruction hash. Reuses the JWP Merkle + Ed25519 from `world`.
ternary_receipt = ["ternary", "world"]
# Quantum-operations attestation (extensions/quantum-ops, `wai.quantum.calibration`
# + `wai.quantum.job`): signed, content-addressed, joule-metered, grant-authorized
# receipts of calibration runs and QPU jobs — the verify-half of WAI applied to the
# quantum-control industry. WAI does NOT run hardware; it owns the receipt. Reuses
# the JWP Merkle + Ed25519 from `world`; no sim/codec deps.
quantum_ops = ["dep:wai-quantum", "wai-quantum/quantum_ops"]
# Deterministic autonomous CALIBRATION engines (extensions/quantum-ops § Calibration):
# a fixed-point qubit-device simulator + autonomous tune-up algorithms (Rabi π-pulse
# to start), byte-exact and reproducible, sealing a wai.quantum.calibration receipt per run. Pulls quantum_ops.
quantum_cal = ["quantum_ops", "wai-quantum/quantum_cal"]
# Deterministic quantum ERROR MITIGATION (extensions/quantum-ops § Mitigation,
# `wai.quantum.mitigate`): the classical post-processing layer between raw QPU
# counts and the reported number — zero-noise extrapolation, tensored readout
# inversion, classical shadows — in pure fixed-point, byte-exact, each sealing a
# signed, joule-metered MitigationReceipt over the step. Pulls quantum_ops.
quantum_mitigate = ["quantum_ops", "wai-quantum/quantum_mitigate"]
# Deterministic quantum LDPC DECODING (extensions/quantum-ops § Decoding,
# `wai.quantum.decode`): a fixed-point Relay-BP (normalized min-sum) decoder for
# qLDPC codes (toric + bivariate-bicycle), byte-exact on every machine, each
# decode sealing a signed, joule-metered DecodeReceipt carrying joules-per-decode
# signed with the correction. Pulls quantum_ops.
quantum_qec = ["quantum_ops", "wai-quantum/quantum_qec"]
# Deterministic FILTER-FUNCTION control + NOISE SPECTROSCOPY (extensions/quantum-ops
# § Calibration, frequency domain): the filter-function overlap χ = ∫ S(ω)F(ω)/ω²
# — DD noise spectroscopy (reconstruct S(ω) from a filter bank) + filter-function
# robust control (reshape a DD sequence to dodge a PSD). Fully offline, byte-exact,
# sealing wai.quantum.calibration receipts. Pulls quantum_cal (trig/exp + seal).
quantum_control = ["quantum_cal", "wai-quantum/quantum_control"]
# Deterministic NOISE LEARNING (extensions/quantum-ops § Calibration, noise model,
# `wai.quantum.cal.noise_learn`): Cycle Benchmarking + Cycle Error Reconstruction
# of a sparse Pauli–Lindblad model — recover a hidden device's Pauli error rates
# from a simulated twirled-cycle experiment (multiplicative NNLS), byte-exact,
# sealing a signed model whose hash a MitigationReceipt binds (the PEC producer).
quantum_noise = ["quantum_cal", "wai-quantum/quantum_noise"]
# Deterministic circuit COMPILATION + equivalence proof (extensions/quantum-ops
# § Compilation, `wai.quantum.compile`): a coupling-graph router (SWAP insertion)
# + a byte-exact Clifford stabilizer-tableau equivalence check, sealing a signed
# CompileReceipt that a routed circuit is equivalent to its source — compilation
# correctness, which no compiler signs. Pulls quantum_ops.
quantum_compile = ["quantum_ops", "wai-quantum/quantum_compile"]
# Deterministic neutral-atom REARRANGEMENT (extensions/quantum-ops § Register
# preparation, `wai.quantum.rearrange`): a Hungarian / LSAP solver that assigns a
# defect-free target register a distinct loaded atom minimizing total move
# distance, byte-exact, sealing a signed RearrangeReceipt whose success verdict is
# re-checkable. Pulls quantum_ops.
quantum_atom = ["quantum_ops", "wai-quantum/quantum_atom"]
# WAI Quantum Toolchain (extensions/quantum-sim § Toolchain,
# `wai.quantum.toolchain`): the compute core of a classical-hardware quantum IDE —
# algorithm library + state analysis (Bloch, entanglement, expectations) + backend
# selection (Clifford → statevector → tensor-network cascade) + OpenQASM interop,
# all over the byte-exact fixed-point simulator. Framework-neutral, no cloud.
quantum_toolchain = ["quantum", "wai-quantum/quantum_toolchain"]
# OpenQASM 3 read one way on every surface (wai_quantum::qasm).
quantum_qasm = ["quantum", "wai-quantum/quantum_qasm"]
# The job service's engine (wai_quantum::engine): plan, run and sign a job as the
# service does, re-exported as wai::engine for the browser binding.
quantum_engine = ["quantum_qasm", "quantum_receipt", "wai-quantum/quantum_engine"]
# Matrix Product State backend (extensions/quantum-sim § MPS, `wai.quantum.mps`):
# the tensor-network "classical referee" — evolve a bounded-bond MPS gate-by-gate
# with a deterministic complex Jacobi SVD truncation, reproducible on every machine
# (approximate method → determinism + retained-weight fidelity, not byte-exact).
# Verified against the dense simulator. Pure Rust; only IEEE-754 + - * / sqrt.
quantum_mps = ["quantum", "wai-quantum/quantum_mps"]
# Stabilizer / CHP backend (extensions/quantum-sim § Stabilizer,
# `wai.quantum.stabilizer`): the O(n²) Clifford tier of the cascade — the
# Aaronson–Gottesman tableau simulates + samples Clifford circuits far past the
# dense 2^n wall (thousands of qubits), exact integer bit-arithmetic (no floats),
# deterministic histograms. Rejects non-Clifford gates for fallback.
quantum_stabilizer = ["quantum", "wai-quantum/quantum_stabilizer"]
# Sparse-Pauli / Heisenberg propagation (extensions/quantum-sim § Pauli,
# `wai.quantum.pauli`): the observable referee — propagate an observable backward
# through the circuit as a truncated sum of Pauli strings (Begušić and Chan's sparse
# Pauli dynamics). Computes ⟨O⟩ on large
# low-magic circuits where no state vector exists; grows with magic, not qubits.
quantum_pauli = ["quantum", "wai-quantum/quantum_pauli"]
# Sparse Pauli dynamics at utility scale (arbitrary angles, up to 1024 qubits),
# and its signed receipts.
quantum_spd = ["quantum", "wai-quantum/quantum_spd"]
quantum_spd_receipt = ["quantum_spd", "wai-quantum/quantum_spd_receipt"]
# Tensor-network states on the hardware graph (simple update, belief propagation).
quantum_bptn = ["quantum_spd", "wai-quantum/quantum_bptn"]
# Fault-tolerant resource estimation (layout, distance, T factories, frontier),
# and its signed receipts.
quantum_resource = ["dep:wai-quantum", "wai-quantum/quantum_resource"]
quantum_resource_receipt = ["quantum_resource", "wai-quantum/quantum_resource_receipt"]
# Noisy Clifford circuits at QEC scale: frame sampling, detector error models,
# exact matching, measured code models.
quantum_frame = ["dep:wai-quantum", "wai-quantum/quantum_frame", "wai-quantum/quantum_uf"]
# Tensor-network contraction: hyper-optimised trees, slicing, circuit amplitudes.
quantum_tn = ["dep:wai-quantum", "wai-quantum/quantum_tn"]
# Gaussian boson sampling: hafnians, torontonians, exact probabilities, samples, checks.
quantum_gbs = ["dep:wai-quantum", "wai-quantum/quantum_gbs"]
# The dense state vector at any angle: fusion, threads, the same bits everywhere.
quantum_sv = ["dep:wai-quantum", "wai-quantum/quantum_sv", "wai-quantum/quantum_noisy"]
# Architecture-level estimation: yoked storage, cultivation, CCZ factories,
# reaction-limited time, whole machines.
quantum_arch = ["dep:wai-quantum", "wai-quantum/quantum_arch"]
# qLDPC memory at circuit level: bivariate-bicycle codes, BP-OSD.
quantum_ldpc = ["quantum_frame", "wai-quantum/quantum_ldpc"]
# Quantum-inspired optimisation: simulated bifurcation, annealing, exact referee.
quantum_qio = ["dep:wai-quantum", "wai-quantum/quantum_qio", "wai-quantum/quantum_dmrg", "wai-quantum/quantum_tdvp", "wai-quantum/quantum_chem", "wai-quantum/quantum_nqs"]
quantum_qir = ["quantum_toolchain", "wai-quantum/quantum_qir"]
# The fabric: members, parity against the CPU reference, certification,
# placement by joules, and the core in 32-bit lanes.
quantum_fabric = ["quantum", "quantum_ops", "wai-quantum/quantum_fabric"]
# The fabric's WebGPU member: the 32-bit-lane kernel in WGSL through the
# platform's GPU interface, certified bit-exact per adapter, and
# `wai_quantum_vectors verify --webgpu`. Opt-in: it is the one feature that
# reaches a platform interface.
quantum_fabric_webgpu = ["quantum_fabric", "wai-quantum/quantum_fabric_webgpu"]
# Variational quantum machine learning (extensions/quantum-sim § VML,
# `wai.quantum.vml`): the interference-based ML the thermodynamic-computing pivot
# left behind — a Quantum Circuit Born Machine (P_θ(x)=|ψ_θ(x)|²) trained by the
# exact parameter-shift gradient on the classical state vector, plus a
# barren-plateau probe (the honest limit). Deterministic f64. Pure Rust, no deps.
quantum_vml = ["dep:wai-quantum", "wai-quantum/quantum_vml"]
# The phasor bridge (extensions/quantum-sim § Phasor, `wai.quantum.phasor`): a
# quantum feature-map model is exactly a Fourier series of phasors (Schuld et al.).
# Compute the model on the state vector, extract its spectrum, and reproduce the
# identical function as a classical phasor sum (FHRR/HDC) — same interference, two
# substrates — with a qFHRR quantized-phase variant. Pure f64, no deps.
quantum_phasor = ["dep:wai-quantum", "wai-quantum/quantum_phasor"]
# The full Born machine on the qFHRR substrate (extensions/quantum-sim § qFHRR,
# `wai.quantum.qfhrr`): run the whole generative distribution P(x)=|ψ(x)|² with
# amplitude phases held at qFHRR resolution (b-bit, integer-native) — a trained
# Born machine deployed end-to-end on the phasor substrate, converging to the exact
# state vector as phase bits grow. Pure f64; reuses the vml ansatz for the ref.
quantum_qfhrr = ["quantum_vml", "wai-quantum/quantum_qfhrr"]
# Phasor-feature classifier (extensions/quantum-sim § Kernel, `wai.quantum.kernel`):
# the quantum kernel deployed as random Fourier / FHRR phasor features + a ridge
# classifier — separates nonlinearly-separable data a linear model cannot, at qFHRR
# phase resolution, with a counted phasor-op tally for joule pricing. Pure f64.
quantum_kernel = ["dep:wai-quantum", "wai-quantum/quantum_kernel"]
# Phasor energy meter (extensions/quantum-sim § Receipt, `wai.quantum.phasor`): the
# energy-accounted seal for an interference computation. Splits portable-exact
# phasor WORK — `D·(dim+1)·n`, linear and recomputable from the shape — from
# measured-attested joules, binding both to a reproducible-f64 result hash. Prices
# every bind/bundle/similarity op so qFHRR is an accountable substrate, not merely a
# fast one. Reuses the JWP Merkle + Ed25519 from `world`.
quantum_phasor_meter = ["dep:wai-quantum", "wai-quantum/quantum_phasor_meter"]
# Learning from quantum data (extensions/quantum-sim § QData, `wai.quantum.qdata`):
# the exponential sample-complexity separation for Pauli-channel learning — Ω(2^n)
# copies entanglement-free vs O(1/ε²) n-independent copies with a two-copy Bell
# measurement (Chen–Cotler–Huang–Li / Huang Science 2022). The quantum-data advantage
# that survives dequantization; it is why `noise_learn`'s Bell/CB sampling is
# data-efficient. Pure f64, deterministic in the seed.
quantum_qdata = ["dep:wai-quantum", "wai-quantum/quantum_qdata"]
# Quantum Bill of Materials (extensions/quantum-ops § Provenance,
# `wai.quantum.qbom`): assemble the stage receipts of one quantum computation
# (compile/calibrate/execute/mitigate/…) into a single signed, content-addressed
# provenance manifest with a total-energy roll-up and an operator-envelope export;
# binds each stage to a receipt that itself verifies. Pulls quantum_ops.
quantum_qbom = ["quantum_ops", "wai-quantum/quantum_qbom"]
# Mixed states (extensions/quantum-sim § Information): density matrices, the
# partial trace, purity, exact Pauli expectations, and CHSH against the classical
# and Tsirelson bounds. A state vector cannot describe a subsystem; this can.
quantum_info = ["quantum", "wai-quantum/quantum_info"]
# Qubits AND qutrits (extensions/quantum-sim § Qudits): the Weyl–Heisenberg group,
# the Fourier gate over `Z_d`, the controlled sum — exact for `d = 2` and `3`.
quantum_qudit = ["quantum", "wai-quantum/quantum_qudit"]
# Key distribution and security (extensions/quantum-sim § Communication): BB84 with
# an intercept-resend eavesdropper, and the no-cloning theorem priced.
quantum_comm = ["quantum", "wai-quantum/quantum_comm"]
# The limits on encoding and transport (extensions/quantum-sim § Source): von
# Neumann entropy, the Schumacher limit, and the Holevo bound — which says `n`
# qubits carry at most `n` classical bits, so quantum does not compress classical
# media. The layer that lets WAI state real limits instead of overclaiming.
quantum_source = ["quantum_info", "wai-quantum/quantum_source"]
# Transport itself (extensions/quantum-sim § Channel): Kraus channels and
# linear-inversion tomography, with the law that a channel can only lose
# information, never create it.
quantum_channel = ["quantum_source", "wai-quantum/quantum_channel"]
# Codec-chain examples gate on `codecs` (they call the C codec wrappers), so
# a `--no-default-features --features neural` build doesn't try to compile them.
[[example]]
name = "gen_preview"
path = "examples/gen_preview.rs"
required-features = ["generate"]
[[example]]
name = "int_hyper_decode_frame"
path = "examples/int_hyper_decode_frame.rs"
required-features = ["neural_int"]
[[example]]
name = "int_audio_decode"
path = "examples/int_audio_decode.rs"
required-features = ["audio_int"]
[[example]]
name = "int_world_decode"
path = "examples/int_world_decode.rs"
required-features = ["world_int"]
[[example]]
name = "int_splat_decode"
path = "examples/int_splat_decode.rs"
required-features = ["splat_int"]
[[example]]
name = "opus_check"
path = "examples/opus_check.rs"
required-features = ["codecs"]
[[example]]
name = "dl_check"
path = "examples/dl_check.rs"
required-features = ["codecs"]
[[example]]
name = "jpeg_test"
path = "examples/jpeg_test.rs"
required-features = ["codecs"]
# `encode` and `decode` need the `codecs` feature and are compiled out without it;
# every other command (wrap, unwrap, inspect, capabilities, registry export) builds
# with --no-default-features, which is how CI runs it. `generate` needs the feature
# `generate`, and `score` the feature `score`; without them each says so.
[[bin]]
name = "wai"
path = "src/bin/wai.rs"
[[bin]]
name = "wai_int_synth_vectors"
path = "src/bin/wai_int_synth_vectors.rs"
required-features = ["neural_int"]
# The binary payload vectors of the integer codecs and their refusal fixtures
# (extensions/integer-payloads.md §12): `gen` converts the committed JSON, `verify`
# requires byte-identical regeneration, the sidecars' SHA-256 and every fixture's code.
[[bin]]
name = "wai_int_payload_vectors"
path = "src/bin/wai_int_payload_vectors.rs"
required-features = ["video_int", "audio_int", "splat_int"]
[[bin]]
name = "wai_staged_vectors"
path = "src/bin/wai_staged_vectors.rs"
required-features = ["staged", "video_int", "audio_int", "splat_int"]
[[bin]]
name = "wai_stage_bench"
path = "src/bin/wai_stage_bench.rs"
required-features = ["staged", "video_int", "audio_int", "splat_int"]
[[bin]]
name = "wai_film_vectors"
path = "src/bin/wai_film_vectors.rs"
required-features = ["film"]
[[bin]]
name = "wai_http_vectors"
path = "src/bin/wai_http_vectors.rs"
required-features = ["http"]
[[bin]]
name = "wai_world_vectors"
path = "src/bin/wai_world_vectors.rs"
required-features = ["world"]
[[bin]]
name = "wai_live_events_vectors"
path = "src/bin/wai_live_events_vectors.rs"
required-features = ["live_events"]
[[bin]]
name = "wai_live_room_vectors"
path = "src/bin/wai_live_room_vectors.rs"
required-features = ["live_room"]
[[bin]]
name = "wai_capture_take_vectors"
path = "src/bin/wai_capture_take_vectors.rs"
required-features = ["capture_take"]
[[bin]]
name = "wai_live_compose_vectors"
path = "src/bin/wai_live_compose_vectors.rs"
required-features = ["live_compose"]
[[bin]]
name = "wai_live_record_vectors"
path = "src/bin/wai_live_record_vectors.rs"
required-features = ["live_record"]
[[bin]]
name = "wai_live_metering_vectors"
path = "src/bin/wai_live_metering_vectors.rs"
required-features = ["live_metering"]
[[bin]]
name = "wai_energy_steering_vectors"
path = "src/bin/wai_energy_steering_vectors.rs"
required-features = ["energy_steering"]
[[bin]]
name = "wai_browser_sink_vectors"
path = "src/bin/wai_browser_sink_vectors.rs"
required-features = ["browser_sink"]
[[bin]]
name = "wai_dred_vectors"
path = "src/bin/wai_dred_vectors.rs"
required-features = ["dred_exact"]
[[bin]]
name = "wai_live_moderation_vectors"
path = "src/bin/wai_live_moderation_vectors.rs"
required-features = ["live_moderation"]
[[bin]]
name = "wai_co_watch_vectors"
path = "src/bin/wai_co_watch_vectors.rs"
required-features = ["co_watch"]
[[bin]]
name = "wai_synthesis_vectors"
path = "src/bin/wai_synthesis_vectors.rs"
required-features = ["synthesis"]
[[bin]]
name = "wai_takedown_vectors"
path = "src/bin/wai_takedown_vectors.rs"
required-features = ["takedown"]
[[bin]]
name = "wai_contribution_vectors"
path = "src/bin/wai_contribution_vectors.rs"
required-features = ["contribution"]
[[bin]]
name = "wai_direction_vectors"
path = "src/bin/wai_direction_vectors.rs"
required-features = ["direction"]
[[bin]]
name = "wai_splat_exact_vectors"
path = "src/bin/wai_splat_exact_vectors.rs"
required-features = ["splat_exact"]
[[bin]]
name = "wai_splat_exact_measure"
path = "src/bin/wai_splat_exact_measure.rs"
required-features = ["splat_exact"]
[[bin]]
name = "wai_synthesis_mark_vectors"
path = "src/bin/wai_synthesis_mark_vectors.rs"
required-features = ["synthesis_mark"]
[[bin]]
name = "wai_upscale_vectors"
path = "src/bin/wai_upscale_vectors.rs"
required-features = ["exact_upscale"]
[[bin]]
name = "wai_upscale_measure"
path = "src/bin/wai_upscale_measure.rs"
required-features = ["exact_upscale", "video_int"]
[[bin]]
name = "wai_robustness_vectors"
path = "src/bin/wai_robustness_vectors.rs"
required-features = ["robustness"]
[[bin]]
name = "wai_live_watermark_vectors"
path = "src/bin/wai_live_watermark_vectors.rs"
required-features = ["live_watermark"]
[[bin]]
name = "wai_live_ads_vectors"
path = "src/bin/wai_live_ads_vectors.rs"
required-features = ["live_ads"]
# The deriving edge's corpus (edge-conformance/, extensions/deriving-edge.md §10).
[[bin]]
name = "wai_edge_vectors"
path = "src/bin/wai_edge_vectors.rs"
required-features = ["derive_edge"]
# The reference deriving edge (extensions/deriving-edge.md): derive an object from objects of a
# bundle under the edge's key, and verify a derived object back to its source.
[[bin]]
name = "wai_edge"
path = "src/bin/wai_edge.rs"
required-features = ["derive_edge"]
[[bin]]
name = "wai_ad_presentation_vectors"
path = "src/bin/wai_ad_presentation_vectors.rs"
required-features = ["live_ads"]
[[bin]]
name = "wai_live_provenance_vectors"
path = "src/bin/wai_live_provenance_vectors.rs"
required-features = ["live_provenance"]
[[bin]]
name = "wai_ai_usage_vectors"
path = "src/bin/wai_ai_usage_vectors.rs"
required-features = ["ai_usage"]
[[bin]]
name = "wai_settlement_vectors"
path = "src/bin/wai_settlement_vectors.rs"
required-features = ["settlement"]
[[bin]]
name = "wai_co_performance_vectors"
path = "src/bin/wai_co_performance_vectors.rs"
required-features = ["co_performance"]
[[bin]]
name = "wai_age_assurance_vectors"
path = "src/bin/wai_age_assurance_vectors.rs"
required-features = ["age_assurance"]
[[bin]]
name = "wai_influence_vectors"
path = "src/bin/wai_influence_vectors.rs"
required-features = ["influence"]
[[bin]]
name = "wai_bearer_vectors"
path = "src/bin/wai_bearer_vectors.rs"
required-features = ["bearer_receipts"]
[[bin]]
name = "wai_telemetry_aggregate_vectors"
path = "src/bin/wai_telemetry_aggregate_vectors.rs"
required-features = ["telemetry_aggregate"]
[[bin]]
name = "wai_exploration_vectors"
path = "src/bin/wai_exploration_vectors.rs"
required-features = ["exploration"]
[[bin]]
name = "wai_tonemap_vectors"
path = "src/bin/wai_tonemap_vectors.rs"
required-features = ["exact_tonemap"]
[[bin]]
name = "wai_timed_text_vectors"
path = "src/bin/wai_timed_text_vectors.rs"
required-features = ["timed_text"]
[[bin]]
name = "wai_access_services_vectors"
path = "src/bin/wai_access_services_vectors.rs"
required-features = ["access_services"]
[[bin]]
name = "wai_world_meter"
path = "src/bin/wai_world_meter.rs"
required-features = ["world", "receipt_claims"]
[[bin]]
name = "wai_audio_vectors"
path = "src/bin/wai_audio_vectors.rs"
required-features = ["audio_scene"]
[[bin]]
name = "wai_haptic_vectors"
path = "src/bin/wai_haptic_vectors.rs"
required-features = ["haptic"]
[[bin]]
name = "wai_feed_vectors"
path = "src/bin/wai_feed_vectors.rs"
required-features = ["world"]
[[bin]]
name = "wai_avatar_vectors"
path = "src/bin/wai_avatar_vectors.rs"
required-features = ["world"]
[[bin]]
name = "wai_splat4d_vectors"
path = "src/bin/wai_splat4d_vectors.rs"
required-features = ["splat4d"]
[[bin]]
name = "wai_oer_vectors"
path = "src/bin/wai_oer_vectors.rs"
required-features = ["oer"]
[[bin]]
name = "wai_oer_diff"
path = "src/bin/wai_oer_diff.rs"
required-features = ["oer"]
[[bin]]
name = "wai_pin_vectors"
path = "src/bin/wai_pin_vectors.rs"
[[bin]]
name = "wai_claim_vectors"
path = "src/bin/wai_claim_vectors.rs"
required-features = ["receipt_claims"]
[[bin]]
name = "wai_jwp_vectors"
path = "src/bin/wai_jwp_vectors.rs"
required-features = ["receipt_claims"]
[[bin]]
name = "wai_signer_vectors"
path = "src/bin/wai_signer_vectors.rs"
required-features = ["key_discovery"]
[[bin]]
name = "wai_pq_vectors"
path = "src/bin/wai_pq_vectors.rs"
required-features = ["pq_signatures"]
[[bin]]
name = "wai-keys"
path = "src/bin/wai_keys.rs"
required-features = ["key_discovery"]
[[bin]]
name = "wai_quantum_vectors"
path = "src/bin/wai_quantum_vectors.rs"
required-features = ["quantum"]
[[bin]]
name = "wai_quantum_ops_vectors"
path = "src/bin/wai_quantum_ops_vectors.rs"
required-features = ["quantum_ops"]
[[bin]]
name = "wai_quantum_meter"
path = "src/bin/wai_quantum_meter.rs"
required-features = ["quantum_receipt", "receipt_claims"]
[[bin]]
name = "wai_video_meter"
path = "src/bin/wai_video_meter.rs"
required-features = ["video_receipt", "receipt_claims"]
[[bin]]
name = "wai_meter"
path = "src/bin/wai_meter.rs"
required-features = ["haptic", "splat4d", "score", "film", "receipt_claims"]
[[bin]]
name = "wai_prov"
path = "src/bin/wai_prov.rs"
required-features = ["provenance", "codecs", "receipt_claims"]
[[bin]]
name = "wai_bench"
path = "src/bin/wai_bench.rs"
required-features = ["codecs"]
[[bin]]
name = "wai_decode_bench"
path = "src/bin/wai_decode_bench.rs"
required-features = ["neural_int", "video_int", "audio_int", "world_int", "splat_int"]
[[bin]]
name = "wai_bench_diff"
path = "src/bin/wai_bench_diff.rs"
required-features = ["codecs"]
# A program, not a libtest suite: it lists its own executable's symbols, so the test
# harness's code must not be in it (see the file's doc).
[[test]]
name = "jpegai_decode_symbols"
path = "tests/jpegai_decode_symbols.rs"
harness = false
required-features = ["neural_int"]
# Feature-gated integration tests that CI names with `--test`. Declared with their
# features so that naming one without them stops cargo with an error, instead of
# compiling the `#![cfg(feature)]` file to an empty binary that reports ok.
[[test]]
name = "int_audio"
path = "tests/int_audio.rs"
required-features = ["audio_int"]
[[test]]
name = "int_splat"
path = "tests/int_splat.rs"
required-features = ["splat_int"]
[[test]]
name = "cli_http"
path = "tests/cli_http.rs"
required-features = ["http"]
[[test]]
name = "int_kernels_vectors"
path = "tests/int_kernels_vectors.rs"
required-features = ["neural_int", "video_int", "audio_int", "world_int", "splat_int"]
[[test]]
name = "int_kernels_geometry"
path = "tests/int_kernels_geometry.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "int_ops_differential"
path = "tests/int_ops_differential.rs"
required-features = ["legacy_int", "splat_int", "audio_int", "world_int"]
[[test]]
name = "int_synth_ops"
path = "tests/int_synth_ops.rs"
required-features = ["legacy_int"]
[[test]]
name = "int_audio_ops"
path = "tests/int_audio_ops.rs"
required-features = ["audio_int", "legacy_int"]
[[test]]
name = "int_splat_ops"
path = "tests/int_splat_ops.rs"
required-features = ["splat_int", "legacy_int"]
# The integer decoders with their graphs on a GPU (`int_ops::gpu`): every committed vector
# and refusal fixture of every capability that runs a `wai-ops/1` graph, against the decode
# on the CPU, on every adapter found. Needs a GPU (or a software adapter) to run anything;
# with none it prints SKIPPED, and fails under WAI_OPS_GPU_REQUIRE.
[[test]]
name = "ops_gpu"
path = "tests/ops_gpu.rs"
required-features = ["ops_gpu", "video_int", "audio_int", "splat_int", "world_int"]
[[test]]
name = "int_hyper_ops"
path = "tests/int_hyper_ops.rs"
required-features = ["video_int", "legacy_int"]
# wai.world.model's integer renderer through its lowering world/1 (integer-operators §13.5).
[[test]]
name = "int_world_ops"
path = "tests/int_world_ops.rs"
required-features = ["world_int", "legacy_int"]
[[test]]
name = "jpegai_ops"
path = "tests/jpegai_ops.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_nets_ops"
path = "tests/jpegai_nets_ops.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "int_video_ops"
path = "tests/int_video_ops.rs"
required-features = ["video_int", "legacy_int"]
[[test]]
name = "wir1_ops"
path = "tests/wir1_ops.rs"
required-features = ["staged", "legacy_int"]
# What the JPEG AI exact decoder holds against its direct decode (its own binary: a live-bytes allocator).
[[test]]
name = "jpegai_memory"
path = "tests/jpegai_memory.rs"
required-features = ["neural_int", "legacy_int"]
# What that renderer holds against the direct renderer (its own binary: a live-bytes allocator).
[[test]]
name = "int_world_memory"
path = "tests/int_world_memory.rs"
required-features = ["world_int", "legacy_int"]
[[test]]
name = "int_mlicpp"
path = "tests/int_mlicpp.rs"
required-features = ["neural_int"]
[[test]]
name = "int_mlicpp_preflight"
path = "tests/int_mlicpp_preflight.rs"
required-features = ["neural_int"]
[[test]]
name = "int_mlicpp_ops"
path = "tests/int_mlicpp_ops.rs"
required-features = ["legacy_int"]
[[test]]
name = "cli_stage"
path = "tests/cli_stage.rs"
required-features = ["staged", "video_int", "audio_int", "splat_int"]
[[test]]
name = "staged_resources"
path = "tests/staged_resources.rs"
required-features = ["staged", "video_int"]
[[test]]
name = "staged_moq"
path = "tests/staged_moq.rs"
required-features = ["staged", "video_int", "receipt_claims"]
[[test]]
name = "int_payload"
path = "tests/int_payload.rs"
required-features = ["video_int", "audio_int", "splat_int"]
[[test]]
name = "int_payload_preflight"
path = "tests/int_payload_preflight.rs"
required-features = ["video_int", "audio_int", "splat_int"]
[[test]]
name = "int_payload_cost"
path = "tests/int_payload_cost.rs"
required-features = ["video_int", "audio_int", "splat_int", "legacy_int"]
# The store of loaded parameter sets under the decodes that use it (src/int_set_cache.rs).
[[test]]
name = "int_set_cache"
path = "tests/int_set_cache.rs"
required-features = ["video_int", "audio_int", "splat_int"]
[[test]]
name = "int_video_enc_memory"
path = "tests/int_video_enc_memory.rs"
required-features = ["video_int"]
[[test]]
name = "generate"
path = "tests/generate.rs"
required-features = ["generate"]
# `wai generate` and `wai score build|render` run as a user runs them, against the
# committed generate vectors and score-conformance/.
[[test]]
name = "cli_generate_score"
path = "tests/cli_generate_score.rs"
required-features = ["generate", "score"]
[[test]]
name = "ffi_envelope"
path = "tests/ffi_envelope.rs"
required-features = ["ffi"]
[[test]]
name = "ffi_neural_pin"
path = "tests/ffi_neural_pin.rs"
required-features = ["neural", "ffi"]
[[test]]
name = "neural_native_decode"
path = "tests/neural_native_decode.rs"
required-features = ["neural"]
[[test]]
name = "jpegai_e2e_full"
path = "tests/jpegai_e2e_full.rs"
required-features = ["neural_int"]
# Drives the `wai-keys` binary, so it needs the feature that builds it.
[[test]]
name = "wai_keys_cli"
path = "tests/wai_keys_cli.rs"
required-features = ["key_discovery"]
# On 64-bit Arm, SHA-256 through the processor's SHA-2 instructions where it has them
# (sha2's `asm` feature: its aarch64 backend, which detects the instructions at run time
# and falls back to the portable code). Hashing a parameter set is a decode's to identify
# it (SPEC §3.1), and a set can be tens of megabytes. The digests are the same bytes.
# Not on Windows, whose toolchain does not assemble the sha2-asm sources the feature
# brings in, and not on wasm32 or any other target, whose build this leaves as it is.
[target.'cfg(all(target_arch = "aarch64", not(target_os = "windows")))'.dependencies]
sha2 = { version = "0.10", features = ["asm"] }
[dev-dependencies]
serde_json = { version = "1", features = ["preserve_order"] } # construct manifests in tests
# The bounds pass as it stood before its closed forms (`wai_ops::bounds_oracle`), which
# the random-set differential (tests/int_ops_differential.rs) holds load step 8 to.
wai-ops = { path = "../wai-ops", features = ["oracle"] }
[build-dependencies]
pkg-config = "0.3" # locate system libflac (cross-platform; replaces
# the macOS-hardcoded .cargo/config.toml rustflags)
cbindgen = { version = "0.29", default-features = false }
# generate include/wai.h from the FFI surface so
# SDK consumers get a typed C header instead of
# hand-writing extern decls
[profile.release]
opt-level = 3
lto = true
codegen-units = 1
# The HTTP corpus's falsification (http-conformance/falsify/run.sh): one target
# directory, each patch rebuilt incrementally on the last; overflow checks and debug
# assertions on, as in the tests, so a patch is judged by the code's own checks; enough
# optimisation that each verify runs quickly.
[profile.falsify]
inherits = "dev"
opt-level = 1
debug = false
incremental = true
overflow-checks = true
debug-assertions = true
[[bin]]
name = "wai_score_vectors"
path = "src/bin/wai_score_vectors.rs"
required-features = ["score"]
# Staged-delivery measurement (extensions/staged-measurement.md): `eval` one title,
# `verify` the corpus staged-measure-conformance/ (fixtures regenerated in memory,
# evaluations, the fixture tool's own reconstruction, goldens), `generate-goldens`
# and `gen-fixtures` (never in CI), and `bench` (never in CI): one title's decode time
# and decode figure on this machine, and, with `receipt_claims`, its session claim
# (`--sign`).
[[bin]]
name = "wai_stage_measure"
path = "src/bin/wai_stage_measure.rs"
required-features = ["stage_measure"]
[[test]]
name = "stage_measure"
path = "tests/stage_measure.rs"
required-features = ["stage_measure"]
# Its own binary: a counting allocator shows a title over an outsized base is refused
# before anything is allocated for it.
[[test]]
name = "stage_measure_bounds"
path = "tests/stage_measure_bounds.rs"
required-features = ["stage_measure"]
# Delivery telemetry (extensions/delivery-telemetry.md): `encode` an observation's CMCD
# report, `decode` one, `verify` the corpus telemetry-conformance/, `gen` (never in CI).
[[bin]]
name = "wai_telemetry"
path = "src/bin/wai_telemetry.rs"
required-features = ["telemetry"]
# Every other feature-gated integration test, declared with its features for the same
# reason as those above: named in a step that lacks them, cargo stops with an error
# instead of compiling the file to an empty binary that reports ok. A test file gated
# on a feature without an entry here fails scripts/check-tests-in-ci.py.
[[test]]
name = "dash_read_bounds"
path = "tests/dash_read_bounds.rs"
required-features = ["http"]
[[test]]
name = "ffi_robustness"
path = "tests/ffi_robustness.rs"
required-features = ["codecs"]
[[test]]
name = "fuzz_smoke"
path = "tests/fuzz_smoke.rs"
required-features = ["codecs"]
[[test]]
name = "int_hyper_synth"
path = "tests/int_hyper_synth.rs"
required-features = ["neural_int"]
[[test]]
name = "int_video"
path = "tests/int_video.rs"
required-features = ["video_int"]
[[test]]
name = "int_video_halfpel"
path = "tests/int_video_halfpel.rs"
required-features = ["video_int"]
[[test]]
name = "int_video_keyframe"
path = "tests/int_video_keyframe.rs"
required-features = ["neural_int", "video_int"]
[[test]]
name = "int_video_sota_keyframe"
path = "tests/int_video_sota_keyframe.rs"
required-features = ["neural_int", "video_int"]
[[test]]
name = "int_world"
path = "tests/int_world.rs"
required-features = ["world_int"]
[[test]]
name = "int_world2"
path = "tests/int_world2.rs"
required-features = ["world_int"]
[[test]]
name = "int_world_shared"
path = "tests/int_world_shared.rs"
required-features = ["world_int", "world_model"]
[[test]]
name = "jpegai_bitstream_calibration"
path = "tests/jpegai_bitstream_calibration.rs"
required-features = ["neural_int"]
[[test]]
name = "jpegai_color_calibration"
path = "tests/jpegai_color_calibration.rs"
required-features = ["neural_int"]
[[test]]
name = "jpegai_cross_platform"
path = "tests/jpegai_cross_platform.rs"
required-features = ["neural_int", "provenance"]
[[test]]
name = "jpegai_dequant_calibration"
path = "tests/jpegai_dequant_calibration.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_derive_calibration"
path = "tests/jpegai_derive_calibration.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_e2e"
path = "tests/jpegai_e2e.rs"
required-features = ["codecs", "neural"]
[[test]]
name = "jpegai_e2e_chain"
path = "tests/jpegai_e2e_chain.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_e2e_chroma"
path = "tests/jpegai_e2e_chroma.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_e2e_dequant"
path = "tests/jpegai_e2e_dequant.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_e2e_frontend"
path = "tests/jpegai_e2e_frontend.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_e2e_hyperlatent"
path = "tests/jpegai_e2e_hyperlatent.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_e2e_synthesis"
path = "tests/jpegai_e2e_synthesis.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_efl_calibration"
path = "tests/jpegai_efl_calibration.rs"
required-features = ["neural_int"]
[[test]]
name = "jpegai_efn_calibration"
path = "tests/jpegai_efn_calibration.rs"
required-features = ["neural_int"]
[[test]]
name = "jpegai_hyper_calibration"
path = "tests/jpegai_hyper_calibration.rs"
required-features = ["neural", "legacy_int"]
[[test]]
name = "jpegai_hyperscale_calibration"
path = "tests/jpegai_hyperscale_calibration.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_icci_calibration"
path = "tests/jpegai_icci_calibration.rs"
required-features = ["neural_int"]
[[test]]
name = "jpegai_icci_net_calibration"
path = "tests/jpegai_icci_net_calibration.rs"
required-features = ["neural_int"]
[[test]]
name = "jpegai_lef_calibration"
path = "tests/jpegai_lef_calibration.rs"
required-features = ["neural_int"]
[[test]]
name = "jpegai_live"
path = "tests/jpegai_live.rs"
required-features = ["codecs", "neural"]
[[test]]
name = "jpegai_lsbs_calibration"
path = "tests/jpegai_lsbs_calibration.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_mans_calibration"
path = "tests/jpegai_mans_calibration.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_mans_golden"
path = "tests/jpegai_mans_golden.rs"
required-features = ["neural"]
[[test]]
name = "jpegai_mcm_calibration"
path = "tests/jpegai_mcm_calibration.rs"
required-features = ["neural", "legacy_int"]
[[test]]
name = "jpegai_postfilter_chain"
path = "tests/jpegai_postfilter_chain.rs"
required-features = ["neural_int"]
[[test]]
name = "jpegai_reconstruct_calibration"
path = "tests/jpegai_reconstruct_calibration.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_reconstruction_binding"
path = "tests/jpegai_reconstruction_binding.rs"
required-features = ["neural_int", "provenance"]
[[test]]
name = "jpegai_scope_ort"
path = "tests/jpegai_scope_ort.rs"
required-features = ["neural"]
[[test]]
name = "jpegai_sigma_index_calibration"
path = "tests/jpegai_sigma_index_calibration.rs"
required-features = ["neural_int", "legacy_int"]
[[test]]
name = "jpegai_synthesis_calibration"
path = "tests/jpegai_synthesis_calibration.rs"
required-features = ["neural", "legacy_int"]
[[test]]
name = "jpegai_uv_calibration"
path = "tests/jpegai_uv_calibration.rs"
required-features = ["neural", "legacy_int"]
[[test]]
name = "neural_cost_limit"
path = "tests/neural_cost_limit.rs"
required-features = ["ffi", "neural", "video_int"]
[[test]]
name = "semantic_path"
path = "tests/semantic_path.rs"
required-features = ["semantic"]
[[test]]
name = "text_decode_bounds"
path = "tests/text_decode_bounds.rs"
required-features = ["codecs"]
[[test]]
name = "media_decode_bounds"
path = "tests/media_decode_bounds.rs"
required-features = ["codecs"]
[[test]]
name = "container_reservations"
path = "tests/container_reservations.rs"
required-features = ["world", "audio_scene", "film", "score", "haptic", "splat4d"]
[[test]]
name = "extension_duration_limits"
path = "tests/extension_duration_limits.rs"
required-features = ["world", "audio_scene", "film", "score", "haptic", "splat4d"]
[[test]]
name = "text_decode_memory"
path = "tests/text_decode_memory.rs"
required-features = ["codecs"]
[[test]]
name = "video_receipt"
path = "tests/video_receipt.rs"
required-features = ["video_receipt"]
[[test]]
name = "world_model"
path = "tests/world_model.rs"
required-features = ["world_model"]
[[test]]
name = "live_events"
path = "tests/live_events.rs"
required-features = ["live_events"]
[[test]]
name = "live_room"
path = "tests/live_room.rs"
required-features = ["live_room"]
[[test]]
name = "capture_take"
path = "tests/capture_take.rs"
required-features = ["capture_take"]
[[test]]
name = "live_compose"
path = "tests/live_compose.rs"
required-features = ["live_compose"]
[[test]]
name = "live_record"
path = "tests/live_record.rs"
required-features = ["live_record"]
[[test]]
name = "live_metering"
path = "tests/live_metering.rs"
required-features = ["live_metering"]
[[test]]
name = "energy_steering"
path = "tests/energy_steering.rs"
required-features = ["energy_steering"]
[[test]]
name = "browser_sink"
path = "tests/browser_sink.rs"
required-features = ["browser_sink", "receipt_claims"]
[[test]]
name = "dred_exact"
path = "tests/dred_exact.rs"
required-features = ["dred_exact"]
[[test]]
name = "dred_exact_measure"
path = "tests/dred_exact_measure.rs"
required-features = ["dred_exact"]
[[test]]
name = "dred_exact_gpu"
path = "tests/dred_exact_gpu.rs"
required-features = ["dred_exact", "ops_gpu"]
[[test]]
name = "live_moderation"
path = "tests/live_moderation.rs"
required-features = ["live_moderation"]
[[test]]
name = "co_watch"
path = "tests/co_watch.rs"
required-features = ["co_watch"]
[[test]]
name = "synthesis"
path = "tests/synthesis.rs"
required-features = ["synthesis"]
[[test]]
name = "takedown"
path = "tests/takedown.rs"
required-features = ["takedown"]
[[test]]
name = "pq_signatures"
path = "tests/pq_signatures.rs"
required-features = ["pq_signatures"]
[[test]]
name = "contribution"
path = "tests/contribution.rs"
required-features = ["contribution"]
[[test]]
name = "direction"
path = "tests/direction.rs"
required-features = ["direction"]
[[test]]
name = "splat_exact"
path = "tests/splat_exact.rs"
required-features = ["splat_exact"]
[[test]]
name = "splat_exact_gpu"
path = "tests/splat_exact_gpu.rs"
required-features = ["splat_exact", "ops_gpu"]
[[test]]
name = "synthesis_mark"
path = "tests/synthesis_mark.rs"
required-features = ["synthesis_mark"]
[[test]]
name = "exact_upscale"
path = "tests/exact_upscale.rs"
required-features = ["exact_upscale"]
[[test]]
name = "exact_upscale_gpu"
path = "tests/exact_upscale_gpu.rs"
required-features = ["ops_gpu", "exact_upscale"]
[[test]]
name = "robustness"
path = "tests/robustness.rs"
required-features = ["robustness"]
[[test]]
name = "live_watermark"
path = "tests/live_watermark.rs"
required-features = ["live_watermark"]
[[test]]
name = "live_ads"
path = "tests/live_ads.rs"
required-features = ["live_ads"]
[[test]]
name = "ad_presentation"
path = "tests/ad_presentation.rs"
required-features = ["live_ads"]
[[test]]
name = "live_provenance"
path = "tests/live_provenance.rs"
required-features = ["live_provenance"]
[[test]]
name = "derive_edge"
path = "tests/derive_edge.rs"
required-features = ["derive_edge"]
[[test]]
name = "ai_usage"
path = "tests/ai_usage.rs"
required-features = ["ai_usage"]
[[test]]
name = "settlement"
path = "tests/settlement.rs"
required-features = ["settlement"]
[[test]]
name = "co_performance"
path = "tests/co_performance.rs"
required-features = ["co_performance"]
[[test]]
name = "age_assurance"
path = "tests/age_assurance.rs"
required-features = ["age_assurance"]
[[test]]
name = "influence"
path = "tests/influence.rs"
required-features = ["influence"]
[[test]]
name = "bearer_receipts"
path = "tests/bearer_receipts.rs"
required-features = ["bearer_receipts"]
[[test]]
name = "telemetry_aggregate"
path = "tests/telemetry_aggregate.rs"
required-features = ["telemetry_aggregate"]
[[test]]
name = "exploration"
path = "tests/exploration.rs"
required-features = ["exploration"]
[[test]]
name = "exact_tonemap"
path = "tests/exact_tonemap.rs"
required-features = ["exact_tonemap"]
[[test]]
name = "timed_text"
path = "tests/timed_text.rs"
required-features = ["timed_text"]
[[test]]
name = "access_services"
path = "tests/access_services.rs"
required-features = ["access_services"]
[[test]]
name = "world_replay"
path = "tests/world_replay.rs"
required-features = ["world"]