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
Owner

D2c, third decoder: wai.audio.int_codec decodes through the integer operator set wai-ops/1 (integer-operators, Draft). Every committed golden is byte-identical. The audio synthesis is lowered by wam1/1 (§13.3, with its PCM step) and loaded with its certificate, and the interpreter runs it with t_out as its scalar and the fast transposed convolutions behind it, held to it. The direct decode remains only as a test oracle.

Stacked on #257 (wai.splat.int_codec, M2): this branch merges wai/d2c-m2-m3 at 3bd4d566, so until #257 lands its diff includes M2's commits. Review from 064b8ef8 on; the M3 commits are listed below.

The seven gates, each in its own commit

  1. Lowering and certificates (064b8ef8). wai-ops gains lower::wam1_net; wai-rs gains int_audio::ops::wam1_net, the parsed AudioModel in wai-ops' form. Both committed audio sets (the conformance vector's and the synthetic one) lower to their committed graphs from their bytes and from the parsed model. Loading gives the certificates' verdicts: acc64, not acc32, first failing at g_s's input range (the vector's at 47 bits, as Appendix C predicted), with the PCM step's scalar crop keeping it out of the accelerator subset. New test tests/int_audio_ops.rs.
  2. Golden equality (4a19f1eb). int_audio::ops::decode_typed decodes through the lowering; the direct decode becomes int_audio::legacy. The committed vector, as WIA1 and as its JSON form, gives the direct decode's samples, the PCM SHA-256 sidecar 4b0344c8… and the export's FNV-1a e5ff66ad1b86117c. byte-exact-conformance gains the golden through the lowering.
  3. Refusal parity (78d60107, dc51cade). Every committed audio fixture keeps its code both ways. Twenty-six more, one for each refusal the direct decode makes in integer-payloads §5 and §7's order, are refused alike. At the edge of every check range of the committed set, a clip at ±X_ℓ decodes to the same samples both ways and one past it is refused both ways; so is the PCM step's range, at its top and bottom. Also: the registry ops member (acc64, full, wam1/1, rans64 t4097/lenient/canonical), SPEC §5 and §7, and the CHANGELOG entry.
  4. Differential (dc59a0cb). The audio half of tests/int_ops_differential.rs, with the planned-break oracle shared with splat: random WAM1 sets and WIA1 clips (escapes, medians at the 2^47 bound, whole channels at the input's check range and one past it, t_out the latent is shortest for and not, cut or extended streams). A planned-breaks test shows each break, the PCM step's among them. 3000 cases per push; the nightly runs an hour per profile (--features legacy_int,splat_int,audio_int).
  5. Fast kernels behind the interpreter (51810ba1, 457ba5b0). The committed synthesis's four transposed convolutions run on the fast kernel under every fast policy, counted, and give the interpreter's samples; the decode gives the same samples or refusal under the reference and four fast policies. int_audio's equivalence of its fast one-dimensional kernel with its scalar one is retargeted at the interpreter (random convolutions of wam1/1's shape). The inverse GDNs and the PCM step run on the interpreter; the host lends no IGDN kernel, and the audio decode does not need one.
  6. The switch (67fa63e4, 4ba5eb5c).
    • int_audio::decode_typed decodes through the lowering; the direct path and its helpers are cfg(any(test, feature = "legacy_int")). int_payload::declared_cost runs the same pre-stream plan, lowering included.
    • With its set loaded, the decode holds no more than the payload's declared working bytes (1,312,099 against 1,312,704; the interpreter's memory change is #257's).
    • The planned breaks are written down (integer-payloads §5, §7; integer-operators §15.3 item 3 and its status note; SPEC §8; CHANGELOG), as for splat, the PCM step's range among the check ranges a producer must meet.
    • The scan: both committed audio sets and every committed WIA1 payload (the vector, the fourteen fixtures, the staged base) are unaffected.
  7. Deletion (9474a402, 90a6f64e). The direct path's fast dispatch conv_t_1d and its equivalence tests go; the guard layer_in_range lives only in the test-only direct decode, which runs the scalar kernel. The dispatch's edge-geometry cases move into tests through the lowered graph under every policy: any stride a WAM1 field holds, an uncropped length past the cap, padding past the fast kernels' pad factor, and an input that could overflow, refused by its check range.

Merges: 3df705dd (#257's branch), 5b74b05b (main at 5d4ae64c; CHANGELOG kept both sides).

Falsifications (each shown red, then green after restore)

gate fault caught by
1 the conversion drops output padding the conversion-equals-parse check
2 igdn sums first, then shifts once (the row the audio golden carries) the golden-equality test; the byte-exact golden through the lowering (splat's survive, as predicted)
2 rq floor → half_up the golden-equality test, gate 1's graph bytes, the byte-exact golden through the lowering
3 the check bound X_ℓ + 1; the PCM range one too high the edge test, each case
4 a padding fault only random sets reach (pad.min(2); the committed set's paddings are 2) the differential; gates 1–3 stay green
5 every channel requantised with channel 0's parameters the per-operator tests (both convolution equivalences) and the per-decoder tests
6 igdn sums first, after the switch both byte-exact audio goldens, including the file-based one; tests/int_audio.rs; int_kernels_vectors::int_audio_clip; the corpus verify
6 the decode keeps a copy of its latent the cost test ("held 1377635, declared 1312704")
7 the test-only guard disabled the tests against the direct decode fail; the production audio tests stay green

Checks at the head (build host)

  • The landing gate on the merged head: GREEN.
  • On the merged head too: the release fast-kernels step; wai-ops tests in debug and release; wai-verify vectors verify; wai_ops_check.py; wai-web's native tests; wai-web built for wasm32, whose WIA1 and WIS1 decodes under Node give the native sidecars' SHA-256; the int_synth wasm corpus check; the registry export check.
  • The differential ran 300 s per profile with no disagreement: 141,531 cases in debug and 7,949,960 in release.
  • Repository checks pass: comparative prose, vanity metrics, public names (private list), section references, lockfiles, orphan sources, tests-in-CI, workflow concurrency and the path-filter self-test.

Not in this PR

  • The IGDN host kernel, and run_net_checked's last production caller (the conditional codec): M4.
  • The per-decode cost of lowering and loading a set (an O23 note for M4).

🤖 Generated with Claude Code

D2c, third decoder: `wai.audio.int_codec` decodes through the integer operator set `wai-ops/1` ([integer-operators](wai/extensions/integer-operators.md), Draft). Every committed golden is byte-identical. The audio synthesis is lowered by `wam1/1` (§13.3, with its PCM step) and loaded with its certificate, and the interpreter runs it with `t_out` as its scalar and the fast transposed convolutions behind it, held to it. The direct decode remains only as a test oracle. **Stacked on #257** (`wai.splat.int_codec`, M2): this branch merges `wai/d2c-m2-m3` at `3bd4d566`, so until #257 lands its diff includes M2's commits. Review from `064b8ef8` on; the M3 commits are listed below. ## The seven gates, each in its own commit 1. **Lowering and certificates** (`064b8ef8`). wai-ops gains `lower::wam1_net`; wai-rs gains `int_audio::ops::wam1_net`, the parsed `AudioModel` in wai-ops' form. Both committed audio sets (the conformance vector's and the synthetic one) lower to their committed graphs from their bytes and from the parsed model. Loading gives the certificates' verdicts: `acc64`, not `acc32`, first failing at `g_s`'s input range (the vector's at 47 bits, as Appendix C predicted), with the PCM step's scalar crop keeping it out of the accelerator subset. New test `tests/int_audio_ops.rs`. 2. **Golden equality** (`4a19f1eb`). `int_audio::ops::decode_typed` decodes through the lowering; the direct decode becomes `int_audio::legacy`. The committed vector, as `WIA1` and as its JSON form, gives the direct decode's samples, the PCM SHA-256 sidecar `4b0344c8…` and the export's FNV-1a `e5ff66ad1b86117c`. byte-exact-conformance gains the golden through the lowering. 3. **Refusal parity** (`78d60107`, `dc51cade`). Every committed audio fixture keeps its code both ways. Twenty-six more, one for each refusal the direct decode makes in integer-payloads §5 and §7's order, are refused alike. At the edge of every `check` range of the committed set, a clip at `±X_ℓ` decodes to the same samples both ways and one past it is refused both ways; so is the PCM step's range, at its top and bottom. Also: the registry `ops` member (`acc64`, `full`, `wam1/1`, `rans64` t4097/lenient/canonical), SPEC §5 and §7, and the CHANGELOG entry. 4. **Differential** (`dc59a0cb`). The audio half of `tests/int_ops_differential.rs`, with the planned-break oracle shared with splat: random `WAM1` sets and `WIA1` clips (escapes, medians at the 2^47 bound, whole channels at the input's check range and one past it, `t_out` the latent is shortest for and not, cut or extended streams). A planned-breaks test shows each break, the PCM step's among them. 3000 cases per push; the nightly runs an hour per profile (`--features legacy_int,splat_int,audio_int`). 5. **Fast kernels behind the interpreter** (`51810ba1`, `457ba5b0`). The committed synthesis's four transposed convolutions run on the fast kernel under every fast policy, counted, and give the interpreter's samples; the decode gives the same samples or refusal under the reference and four fast policies. int_audio's equivalence of its fast one-dimensional kernel with its scalar one is retargeted at the interpreter (random convolutions of `wam1/1`'s shape). The inverse GDNs and the PCM step run on the interpreter; the host lends no IGDN kernel, and the audio decode does not need one. 6. **The switch** (`67fa63e4`, `4ba5eb5c`). - `int_audio::decode_typed` decodes through the lowering; the direct path and its helpers are `cfg(any(test, feature = "legacy_int"))`. `int_payload::declared_cost` runs the same pre-stream plan, lowering included. - With its set loaded, the decode holds no more than the payload's declared working bytes (1,312,099 against 1,312,704; the interpreter's memory change is #257's). - The planned breaks are written down (integer-payloads §5, §7; integer-operators §15.3 item 3 and its status note; SPEC §8; CHANGELOG), as for splat, the PCM step's range among the `check` ranges a producer must meet. - The scan: both committed audio sets and every committed `WIA1` payload (the vector, the fourteen fixtures, the staged base) are unaffected. 7. **Deletion** (`9474a402`, `90a6f64e`). The direct path's fast dispatch `conv_t_1d` and its equivalence tests go; the guard `layer_in_range` lives only in the test-only direct decode, which runs the scalar kernel. The dispatch's edge-geometry cases move into tests through the lowered graph under every policy: any stride a `WAM1` field holds, an uncropped length past the cap, padding past the fast kernels' pad factor, and an input that could overflow, refused by its check range. Merges: `3df705dd` (#257's branch), `5b74b05b` (main at `5d4ae64c`; CHANGELOG kept both sides). ## Falsifications (each shown red, then green after restore) | gate | fault | caught by | |---|---|---| | 1 | the conversion drops output padding | the conversion-equals-parse check | | 2 | `igdn` sums first, then shifts once (the row the audio golden carries) | the golden-equality test; the byte-exact golden through the lowering (splat's survive, as predicted) | | 2 | `rq` floor → half_up | the golden-equality test, gate 1's graph bytes, the byte-exact golden through the lowering | | 3 | the check bound `X_ℓ + 1`; the PCM range one too high | the edge test, each case | | 4 | a padding fault only random sets reach (`pad.min(2)`; the committed set's paddings are 2) | the differential; gates 1–3 stay green | | 5 | every channel requantised with channel 0's parameters | the per-operator tests (both convolution equivalences) and the per-decoder tests | | 6 | `igdn` sums first, after the switch | both byte-exact audio goldens, including the file-based one; `tests/int_audio.rs`; `int_kernels_vectors::int_audio_clip`; the corpus verify | | 6 | the decode keeps a copy of its latent | the cost test ("held 1377635, declared 1312704") | | 7 | the test-only guard disabled | the tests against the direct decode fail; the production audio tests stay green | ## Checks at the head (build host) - The landing gate on the merged head: GREEN. - On the merged head too: the release fast-kernels step; wai-ops tests in debug and release; `wai-verify vectors verify`; `wai_ops_check.py`; wai-web's native tests; wai-web built for wasm32, whose `WIA1` and `WIS1` decodes under Node give the native sidecars' SHA-256; the int_synth wasm corpus check; the registry export check. - The differential ran 300 s per profile with no disagreement: 141,531 cases in debug and 7,949,960 in release. - Repository checks pass: comparative prose, vanity metrics, public names (private list), section references, lockfiles, orphan sources, tests-in-CI, workflow concurrency and the path-filter self-test. ## Not in this PR - The IGDN host kernel, and `run_net_checked`'s last production caller (the conditional codec): M4. - The per-decode cost of lowering and loading a set (an O23 note for M4). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
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]>
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]>
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]>
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]>
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]>
- 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]>
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]>
- 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]>
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]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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]>
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
b9b594d0f5
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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]>
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]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Regenerated by `wai registry export` from codecs::capability_ops.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
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]>
- 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]>
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
60b6e593ce
# Conflicts:
#	wai/CHANGELOG.md
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]>
- 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]>
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]>
- 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]>
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]>
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
3bd4d56637
# Conflicts:
#	wai/CHANGELOG.md
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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
5b74b05b0f
Co-Authored-By: Claude Opus 5.5 <[email protected]>

# Conflicts:
#	wai/CHANGELOG.md
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!264
No description provided.