### GPUs: when `decode-equivalence` may be claimed, and WGSL's integer semantics on every adapter

- **Claiming the tier on a GPU** ([determinism-tiers](extensions/determinism-tiers.md)
  §5). A decoder claims `decode-equivalence` for output whose graphs ran on a GPU only
  when every shader module that ran them is integer only (no floating-point type, so no
  reassociation or fusion can change a result), uses no subgroup or quad operation and
  enables no extension, has no result that depends on scheduling (one atomic kind per
  word, its result unused, no atomic load or store; no out-of-bounds access), and is
  translated with the translator's integer
  guards on: signed arithmetic through unsigned, guarded division and remainder, `abs` and
  negation of the most negative value. Where the translator does not produce WGSL's
  result, the module does not reach the operation: naga 30.0.1 passes shift amounts to
  MSL, HLSL and SPIR-V unreduced, a signed left shift as it is, and integer `clamp` as
  MSL's and HLSL's `clamp`, so every shift amount is masked below 32, no left shift is of
  a signed value, and every `clamp` has literal bounds in order. Before an adapter runs a
  graph it passes WGSL's integer semantics vectors and the implementation's probe; the
  claim names the adapter and the translator (or, where the backend reports no PCI
  identity, the adapter's name and the system's build). The conditions open with a general
  form for any accelerator, of which these are the GPU's.
- **WGSL's integer semantics vectors** (`wgsl-conformance/`). Every integer operation a
  kernel may use, on `i32`, `u32` and their two-component vectors, at the cases WGSL defines at run
  time and MSL, HLSL and SPIR-V leave open, each result written from the WGSL text
  (Candidate Recommendation Draft, 21 October 2026). Cases the kernels never reach are
  marked `unguarded`: reported, not deciding.
- **`wai-ops-gpu`.** Discovery runs the semantics suite on each adapter after the
  arithmetic probe, and refuses an adapter that differs on a guarded case. Every run-time
  shift amount in the kernels is now masked (`& 31u`) and the two run-time clamps are
  `min(max(…))`; WGSL gives the same result either way, and the translated code is then
  defined on every backend. `tests/wgsl_rules.rs` holds every shipped module to the
  conditions on naga's IR and in its MSL and HLSL translations (signed arithmetic found by
  naga's wrapping, atomic loads and stores refused), with planted violations refused; the
  browser page runs the suite through the browser's WGSL compiler and checks the vectors
  against the reference compiled to wasm32. Shown in the forge's run of `wai-ops-gpu.yml` on
  Metal and on a browser's WebGPU on that GPU: every guarded case equal, every unguarded one
  too, and the capability corpora decoding with their graphs on the device to the CPU
  decode's bytes; and on Vulkan with an integrated GPU of PCI vendor 0x1002 and llvmpipe on
  Linux, the crate's tests with none differing. The tier is claimed on those, each run's
  report lines committed in `wai/research/ops-gpu-runs.txt`; adapters run by hand with no
  record, and those G1 showed on the kernel text before the masks, are not claimed until a
  recorded run.

