open-standards/wai/changes/2026-11-09-compose-fields-and-conditioned-layers.md
Transaction Science d314fb6497
Some checks failed
wai-quantum for JavaScript / does this change touch it (push) Successful in 10s
WAI Studio / does this change touch it (push) Successful in 25s
wai-quantum studio and desktop / does this change touch it (push) Successful in 25s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (push) Successful in 10s
wai-quantum energy-landscape jobs / does this change touch it (push) Successful in 10s
wai-quantum studio and desktop / desktop app · macos (push) Successful in 5m28s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (push) Successful in 1m16s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (push) Successful in 37s
wai-quantum for JavaScript / javascript · linux (push) Successful in 5m41s
wai-quantum studio and desktop / desktop app · windows (push) Successful in 10m17s
wai-quantum energy-landscape jobs / the same bits · macos (push) Successful in 5m58s
wai-quantum energy-landscape jobs / native against WebAssembly, over many seeds (push) Successful in 4m55s
wai-quantum studio and desktop / studio · browser (push) Successful in 6m33s
WAI Studio / Studio in Chromium and Firefox · macos (push) Successful in 11m26s
wai-quantum studio and desktop / desktop app · linux (push) Successful in 6m37s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (push) Successful in 7m10s
wai-quantum energy-landscape jobs / reader, kernels, answers and the stated result · linux, release (push) Successful in 12m1s
WAI Studio / Studio in WebKit · linux (push) Successful in 14m7s
wai-quantum energy-landscape jobs / the module under wasm32-wasip2 (wasmtime) (push) Successful in 14m25s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
wai-quantum energy-landscape jobs / the same bits · linux-arm64 (push) Has been cancelled
wai-web compose: fields and conditioned refinements computed in the page, each stage held to its signed digest
The composing page now computes two capabilities that so far ran only natively, in
WebAssembly, from the wai-rs decoders compiled to wasm32 (the compose feature gains
wai/field_int and wai/splat_exact; nothing is written again in JavaScript):

- src/compose_stage.rs: ComposedField, a wai.field.int_grid base and its
  wai.field.int_refine levels (int_field::FieldStages under staged-delivery §4.1, a hold
  bound of zero), rendered at the field's own view after every stage, its render work
  limited before it renders; ComposedStage, staged::StageSink with the side planes a
  wai.image.int_cond_refine layer reads held by the page: PNG pictures through an
  envelope's capability or its fallback, splat sets through wai.splat.int_codec with the
  parameter set the page holds, and a render entry's frame rendered in the page by
  wai-splat-render:i1; composeSide, the side planes a layer names.
- compose.js: a field is presented as the picture and a picture of an image component
  decoded in the tab, each held to its signed digest. A piece whose base has layers
  presents the base, then takes each layer as it arrives: checked against its entry, the
  next stage computed in WebAssembly, held to the stage hash its entry states, then
  presented. A side object is held as a plane only where the page decodes it under the
  profile, its bytes pass their entry's checks and its output holds its digest. A layer
  refused anywhere (side-absent, side-not-exact, layer-gap, object-hash, prefix-digest)
  leaves the stage below presented, and the page says why. The dispatch record lists
  each piece's layers; the field and the side objects route wasm, never asked of the
  user agent, and the refinement capabilities are in the report's wasm leg.
- compose/staged/: four packages sealed with the package's key from objects of
  volumetric-conformance/fields/ and staged-conformance/cond/, byte for byte, every
  prefix digest computed natively and held to the corpus's statement; the native tests
  (compose_stage::) require the committed bytes and replay both corpora through the
  bindings' pure half.
- run.mjs: the staged cases (--only staged runs them alone), held to the corpora and the
  signed entries: each field renders to its scene's frame digest, read back from the
  canvas; each level, held back in delivery and released one at a time, presents its
  stage hash before the next is asked for; a wrong signed stage digest, a flipped level,
  a withheld or flipped side object, the splat decoder left out of the profile and a
  plane held only through its fallback are each refused with their code, the stage below
  presented.
- browser-sink §14: the field in the layers table, the dispatch rule for fields, layers
  and side objects, the dispatch record's layers, the new §14.5 Refinement layers, the
  staged packages (§14.7) and their conformance (§14.8).
- CI: wai-web-wasm.yml runs compose_stage:: natively and triggers on
  volumetric-conformance/; its native test count is 38, which main already has.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-09 19:22:49 -05:00

3.8 KiB

The composing page computes fields and conditioned refinements in WebAssembly

  • wai-web compose bundle (src/compose_stage.rs, with wai/field_int and wai/splat_exact added to the feature): ComposedField, a wai.field.int_grid base and the wai.field.int_refine levels offered to it, wai::int_field::FieldStages under staged-delivery §4.1 with a hold bound of zero, rendered at the field's own view after every stage, with a render-work limit checked before anything is rendered (cost_over_limit); ComposedStage, wai::staged::StageSink with the side planes a wai.image.int_cond_refine layer reads held by the page: pictures decoded from wai.image.png through an envelope's capability or its fallback, splat sets decoded through wai.splat.int_codec with the parameter set the page holds, and a render entry's frame rendered in the page by wai-splat-render:i1 at its pose; composeSide, the side planes a layer names. The decode, the levels, the network, the residual, the render and every check are wai-rs's, compiled to wasm32; nothing is written a second time in JavaScript.
  • compose.js: a field is presented as the picture, rendered in the tab at the view its payload pins, and a picture of an image component is decoded in the tab, each held to its signed digest first. A piece whose base has layers presents the base, then takes each layer as it arrives: checked against its entry, its next stage computed in WebAssembly, held to the stage hash its entry states, and only then presented. A conditioned layer's side planes come from the piece's asset entries: an object is held as a plane only where the page decodes it under the device's profile, its bytes pass their entry's checks and its output holds its digest. A layer refused anywhere (side-absent, side-not-exact, layer-gap, object-hash, prefix-digest and the rest) leaves the stage below presented, and the page says why. The dispatch record lists each piece's layers with their outcome, reason, stage, stage hash and the side planes each read. A field and the side objects route wasm and are never put to the user agent (platform-decode maps none of them); the refinement capabilities the page applies are in the report's wasm leg.
  • compose/staged/: four packages of one image component each (fields, fields-digest, cond, cond-not-exact), sealed with the package's key from objects of volumetric-conformance/fields/ and staged-conformance/cond/, byte for byte, each entry's prefix digest computed natively and held to the corpus's statement; the native tests require the committed bytes. run.mjs adds the staged cases (--only staged runs them alone): every field renders to its scene's frame digest, read back from the canvas; with each level's delivery held back and released one at a time, the coarse field is presented before its first level is asked for and every stage before the next level; a stage whose signed digest is another's, a level with a byte flipped, a side object withheld or flipped, the splat decoder left out of the profile, and a plane held only through its fallback are each refused with their code and the stage below presented.
  • browser-sink §14: the layers table names wai.field.int_grid; §14.3 the rule for the field, its levels, the conditioned layer and its side objects, and the dispatch record's layers; §14.4 the field's and the picture's digests; a new §14.5, Refinement layers, what the page computes and checks for each layer, in order; §14.7 the staged packages; §14.8 their conformance. The former §14.5 to §14.7 are now §14.6 to §14.8.
  • CI: wai-web-wasm.yml runs the compose bundle's native tests (compose_stage::), and triggers on wai/volumetric-conformance/.