### `wai.image.jpegai`'s hyper decoders, context stages and synthesis through the integer operator set

- **§13.6.2 is normative.** [integer-operators](extensions/integer-operators.md) §13.6.2
  writes the topology of the capability's other integer networks as four `WHG1` graphs,
  lowered by `jpegai-int/1` from the bundle's eight weight files in §13.0's canonical
  form: `rec_y` and `rec_uv` (each plane's hyper decoder, and for luma its four context
  stages, from the hyper-latent and the dequantised residual to the reconstructed
  latent) and `syn_y` and `syn_uv` (the synthesis). §1's claim widens to what these
  networks give for their inputs. The independent checker (`tools/wai_ops_check.py`),
  written from the text alone, reproduces every lowered graph and certificate byte for
  byte.
- **Ranges.** Every activation an operator can grow, and every input but the
  hyper-latent, is checked within i32 (`A32`), so every sum is bounded by the weights.
  On the test codestream inputs stay within 21 bits, activations within 24, and the
  largest sum is 37 bits against certified bounds of 42 to 60: `acc64` holds for every
  sum, and no wider accumulator is needed (§13.6.2, *Accumulators, measured*).
- **Profiles.** The `ops` member is `{ wai-ops/1, acc64, full, jpegai-int/1,
  role_profiles: { hs_y: acc32, hs_uv: acc32 } }`: the set meets `acc64`, and its scale
  path still `acc32` (§11's new `role_profiles`; both certifiers take
  `--role-profile`). The certificate of `jpegai/v1` (`3e243dc1…`) holds the six graphs.
- **The switch.** `jpegai_decode::{decode, decode_with_stages}` run the hyper decoders,
  context stages and synthesis through the operator set (`jpegai_ops::Networks`,
  `jpegai_decode::load_networks`); `decode_loaded` takes the scale path and the networks
  loaded once, with the eICCI net. Every committed and pinned output is unchanged: the
  `Synthesis` stage hash and every other stage hash of `tests/jpegai_cross_platform.rs`,
  and the decoded RGB SHA-256 that `wai-jpegai-e2e.yml` pins. The direct networks run
  only in `jpegai_decode::legacy`, test-only (`legacy_int`). The neural sink lowers and
  loads the networks from the members' bytes through the store of loaded sets.
- **No loader panics.** `Weights::from_json`, `IntNet::from_json` and
  `IcciNet::from_json` return a `Result` (`jpegai_synthesis::BadMember`); a mistyped
  member is refused `model_mismatch` where it panicked, and the sink reports that
  refusal rather than decoding through the float path.
- **Planned breaks** (integer-operators §15.3 item 4, SPEC §8): a weight file that
  breaks §13.6.2's member rules or shapes, or networks whose certificate does not meet
  `acc64` (`model_mismatch`); a dequantised residual, a latent or an activation of the
  networks past i32 as a Q16 value (`field_range`), where the decoder computed on. No
  committed bundle or codestream reaches either.
- **CI.** `tests/jpegai_nets_ops.rs` runs in both fast-kernel steps of
  `wai-conformance.yml` on the committed synthetic networks, and in `wai-jpegai-e2e.yml`
  on `jpegai/v1`, each pinned case required by name; the differential gains the
  networks' half, per push and nightly.

