wai-ops: wai.audio.int_codec decodes through the integer operator set, goldens unchanged (D2c, M3) #264

Merged
dcharlot merged 27 commits from wai/d2c-m3 into main 2026-10-15 09:05:49 -04:00

2026-10-15

Transaction Science
Merge origin/main (at 5d4ae64c, with #253) into wai/d2c-m3
Some checks failed
wai formal verification (integer core) / kani (stage) (pull_request) Successful in 3m33s
wai formal verification (integer core) / kani (isqrt512) (pull_request) Successful in 43m50s
wai formal verification (integer core) / kani (stage-long) (pull_request) Successful in 22m5s
wai formal verification (integer core) / kani (integer-core) (pull_request) Successful in 5m22s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 1m27s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m22s
wai-ops integer operators / linux-x86_64 (pull_request) Successful in 54s
wai-ops integer operators / wasm32-wasip2 (wasmtime) (pull_request) Successful in 29s
wai-ops integer operators / independent checker (Python) (pull_request) Successful in 13s
wai-ops integer operators / wasm32 under Node (pull_request) Successful in 22s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m11s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 3m5s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m22s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m22s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 39m32s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 38m26s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Successful in 5m6s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Successful in 5m58s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Successful in 5m30s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 4s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m26s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m6s
wai-pack / wai-pack · linux (pull_request) Successful in 1m17s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 3m56s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 21s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m17s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m32s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 5m10s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 41m12s
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
Co-Authored-By: Claude Opus 5.5 <[email protected]>

# Conflicts:
#	wai/CHANGELOG.md
2026-10-15 01:10:43 -04:00
Transaction Science
Merge main (with #258) into wai/d2c-m2-m3
Some checks failed
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been cancelled
wai formal verification (integer core) / every harness in one shard (pull_request) Has been cancelled
wai formal verification (integer core) / kani (arith) (pull_request) Has been cancelled
wai formal verification (integer core) / kani (isqrt512) (pull_request) Has been cancelled
wai formal verification (integer core) / kani (plan) (pull_request) Has been cancelled
wai formal verification (integer core) / kani (sound) (pull_request) Has been cancelled
wai formal verification (integer core) / kani (stage) (pull_request) Has been cancelled
wai formal verification (integer core) / kani (rans64-t2) (pull_request) Has been cancelled
wai formal verification (integer core) / kani (stage-long) (pull_request) Has been cancelled
wai formal verification (integer core) / kani (integer-core) (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Has been cancelled
wai cross-architecture byte-equality / linux-x86_64 (pull_request) Has been cancelled
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Has been cancelled
jouleclaw public surface must stay documented / Public-surface audit (jouleclaw-rs) (pull_request) Has been cancelled
joule-code conformance gate / Build + round-trip C1-C4 vectors (pull_request) Has been cancelled
# Conflicts:
#	wai/CHANGELOG.md
2026-10-15 01:05:23 -04:00

2026-10-14

Transaction Science
D2c M3 gate 7: the overflow geometry case uses weights a WAM1 file can hold
WAM1's weights are 16-bit, so a model with a 2^22 tap does not lower (its graph's
weights would not fit their width); the case now uses taps of 2^14 on inputs of 2^50,
and also runs an input inside the range.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 20:30:03 -04:00
Transaction Science
D2c M3 gate 7: the audio decode's direct guard and fast dispatch go
- int_audio: the direct path's fast dispatch (conv_t_1d over int_kernels) is deleted;
  the test-only direct decode runs each transposed convolution on its scalar kernel
  (reference::conv_t_1d, verbatim, itself test-only now). Its guard layer_in_range,
  and run_layer, live only inside the test-only legacy module: the production audio
  decode's exactness checks are its graph's check ranges, the PCM step's included.
- The kernel_equivalence module (the dispatch against the scalar kernel; retargeted at
  the interpreter at gate 5) is deleted. Its edge geometry moves into int_audio's
  geometry tests, through the lowered graph under every policy: a one-sample input
  upsampled by any stride a WAM1 field holds; several samples whose uncropped length
  is past the cap (too_large, the fast kernel never entered); padding past the fast
  kernels' pad factor (the interpreter computes it); an input that could overflow,
  refused by the check range before any arithmetic.
- int_hyper_synth's docs: igdn_check's audio caller and run_net_checked's are
  test-only now; the conditional codec's checked decode is the last production
  caller (M4). int_kernels_geometry's and the export tool's notes follow.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 20:25:19 -04:00
Transaction Science
D2c M3 gate 6: the planned breaks written, the scan of every committed set and payload
Completes the switch (67fa63e4).

- tests/int_audio_ops.rs: the scan. Both committed audio sets (the one the payloads
  decode against, and the synthetic one) have layers, header shifts under 128, no
  bias of magnitude 2^63 - 1 or more, and lower and load under acc64 (the PCM step's
  range included); every committed payload (the vector, the fourteen fixtures, the
  staged base's) decodes or is refused through the lowering exactly as directly.
- integer-payloads: 5 cites wam1/1 with t_out as its scalar and the PCM step (and
  states its refusal); 7's set rules and order add the synthesis lowered and loaded
  after its shape checks; Exactness names WIA1's lowering and its PCM step.
- integer-operators: the status note names wai.audio.int_codec; 15.3 item 3 says its
  breaks take effect for it too, the PCM step's range among them.
- SPEC 8's planned breaks and the CHANGELOG entry (the decode, the breaks).

Measured (int_payload_cost): with the set loaded, the audio decode holds 1312099
bytes against 1312704 declared (its largest layer's input, uncropped plane and
output, as the payload text counts them).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 20:04:45 -04:00
Transaction Science
WIP D2c M3 gate 6: wai.audio.int_codec decodes through wam1/1 (text and scan follow)
- int_audio::decode_typed is ops::decode_typed; the direct decode (legacy) and its
  helpers (conv_t_1d, layer_in_range, run_layer) are cfg(any(test, feature = "legacy_int")).
- int_payload::declared_cost for WIA1 runs ops::plan, the lowering's load included.
- tests/int_payload_cost.rs: audio's set allowance is the set parsed, lowered and
  loaded; with the set loaded beforehand, the decode holds no more than the declared
  working bytes. tests/int_audio_ops.rs needs legacy_int.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 20:03:00 -04:00
Transaction Science
D2c M3 gate 5: int_audio's one-dimensional kernel equivalence, held to the interpreter
int_ops equivalence gains one_dimensional_transposed_convolutions_equal_the_interpreter:
random transposed convolutions of wam1/1's shape (kh = 1, sh = 1, ph = 0, oph = 0;
kernels up to 9, strides up to 5, lengths up to 40; operands that fit i32 and that do
not) with WAM1's requantisation, the fast kernel behind the interpreter against the
interpreter alone, the fast kernel counted. It is int_audio's conv_t_1d equivalence
(fast one-dimensional kernel against its scalar kernel) retargeted at the
interpreter, as gate 5 asks.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 19:55:21 -04:00
Transaction Science
Merge main into wai/d2c-m2-m3
Some checks failed
wai formal verification (integer core) / kani (stage) (pull_request) Successful in 3m38s
wai formal verification (integer core) / kani (isqrt512) (pull_request) Successful in 44m19s
wai formal verification (integer core) / kani (stage-long) (pull_request) Successful in 21m29s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 2m10s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m17s
wai-ops integer operators / linux-x86_64 (pull_request) Successful in 53s
wai-ops integer operators / wasm32-wasip2 (wasmtime) (pull_request) Successful in 31s
wai-ops integer operators / wasm32 under Node (pull_request) Successful in 21s
wai-ops integer operators / independent checker (Python) (pull_request) Successful in 12s
wai formal verification (integer core) / kani (integer-core) (pull_request) Successful in 6m33s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m8s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 3m5s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 3m13s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m17s
WAI HTTP delivery / HTTP corpus · falsify mutations 0/3 (pull_request) Successful in 39m50s
WAI HTTP delivery / HTTP corpus · falsify mutations 1/3 (pull_request) Successful in 39m12s
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Failing after 1m0s
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Failing after 1m2s
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Failing after 1m1s
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Successful in 5s
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Successful in 2m26s
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Successful in 1m7s
wai-pack / wai-pack · linux (pull_request) Successful in 1m20s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 3m58s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 21s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 1m17s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m38s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 5m1s
WAI HTTP delivery / HTTP corpus · falsify mutations 2/3 (pull_request) Successful in 39m9s
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Has been cancelled
# Conflicts:
#	wai/CHANGELOG.md
2026-10-14 12:35:56 -04:00
Transaction Science
D2c M3 gate 5: the fast kernels behind the interpreter, held to it, for the audio set
- int_ops equivalence: the committed audio synthesis through wam1/1 runs all four of
  its one-dimensional transposed convolutions on the fast kernel under every fast
  policy (counted), and every sample is the interpreter's. Its inverse GDNs and its
  PCM step run on the interpreter under every policy (the host lends no IGDN kernel;
  that arm is M4's, and the audio decode does not need it to be exact).
- tests/int_audio_ops.rs: under the reference kernels and four fast policies the
  decode through the lowering gives the same samples, or the same refusal, on the
  committed vector as WIA1 and as its JSON form, and on clips with a channel moved to
  the input's check range and one past it, at each end.
- byte-exact-conformance declares audio_int (on by default) beside splat_int: it
  always includes int_audio, so the new unit test runs on every leg too.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 11:23:42 -04:00
Transaction Science
D2c M3 gate 4: wai.audio.int_codec's differential against the direct decode
tests/int_ops_differential.rs gains the audio half (the file now needs legacy_int,
splat_int and audio_int; Cargo.toml and the nightly workflow say so):

- the planned-break oracle is shared with splat (load_break): an audio set refused
  at load by wam1/1 + acc64 for a rule the direct decode does not make (no layers;
  a header shift or gf of 128 or more no layer uses; a bias of magnitude 2^63 - 1 or
  more; a check range its producer cannot meet, the PCM step's included);
- a generator of WAM1 sets (one-dimensional transposed convolutions and inverse
  GDNs, the last to one channel mostly) and WIA1 clips coded with the crate's rANS
  encoder, t_out one the latent is the shortest for (one case in eight not), with
  escapes, medians at the 2^47 bound, whole channels at the input's check range and
  one past it, and cut, extended or changed streams;
- int_audio_planned_breaks_are_new_refusals: each break on a case the direct decode
  decodes, or refuses with another code.

3000 cases in each fast-kernels step; an hour per profile nightly.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 11:22:43 -04:00
Transaction Science
D2c M3 gate 3: the registry export gives wai.audio.int_codec its ops member
Regenerated by `wai registry export` from codecs::capability_ops.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 11:17:13 -04:00
Transaction Science
D2c M3 gate 2: wai.audio.int_codec decodes through wam1/1 to its golden
int_audio gains the decode through the integer operator set beside the direct one,
which still serves decode_typed (the switch is gate 6):

- int_audio::legacy::decode_typed: the direct decode, moved unchanged (the latent
  decode factored into latent(), shared by both).
- int_audio::ops: decode_typed runs audio_plan (integer-payloads 7's planning, in
  its order), then the synthesis lowered by wam1/1 with the PCM step from the
  parsed model and loaded under acc64 with its certificate, then the stream, then
  the graph through the interpreter with t_out as scalar 0. A check-range refusal
  is field_range; the operator set's other codes map to the payload extension's.
  ops::load is the set as the decode holds it, ops::plan everything before the
  first symbol, ops::decode_loaded the decode after it.
- tests/int_audio_ops.rs: the committed vector, as WIA1 and as its JSON form,
  decodes through the lowering to the direct decode's samples, the PCM SHA-256
  sidecar and the export's FNV-1a; the staged audio base carries the same payload.
- byte-exact-conformance: audio_through_its_lowering_is_golden, the same pinned
  PCM through the lowering, under both kernel paths, on every leg.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 11:11:10 -04:00
Transaction Science
D2c M3 gate 1: wai.audio.int_codec's lowering and certificates, as wai-rs loads them
wam1/1 already lowers both committed audio sets (the conformance vector's and the
synthetic one), and their graphs and certificates are committed. This gate holds
wai-rs to them.

- wai-ops: lower::wam1_net, wam1/1 of a parsed network; wam1() is it over
  parse_wam1 of the bytes.
- wai-rs int_audio::ops::wam1_net: the parsed AudioModel in wai-ops' form; a
  transposed convolution's input channels are its weights' count over its output
  channels and kernel; a field past 32 bits is refused (model_mismatch).
- tests/int_audio_ops.rs (audio_int; named in both fast-kernels steps): each set
  lowers to its committed g_s.whg1 from its bytes and from the parsed model (which
  equals parse_wam1 of the bytes); the certificate is that graph's; the load gives
  acc64 and not acc32; the first acc32 failure is g_s's input range (the vector's
  at 47 bits, as Appendix C predicts) and crop_scalar keeps it out of the npu
  subset; scalar 0 is t_out, [1, 2^26].

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 11:07:02 -04:00
Transaction Science
Merge origin/main (at 86785571, with #243-#246, #250, #252) into wai/d2c-m2-m3
Some checks failed
WAI HTTP delivery / HTTP corpus · falsify patches 0/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 1/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · falsify patches 2/3 (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · every patch and mutation in exactly one shard (pull_request) Has been cancelled
WAI HTTP delivery / HTTP corpus · verified both ways, and the differential (pull_request) Has been cancelled
WAI HTTP delivery / cache rules · controls and labelled caches (pull_request) Has been cancelled
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Has been cancelled
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Has been cancelled
wai-ops integer operators / linux-aarch64 (pull_request) Has been cancelled
wai-ops integer operators / linux-x86_64 (pull_request) Has been cancelled
wai-ops integer operators / macos-arm64 (pull_request) Has been cancelled
wai-ops integer operators / wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
wai-ops integer operators / wasm32 under Node (pull_request) Has been cancelled
wai-ops integer operators / independent checker (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · linux (pull_request) Has been cancelled
wai-pack / wai-pack · macos (pull_request) Has been cancelled
wai-pack / wai-pack · independent verifier (Python) (pull_request) Has been cancelled
wai-pack / wai-pack · the floor through a media prober (pull_request) Has been cancelled
wai-pack / wai-pack · dependency licences (pull_request) Has been cancelled
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Has been cancelled
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Has been cancelled
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Has been cancelled
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Has been cancelled
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Has been cancelled
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Has been cancelled
wai-pack / wai-pack · linux-arm64 (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
wai-quantum WebGPU member / member · discrete GPU, Vulkan (jetson-hub) (pull_request) Has been cancelled
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:58:29 -04:00
Transaction Science
D2c M2 gate 7: the splat decode's guard is its check ranges; the shared guard stays
Gate 7 deletes a decoder's direct guard once its check ranges carry it. For
wai.splat.int_codec that guard is int_hyper_synth::run_net_checked (with
check_layer and igdn_check), and since the switch the production splat decode no
longer reaches it: only the test-only direct decode (int_splat::legacy) calls it.
It cannot go yet: the conditional codec's checked decode (int_hyper, M4) calls it in
production, and int_audio's guard calls igdn_check (M3). Its doc now says which
decoders make these checks as check ranges and which still call it, so M4's gate 7
starts from that list.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:40:04 -04:00
Transaction Science
D2c M2 gate 6: the planned breaks written, the scan of every committed set and payload
Completes the switch (abfbbc6a).

- tests/int_splat_ops.rs needs legacy_int now that the direct decode is test-only
  (required-features), and gains the scan: every committed splat set (the one that
  int-payload-conformance and the staged splat case name) has a layer of tag 0, 1 or
  2, header shifts under 128, no bias of magnitude 2^63 - 1 or more, and lowers and
  loads under acc64; every committed payload (the vector, the refusal fixtures, the
  staged base's) decodes or is refused through the lowering exactly as directly.
- integer-payloads: 2 names the decode its stream rules define (E1, t4097, lenient,
  canonical); 6 cites whm1/1 and the RGB8 step; 7's set rules add the lowering and
  load, its order puts them after g_s's shape and before the stream, and Exactness
  says a lowered network makes its checks as check ranges; 12 lists WIA1 and WIS1
  among the byte-equality goldens (so does int-payload-conformance's README).
- integer-operators: the status note names wai.splat.int_codec; 15.3 item 3 states
  the codes and order of its breaks and the two more the lowering makes.
- SPEC 8's planned breaks and the CHANGELOG entry (the decode, the breaks, the
  interpreter's memory) record them.

Measured (int_payload_cost): with the set loaded, the splat decode holds 325878 bytes
against 344656 declared; with the previous interpreter it held 622992 (1.8 times the
declared bytes, not the 1.6 the previous commit's message estimated).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:15:05 -04:00
Transaction Science
WIP D2c M2 gate 6: wai.splat.int_codec decodes through whm1/1 (text and scan follow)
- int_splat::decode_typed is ops::decode_typed: integer-payloads 7's plan, g_s
  lowered by whm1/1 and loaded under acc64, the stream, then the graph through the
  interpreter with the fast convolutions behind it. The direct decode is
  legacy::decode_typed, test-only (cfg(any(test, feature = "legacy_int"))), and
  run_net_checked is no longer reached from the splat decode outside it.
- ops::decode_loaded: the decode after its plan, from the set's loaded lowering;
  ops::load is public (the set as the decode holds it).
- int_payload::declared_cost for WIS1 runs ops::plan, so a payload the decode
  refuses before its first symbol (the lowering's load included) is refused there
  with the same code.
- tests/int_payload_cost.rs: the set allowance for splat is the set parsed, lowered
  and loaded (payload-independent); and, with the set loaded beforehand, the decode
  holds no more than the declared working bytes.

Landing gate on this tree (with the previous commit): GREEN.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:11:10 -04:00
Transaction Science
wai-ops: a run holds each tensor only until its last reader
So that a capability decoding through the operator set holds, beside its set, no
more than its payload declares (integer-payloads 7, Memory and work), as the
direct decoders did:

- run_inner releases each tensor once the last operator that reads it has run
  (outputs are held to the end and taken, not cloned, unless listed twice);
- run_with takes its data inputs by value, so a decode holds no second copy of
  its input (its one caller, int_ops::run1, passes it); run and run_observed
  keep their signatures;
- conv_transpose's uncropped plane holds i64 rather than i128. Every cell, kept or
  cropped, is at every step a sum of some of one residue's taps, so it lies in
  convT.acc's certified interval, which fits i64 under acc64, the profile every
  loaded graph meets; a term or cell that would leave i64 still refuses
  (model_mismatch), as before for i128.

No output, refusal or certificate changes. Measured on the committed splat set
(int_payload_cost, next commit): with the set loaded, its decode through the
operator set holds what the payload declares, where the interpreter had held every
tensor and an i128 plane, about 1.6 times that.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 10:11:10 -04:00
Transaction Science
D2c M2 gate 5: the fast kernels behind the interpreter, held to it, for the splat set
- int_ops equivalence: the committed splat synthesis through whm1/1 runs both of its
  transposed convolutions on the fast kernel under every fast policy (counted), and
  every attribute byte is the interpreter's. Its inverse GDN runs on the interpreter
  under every policy: the host lends no IGDN kernel (that arm is M4's; the splat
  decode does not need it to be exact).
- tests/int_splat_ops.rs: under the reference kernels and four fast policies (serial
  and threaded) the decode through the lowering gives the same bytes, or the same
  refusal, on the committed vector as WIS1 and as its JSON form, and on clouds with
  a channel moved to the input's check range and one past it, at each end.
- byte-exact-conformance declares splat_int (on by default): it always includes
  int_splat, so the included sources' splat tests run on every leg too.

The per-operator half for conv and conv_transpose (random graphs, every rounding
and bias kind) is M1's int_ops::equivalence::convolutions_equal_the_interpreter.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 09:35:49 -04:00
Transaction Science
D2c M2 gate 4: wai.splat.int_codec's differential against the direct decode
tests/int_ops_differential.rs gains the splat half (the file now needs
legacy_int and splat_int; Cargo.toml's required-features and the nightly
workflow's features say so):

- a planned-break oracle from the set's bytes alone: the set is refused at load
  by whm1/1 + acc64 for a rule the direct decode does not make (no layer of tag
  0, 1 or 2; a header shift or gf of 128 or more no layer uses; a bias of
  magnitude 2^63 - 1 or more, whose predicate fails at 0; a check range its
  producer cannot meet, load step 8). A set refused at load for a rule the plan
  also makes is not a break: both decodes run integer-payloads 7's plan first;
- a generator of WHM1 sets (transposed convolutions, convolutions, inverse
  GDNs, ReLUs, leaky ReLUs; weights, multipliers and biases up to i64's ends)
  and WIS1 clouds coded with the crate's rANS encoder (escapes, medians at and
  past 2^47, whole channels placed at the input's check range or one past it;
  streams cut, extended or changed); outside a break both decode alike or both
  refuse with the same code and the direct decode never panics; under a break
  the decode through the operator set refuses;
- int_splat_planned_breaks_are_new_refusals: each break on a case the direct
  decode decodes, or refuses with another code (field_range after the stream,
  or stream_exhausted where the stream runs out).

3000 cases in each fast-kernels step; an hour per profile nightly.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 09:28:59 -04:00
Transaction Science
D2c M2 gate 3: wai.splat.int_codec's refusal parity, its ops member, SPEC 5's citation
Refusal parity (tests/int_splat_ops.rs):
- every committed wai.splat.int_codec fixture of int-payload-conformance is refused
  by a sink with its code, and each that parses is refused alike, with that code, by
  the decode through the lowering and by the direct decode;
- a fixture for each refusal the direct decode makes, in integer-payloads 7's order,
  each one change from the committed set or cloud (afrac, the per-channel lengths, a
  median, a table, the three caps, a layer's lengths and padding, the attribute
  shape, a stream too short, run out, or with a word unread, latents past layer 0's
  range): both decodes refuse it with the same code, the one section 8 gives;
- at the edge of every check range: each layer of the committed set alone, lowered,
  takes tensor l's range [-X_l, X_l] from the full graph; an input at X_l runs to the
  same output both ways, and one at X_l + 1 is refused by the graph (field_range, input
  0) and by run_net_checked (out of range, that layer).

Registry: codecs::capability_ops gives wai.splat.int_codec {acc64, full, whm1/1,
stage rans64 t4097/lenient/canonical}; registry/capabilities.json regenerated by
`wai registry export`; the unit test names both capabilities. SPEC 5's row cites
integer-payloads 6 and integer-operators 13.2; SPEC 7 names the capability. The
CHANGELOG entry starts (the byte-equality matrix, the ops member).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 03:04:03 -04:00
Transaction Science
D2c M2 gate 2: wai.splat.int_codec decodes through whm1/1 to its golden
int_splat gains the decode through the integer operator set beside the direct one,
which still serves decode_typed (the switch is gate 6):

- int_splat::legacy::decode_typed: the direct decode, moved unchanged (the latent
  decode factored into latent(), shared by both).
- int_splat::ops::decode_typed: splat_plan (integer-payloads 7's planning, in its
  order), then g_s lowered by whm1/1 with the RGB8 step from the parsed model
  (int_ops::whm1_net) and loaded under acc64 with its certificate, then the stream,
  then the graph through the interpreter (int_ops::run1). A check-range refusal is
  field_range; the operator set's other codes map to the payload extension's.
  ops::plan is everything before the first symbol.
- tests/int_splat_ops.rs: the committed vector (int-payload-conformance's index),
  as WIS1 and as its JSON form, decodes through the lowering to the direct decode's
  bytes, the SHA-256 sidecar and the export's FNV-1a; the staged splat base carries
  the same payload.
- byte-exact-conformance: splat_through_its_lowering_is_golden, the same pinned
  attribute SHA-256 through the lowering, under both kernel paths, on every leg.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:52:01 -04:00
Transaction Science
D2c M2 gate 1: wai.splat.int_codec's lowering and certificate, as wai-rs loads them
whm1/1 already lowers the splat set and its graph and certificate are committed
(ops-conformance/certificates/wai.splat.int_codec/033a37c9...). This gate holds
wai-rs to them.

- wai-ops: lower::whm1_net, whm1/1 of a network already parsed; whm1() is it
  over parse_whm1 of the bytes.
- wai-rs int_ops::whm1_net: the model this crate parses (IntModel) in the form
  wai-ops lowers it from. A layer's input channels, which IntModel does not
  keep, are its weights' count over its other dimensions; an inverse GDN's are
  its beta's count; a field past 32 bits is refused (model_mismatch).
- tests/int_splat_ops.rs (splat_int; named in both fast-kernels steps): the
  committed set lowers to its committed g_s.whg1 from its bytes and from the
  parsed model (which equals parse_whm1 of the bytes); the certificate is that
  graph's; the load gives acc64 and not acc32; the certificate's verdict and
  first acc32 failure (g_s input 0, range, 44 bits) are Appendix C's, and the
  input's check range is X_0 = 5632249656115.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:45:43 -04:00
Transaction Science
byte-equality: wai.audio.int_codec and wai.splat.int_codec on every leg
The cross-architecture matrix did not compile int_audio.rs or int_splat.rs, so
neither capability's PCM or attribute bytes were checked anywhere but the dev
host. byte-exact-conformance now includes both, and int_codec_golden parses the
committed WIA1 and WIS1 payloads with the sink's wire parser and decodes them,
under the reference and the fast kernels, to the pinned digests: PCM SHA-256
4b0344c8... (FNV-1a e5ff66ad1b86117c), attributes SHA-256 f07679de...; the JSON
forms decode to the same bytes. The payloads are pinned by their SHA-256.

int_audio's own plan test reads its vector through ../wai-rs so the path holds in
both crates, and the crate re-exports its wire parser as int_wire, the name
int_audio's test uses. wai-byte-equality.yml fires on both sources and both
vector directories.

This lands before either decoder moves onto the integer operator set (D2c M2,
M3), so their goldens run on linux, linux-arm64 and macos before anything changes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 02:38:13 -04:00