open-standards/wai/changes/2026-11-04-integer-decode-paths-hold-no-floating.md
Transaction Science e8f8e00337
All checks were successful
joule-moq-remote host agent / joule-moq-remote · does this change touch it (pull_request) Successful in 7s
joule-moq-room room service / joule-moq-room · does this change touch it (pull_request) Successful in 13s
joule-moq-web browser client / joule-moq-web · does this change touch it (pull_request) Successful in 8s
wai-app and Create / wai-app · does this change touch it (pull_request) Successful in 8s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 15s
wai-audit collector and player integration / does this change touch it (pull_request) Successful in 7s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 7s
wai cross-architecture byte-equality / does this change touch it (pull_request) Successful in 13s
WAI operation catalogue / does this change touch it (pull_request) Successful in 7s
WAI energy receipts / does this change touch it (pull_request) Successful in 8s
WAI examples / WAI examples · does this change touch them (pull_request) Successful in 6s
WAI conformance / does this change touch it (pull_request) Successful in 13s
wai formal verification (integer core) / does this change touch it (pull_request) Successful in 5s
wai-fleet service / does this change touch it (pull_request) Successful in 8s
wai-key-proxy / does this change touch it (pull_request) Successful in 6s
WAI JPEG-AI whole decode (pinned inputs, required) / does this change touch it (pull_request) Successful in 12s
wai-ledger service / does this change touch it (pull_request) Successful in 7s
WAI neural sink gates / does this change touch it (pull_request) Successful in 5s
wai-pack / wai-pack · does this change touch it (pull_request) Successful in 7s
wai-quantum for JavaScript / does this change touch it (pull_request) Successful in 6s
wai-quantum studio and desktop / does this change touch it (pull_request) Successful in 7s
wai-ops-gpu integer operators on GPUs / does this change touch it (pull_request) Successful in 15s
wai-sink-android native sink library / does this change touch it (pull_request) Successful in 6s
wai-sink-swift native sink package / does this change touch it (pull_request) Successful in 7s
WAI Studio / does this change touch it (pull_request) Successful in 5s
wai-web reach builds / wai-web reach · does this change touch it (pull_request) Successful in 5s
WAI mbt2018_mean integer decode (regenerated vectors) / does this change touch it (pull_request) Successful in 13s
wai-web wasm32 / does this change touch it (pull_request) Successful in 7s
WAI conformance / fast integer kernels, every x86_64 kernel set (AVX-512 silicon) (pull_request) Successful in 3m44s
wai-app and Create / wai-app · tests, clippy, the line language's verifier (linux) (pull_request) Successful in 36s
wai cross-architecture byte-equality / linux-x86_64 (pull_request) Successful in 36s
wai-audit collector and player integration / collector · linux (pull_request) Successful in 1m43s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Successful in 1m56s
wai formal verification (integer core) / kani (isqrt512) (pull_request) Successful in 27m8s
WAI conformance / faces from keypoints under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m39s
wai formal verification (integer core) / every harness in one shard (pull_request) Successful in 12s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 1m10s
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Successful in 4m2s
WAI operation catalogue / the catalogue and every door · linux (pull_request) Successful in 5m45s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (pull_request) Successful in 7m11s
WAI examples / WAI examples · portable · linux (pull_request) Successful in 8m18s
wai formal verification (integer core) / kani (stage) (pull_request) Successful in 3m36s
wai-key-proxy / proxy · linux (pull_request) Successful in 1m10s
wai-ledger service / service · linux (pull_request) Successful in 2m4s
WAI neural sink gates / model-free refusals of the neural sink (pull_request) Successful in 1m48s
wai-fleet service / service · linux (pull_request) Successful in 5m19s
wai formal verification (integer core) / kani (integer-core) (pull_request) Successful in 7m0s
wai formal verification (integer core) / kani (rans64-t2) (pull_request) Successful in 10m40s
WAI neural sink gates / the exact JPEG-AI decoder reports its path (pinned inputs, required) (pull_request) Successful in 2m12s
wai-pack / wai-pack · linux (pull_request) Successful in 1m58s
wai formal verification (integer core) / kani (arith) (pull_request) Successful in 10m50s
WAI JPEG-AI whole decode (pinned inputs, required) / fetch pinned JPEG-AI inputs → whole decode + pixel hash, required (pull_request) Successful in 5m53s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 59s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 15m28s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 3m58s
wai-ops-gpu integer operators on GPUs / builds · no adapter is not a pass (linux) (pull_request) Successful in 3m23s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 3m1s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 17m13s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 6m21s
wai-quantum studio and desktop / desktop app · linux (pull_request) Successful in 5m39s
wai-quantum studio and desktop / desktop app · windows (pull_request) Successful in 9m36s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 4m35s
wai formal verification (integer core) / kani (plan) (pull_request) Successful in 18m17s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m55s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m37s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 2m4s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m5s
wai formal verification (integer core) / kani (stage-long) (pull_request) Successful in 20m6s
wai formal verification (integer core) / kani (sound) (pull_request) Successful in 28m7s
joule-moq-remote host agent / joule-moq-remote, every target (macos) (pull_request) Successful in 59s
joule-moq-remote host agent / joule-moq-remote, every target (linux-arm64) (pull_request) Successful in 1m15s
joule-moq-room room service / joule-moq-room, every target (pull_request) Successful in 3m50s
wai cross-architecture byte-equality / linux-aarch64 (pull_request) Successful in 49s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 6m16s
wai-app and Create / wai-app · Create, browser end-to-end (macos) (pull_request) Successful in 7m47s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 7m26s
wai-audit collector and player integration / collector, player integration and the browser end to end · macos (pull_request) Successful in 2m1s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 25s
wai cross-architecture byte-equality / macos-arm64 (reference) (pull_request) Successful in 34s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 13m23s
joule-moq-web browser client / joule-moq-web · browser end-to-end (macos) (pull_request) Successful in 22m1s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 13s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 30s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 8m13s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 1m58s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 13m35s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 37s
wai-pack / wai-pack · linux-arm64 (pull_request) Successful in 2m10s
WAI conformance / codec wrappers · fuzz smoke, text decode limits, C entry points, provenance, the semantic path (pull_request) Successful in 1m14s
wai-fleet service / service · macos (pull_request) Successful in 46s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 19m28s
wai-ledger service / service · macos (pull_request) Successful in 1m8s
wai-pack / wai-pack · the floor through a media prober (pull_request) Successful in 22s
wai-pack / wai-pack · dependency licences (pull_request) Successful in 17s
wai-pack / wai-pack · macos (pull_request) Successful in 2m28s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m46s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 12m58s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 3m29s
wai-pack / wai-pack · independent verifier (Python) (pull_request) Successful in 7m30s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Successful in 14m5s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 4m57s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 15m46s
wai-ops-gpu integer operators on GPUs / Metal GPU and browser WebGPU (macos) (pull_request) Successful in 10m40s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 11m35s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 10m40s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h30m4s
wai/det-source-fixes, converted to the layout of the fix: no shared append point
The change of wai/det-source-fixes (152aab5c7..9c4159958, 15 commits), on the fix branch: its
changelog entries as files of wai/changes/, its wai-conformance.yml edits as step files,
corpus files and test tags, and every other file as the branch has it.

- a5bb23634 wai-rs: the inverse GDN's integer roots take no floating point
- b9463b4d0 wai-rs: the splat ranges and JSON form are read in integer arithmetic
- b20be5196 wai-rs: int_entropy's scale conversions are formed in integers
- 437669081 wai-rs: a test that the integer decode paths hold no floating point
- 36aade4f1 wai: the integer decode paths without floating point, in the changelog and integer-payloads §10
- f781bf091 wai-rs: the AVX-512 root's comment states the bound s + bit keeps
- 799ab8476 wai-rs: float_free reads the other integer entropy decoders too
- b79447e64 wai-rs: splat ranges one last digit apart decode to adjacent values
- 43f75cc36 wai: the changelog names the decoders float_free reads and the last-digit pairs
- 2e308fd28 wai-rs: the parameter sets' JSON is read by the strict reader
- 42f848583 wai-rs: int_payload re-exports Binary32
- d1dbe4936 wai-rs: float_free reads the operator set, every integer module, and serde_json's parser
- 931699331 wai: the parameter sets' JSON read strictly, in integer-payloads §9 and §14 and the changelog
- 97d133380 wai-rs: float_free names what a decode reaches beyond what it reads
- 9c4159958 wai: the changelog names the general JSON reader once

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 01:45:32 -05:00

7.1 KiB
Raw Permalink Blame History

The integer decode paths hold no floating point in their source, and read no JSON with a float parser

The integer square root of the inverse GDN, the splat codec's ranges and JSON form, and int_entropy's scale conversions no longer use floating point; the decode reads a parameter set's JSON with the strict reader, which converts no number to a float; and a test of the sources keeps the integer decode paths, and the operator set they run their networks through, free of floating point and of a float parser. No payload, corpus or decoded output changes: the integer corpora regenerate byte for byte, on arm64 macOS and x86_64 Linux. The test reads source, not a compiled decode.

  • The inverse GDN's root. The narrow kernel sets seeded each integer square root from the IEEE-754 square root ((n as f64).sqrt()), and the AVX-512 kernel took eight at a time with a vector square root; the integer correction after each decided the result. The seed is now a fixed-point reciprocal square root (a table on the norm's top bits and two Newton steps, formed exactly in u64 and u128), within one of the root, and the AVX-512 roots are taken digit by digit in integer lanes. The roots are the same integers. The test holds the root to its definition, an independent digit-by-digit root and u64::isqrt on the edges of u64 (0, 1, every k² − 1, k² and k² + 1 around the powers of two and across the range, u64::MAX), and an ignored test checks every boundary k² − 1, k² for k below 2^32.
  • WIS1 ranges are read, checked and written as binary32 bits (int_payload::wire::Binary32): finite, and lo ≤ hi as IEEE 754 compares two finite values (−0 equal to +0), in integer arithmetic. The rule (integer-payloads §6) is unchanged; a test holds it to the float comparison on every class of bit pattern.
  • The splat JSON form (splat.json) is read from its text with the strict JSON reader: its integers as integer spellings, and each range by int_splat::binary32_of in exact integer arithmetic (integer-payloads §10, which now says how a number denotes a binary32 value). A number spelled as an integer is that integer, any other spelling denotes the binary64 value nearest it, and either must be a binary32 value; this is how the independent converter, int_payload_verify.py, reads a number. The reader before went through serde_json, whose float reading is correctly rounded only with its float_roundtrip feature (which splat_int turned on for the whole crate, and the byte-equality crate never had), and it disagreed with the independent converter in two places: it kept the sign of the integer -0 (zero, so +0), and it rounded an integer past u64 (refused unless it is a binary32 value). A range one digit from the binary64 tie between 1 and the next binary64 value now reads as binary64 rounds it on each side of the tie, with a test, which also holds two spellings one last digit apart (4194304.0 and 4194304.5, 8.388608e6 and 8.388609e6) to the two adjacent values the payload's decode presents. The JSON decode refuses a range that is not a binary32 value, as the converter always did, and the text is read strictly (a member named twice, or bytes after the value, refuse it). splat_int no longer turns on float_roundtrip; splat_exact, which reads an asset's POSITION bounds as JSON numbers, does.
  • int_entropy::fixed_scale_edges and quantize_scale form ⌊x·2^frac⌋ from the binary32 bits in integers, the values the binary64 product and its floor gave, which a test checks at every exponent and every frac.
  • The parameter sets' JSON (entropy.json of wai.neural.int_hyper and wai.video.int_hyper, integer-payloads §9, and a WMB1 bundle's tables, §14) is read by the strict JSON reader, each integer from its spelling. The general JSON reader the crate depends on (serde_json) read it before: its number parser is binary64 code, which ran on a fraction, an exponent or an integer past u64 before the integer reads refused them, so a decoder built into a module with no floating point could not hold it. §9 now says how the text is read, and two readings change: -0 is zero, as §9's integer rule already gave (the general reader read it as a float, and the set was refused), and a member named twice, or a value more than 64 levels deep, refuses the set (model_mismatch), where the general reader kept the last of two members and read deeper values. The committed sets read as before, with tests of each reading through decode_int and through a WMB1 bundle.
  • A test of the sources (float_free) fails on a floating-point type, literal or vector intrinsic in any module on the integer decode paths, outside its tests and model-checker harnesses: the kernels, the operator-set bridge, the payloads, the integer codecs, the rANS coder and its bucketing, the strict JSON reader, and the other integer entropy decoders and the decodes built on them (JPEG AI's mANS decoder, WIR1, the NNC tensor's arithmetic decoder and its tensor decode, dred-int/1 but its floating-point reference and measurement, and wai.avatar.face); in every file of the operator set (wai-ops); and on a call of the general reader's parser in those modules, but two that are not decodes: the direct int_synth decode kept for the differential tests, and the face verifier's read of an envelope's manifest. Every int_* file, and every file under int_kernels/ and int_payload/, must be among those it reads, so a new one fails it until it is listed. The tools' JSON forms (from_value, the *_from_json converters) still take a serde_json::Value; they are converters, not decodes. Outside these paths, exact_tonemap's ST 2094-50 reader still forms binary64 slopes for its measurement, beside the Q30 slopes its integer derivation uses.
  • Breaking: api:rust:wai::int_payload::IntDecoded::Attr: its ranges are (Binary32, Binary32) pairs, the bits the payload carries, so the decode forms no float. A sink presenting a range takes f32::from_bits(r.0). Binary32 is re-exported as int_payload::Binary32.
  • Breaking: api:rust:wai::int_payload::wire::Wis1::ranges, and so wire::parse_wis1's result and wire::write_wis1's argument: (Binary32, Binary32) bits, where they were (f32, f32). Build one with Binary32(x.to_bits()) and read it with f32::from_bits(b.0).
  • Breaking: api:rust:wai::int_hyper_synth::CondEntropy::try_from_value: replaced by CondEntropy::read, which takes the file's bytes and reads them as a set's decode does, so no float parser reads the tables first. Call it with entropy.json's bytes in place of a parsed value.
  • Breaking: api:rust:wai::int_splat::SplatJson::ranges: the binary32 values lo and hi denote, as (Binary32, Binary32), where they were (f64, f64) as a float parser read them.
  • Breaking: api:rust:wai::int_splat::SplatJson::from_value, api:rust:wai::int_splat::decode and api:rust:wai::int_payload::wis1_from_json: the JSON form is read from its text, so no float parser reads it first. Call SplatJson::read, decode and wis1_from_json with the file's bytes in place of a parsed value.