open-standards/wai/changes/2026-11-09-conditioned-refinement.md
Transaction Science 9751a06676
Some checks failed
joule-moq-web browser client / joule-moq-web · does this change touch it (push) Successful in 15s
joule-moq-room room service / joule-moq-room · does this change touch it (push) Successful in 18s
wai-app and Create / wai-app · does this change touch it (push) Successful in 15s
joule-moq-remote host agent / joule-moq-remote · does this change touch it (push) Successful in 32s
wai cross-architecture byte-equality / does this change touch it (push) Successful in 11s
wai-fleet service / does this change touch it (push) Successful in 11s
wai-audit collector and player integration / does this change touch it (push) Successful in 15s
WAI operation catalogue / does this change touch it (push) Successful in 15s
wai-key-proxy / does this change touch it (push) Successful in 14s
wai-ops integer operators / does this change touch it (push) Successful in 14s
wai-ledger service / does this change touch it (push) Successful in 18s
wai-quantum studio and desktop / does this change touch it (push) Successful in 14s
wai-quantum for JavaScript / does this change touch it (push) Successful in 16s
wai-sink-android native sink library / does this change touch it (push) Successful in 16s
wai-sink-swift native sink package / does this change touch it (push) Successful in 11s
WAI Studio / does this change touch it (push) Successful in 12s
joule-code conformance gate / Build + round-trip C1-C4 vectors (push) Has been cancelled
joule-code conformance gate / joule-moq-relay, every target (push) Has been cancelled
joule-code conformance gate / joule-moq-relay, its own energy on a counter (macos) (push) Has been cancelled
joule-code conformance gate / joule-moq-ingest, every target (push) Has been cancelled
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (push) Has been cancelled
joule-moq-remote host agent / joule-moq-remote, every target (macos) (push) Has been cancelled
joule-moq-room room service / joule-moq-room, every target (push) Has been cancelled
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (push) Has been cancelled
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (push) Has been cancelled
wai-app and Create / wai-app · Create, browser end-to-end (macos) (push) Has been cancelled
wai-audit collector and player integration / collector · linux (push) Has been cancelled
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (push) Has been cancelled
WAI operation catalogue / the catalogue and every door · linux (push) Has been cancelled
wai-fleet service / service · linux (push) Has been cancelled
wai-fleet service / service · macos (push) Has been cancelled
wai-ledger service / service · linux (push) Has been cancelled
wai-ledger service / service · macos (push) Has been cancelled
wai-quantum for JavaScript / javascript · linux (push) Has been cancelled
wai-quantum studio and desktop / studio · browser (push) Has been cancelled
wai-quantum studio and desktop / desktop app · macos (push) Has been cancelled
wai-quantum studio and desktop / desktop app · linux (push) Has been cancelled
wai-quantum studio and desktop / desktop app · windows (push) Has been cancelled
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (push) Has been cancelled
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (push) Has been cancelled
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (push) Has been cancelled
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Has been cancelled
WAI Studio / Studio in Chromium and Firefox · macos (push) Has been cancelled
WAI Studio / Studio in WebKit · linux (push) Has been cancelled
wai cross-architecture byte-equality / windows-x86_64 (push) Successful in 1m7s
wai cross-architecture byte-equality / macos-arm64 (reference) (push) Successful in 24s
wai-ops integer operators / macos-arm64 (push) Successful in 57s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 7s
wai-quantum energy-landscape jobs / does this change touch it (push) Successful in 7s
wai cross-architecture byte-equality / linux-x86_64 (push) Successful in 1m2s
wai-ops integer operators / wasm32 under Node (push) Successful in 31s
wai-ops integer operators / independent checker (Python) (push) Successful in 19s
wai-ops integer operators / linux-x86_64 (push) Successful in 1m12s
wai-ops integer operators / wasm32-wasip2 (wasmtime) (push) Successful in 1m7s
wai-key-proxy / proxy · linux (push) Successful in 1m34s
wai-quantum energy-landscape jobs / reader, kernels, answers and the stated result · linux, release (push) Has been cancelled
wai-quantum energy-landscape jobs / the same bits · linux-arm64 (push) Has been cancelled
wai-quantum energy-landscape jobs / the module under wasm32-wasip2 (wasmtime) (push) Has been cancelled
wai-quantum energy-landscape jobs / native against WebAssembly, over many seeds (push) Has been cancelled
wai-quantum energy-landscape jobs / the same bits · macos (push) Has been cancelled
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 3m0s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 5m21s
wai cross-architecture byte-equality / linux-aarch64 (push) Successful in 1m18s
wai-ops integer operators / linux-aarch64 (push) Successful in 1m58s
wai: a refinement conditioned on side information both ends hold, wai.image.int_cond_refine
Registers wai.image.int_cond_refine, refinement-only and StandardDefined, with the
staged form conditioned residual and the payload WCP1 (staged-delivery §6.2,
Appendix B). A layer's next stage is the base prediction (the stage below, or its
up2 at the output's size), plus a correction an integer network carried in the
payload computes from it and the side planes refines.side names, clamped, plus a
WIR1 residual decoded over that prediction. The network is one WHG1 graph lowered
by wcp1/1 under acc64, so every sink holding the same planes computes the same
bytes. Over rendered content the side planes are G-buffers carried as exact
objects of their own, or the frame the sink renders itself from a
wai.splat.int_codec object at a pinned pose with wai-splat-render:i1; with no side
plane over a lower-resolution base the layer is a dual stream's detail.

staged-delivery §3.1 reads refines.side (content hashes, or render entries with a
splat-exact §2 pose); §4.1 step 4 refuses a plane the sink does not hold
(side-absent) or that is not exact (side-not-exact), two reasons that join §4.2's
closed list and the stage claim's. A WAI2 refinement component carries no side
(refinement-side); a packer refuses a WAI1 layer that carries one. SPEC §5's
Refinement capabilities and Base admission rows, §7.1, integer-operators §11 and
jwp-receipts' session rule follow.

wai-rs: staged::wcp1 (parse, cost, lowering, graph decode, the loop-by-loop
arithmetic the encoder holds the graph to, encoder), staged::side, StageSink
add_side, add_render and set_macs_limit, the WCP1 framing check,
RoleError::RefinementSide, AppliedForm::Conditioned. staged-conformance/cond/
holds its cases (exact planes, the dual stream, both in one layer, a rendered
plane, planes absent and not exact, geometry, admission, side and WCP1 faults,
cost limits) and cond/wai2/; wai_staged_vectors (now with splat_exact) writes and
replays them, and staged_verify.py replays them with its own WCP1 parser, network
loop, sink, PNG decode and splat renderer. The two Rust API breaks are
acknowledged in the change's entry.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-09 17:50:44 -05:00

67 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

### A refinement conditioned on side information both ends hold: `wai.image.int_cond_refine`
- **One capability registered** (SPEC §5, *Refinement capabilities*): `wai.image.int_cond_refine`,
refinement-only, `StandardDefined`, with the staged form *conditioned residual* and the
payload `WCP1`. Its row of *Base admission* is `wai.image.int_refine`'s. A layer's next
stage is three integer steps over the unit's current output and the **side planes** its
`refines.side` names: the base prediction (the current output, or its `up2_predict` at the
output's size), an integer network carried in the payload that reads the base prediction
and the side planes and adds a correction clamped to `[0, 255]`, and a `WIR1` residual
decoded over that prediction with the identity predictor. Every sink that holds the same
side planes computes the same bytes, so the output is as exact as the base and the planes.
The base, each side object and the layer are objects of their own, each named by its
content hash and covered by its own receipt; the sink composes them and computes the
stage, whose stage hash is the digest a signed `stage` claim states and a presenting sink
checks.
- **One mechanism, two uses.** Over rendered content the side planes are G-buffers both sides
hold (depth, normals, albedo), each carried as an exact object of its own, or the frame the
sink renders itself from a `wai.splat.int_codec` object at a pinned pose with
`wai-splat-render:i1`, which costs nothing on the wire. With no side plane, over a base at a
lower resolution, the layer is the detail stream of a dual stream: the up2 of the
low-resolution reference, and the detail the network reconstructs from it.
- **Side planes** ([staged-delivery](extensions/staged-delivery.md) §3.1): `refines.side`, read
for the conditioned form and ignored for any other, is absent, `null`, or 1 to 4 entries,
each a content hash or `{"object", "renderer": "wai-splat-render:i1", "pose"}` with a pose of
splat-exact §2; any other value is `refines-malformed`. A plane is exact when its object was
decoded through its manifest's capability, not a fallback, at `decode-equivalence`. §4.1
step 4 checks each entry in order after base admission: the sink holds its plane
(`side-absent`), and the plane is exact (`side-not-exact`). The two reasons join §4.2's
closed list and the reasons a `stage` claim names (jwp-receipts §2.4.10). A plane is the
sink's, held beside its chains and no part of a chain's state.
- **The payload** (staged-delivery §6.3, Appendix B): `WCP1`, a 12-byte header (`predictor`,
`n_side`, `n_layers`, `act_hi`), the network in the layer form of
[exact-upscale](extensions/exact-upscale.md) §3.1 (the first layer reads `3·(1 + n_side)`
channels, the last writes 3), and a `WIR1` residual of the RGB8 unit kind with the identity
predictor. Its checks run in a stated order with Appendix A.6's codes; `n_side` must be the
count `side` names. Its declared cost adds the network's working bytes and its
multiply-accumulates, which a sink may limit (`cost-over-limit`, `multiply-accumulates`).
- **Through the integer operator set.** The network is one `WHG1` graph, lowered by `wcp1/1`
([integer-operators](extensions/integer-operators.md) §11, Appendix B.6 of staged-delivery):
`concat`, `rescale`, `conv`, `clamp` and `add`, loaded under `acc64` with its bounds
certificate, which every payload that parses meets. The capability's `ops` member names the
set, `acc64`, `wcp1/1` and E1's modes.
- **Carriage.** A layer that reads side planes travels as a `WAI1` object: a `WAI2`
refinement component carries no `side` (SPEC §7.1, `refinement-side`), and a packer refuses
a `WAI1` layer that carries one. One with no side plane packs and explodes as any layer.
- **Reference implementation.** `wai-rs`: `staged::wcp1` (the parse, the cost, the lowering,
the decode through the graph, the arithmetic loop by loop, which the encoder holds the graph
to, and the encoder), `staged::side` (`SideEntry`, `SidePose`, `read`, `with_side`),
`staged::{is_conditioned, layer_units}`, `StageSink::{add_side, add_render,
set_macs_limit}`, `StageChain::set_macs_limit`, `codecs::CAP_IMAGE_INT_COND_REFINE` with
`AppliedForm::Conditioned`, the `WCP1` framing check, `RoleError::RefinementSide`; the
session claim reads a conditioned layer's units from its `WCP1` payload.
- **Conformance.** `staged-conformance/cond/`, written and checked by `wai_staged_vectors`
(which now builds with `splat_exact`): exact side planes; the dual stream; both together, an
8 × 8 render with three 16 × 16 G-buffers; a rendered plane; a plane not held, then held;
planes that are not exact (an unpinned decode, a fallback, the render of an unpinned splat
set); a plane of another size; a base the row does not admit; `side` broken each way; each
`WCP1` check broken once; cost limits on working bytes and on multiply-accumulates; and
`cond/wai2/`. `staged_verify.py` replays every case with its own `WCP1` parser, its own
network loop and its own sink, decodes each side object's PNG, and renders each plane with
`live-conformance/splat_exact_verify.py`'s renderer.
- **Breaking:** `staged::StageRefusal` gains `SideAbsent` and `SideNotExact`, so
`StageRefusal::ALL` holds 16 reasons where it held 14, and `codecs::AppliedForm` gains
`Conditioned`: `api:rust:wai::staged::StageRefusal::ALL`,
`api:rust:wai::codecs::AppliedForm::Conditioned`. A caller that matches `AppliedForm`
exhaustively adds an arm for the conditioned form; one that reads `StageRefusal::ALL` as an
array of 14 reads its length.