open-standards/wai/wai-web/demo/int_synth.html
Transaction Science fb103ac5ae wai: one registry table, candidate capabilities, public-text checks
Every registered string now lives in one table (codecs/registry.rs) with
its kind, status, media class, registering SPEC section, edition and
registration date. `wai registry export` writes registry/capabilities.json,
its JSON Schema, the generated table in REGISTRY.md and vocab v2; --check
fails on drift. vocab v1 stays stable.

A candidate capability (a registered string whose payload format no
revision has pinned) must not be emitted. The C packers, the browser
writers and `wai wrap` refuse one, and `codecs::is_dispatchable` is the
single dispatch and selection predicate (SPEC §4): candidates,
companion-only capabilities, records and derivations are not
dispatchable, and an unregistered string is decoded only where the sink
advertises it.

The codec glossary is linked to the registry through a reviewed table and
held to its schema by a library test; `org` becomes `body`, from a closed
allowlist. The SPEC gains §5 sections on kinds and candidates, a §8
edition rule, corrected citations and rewritten appendices. The
quantum-ops vectors are regenerated with neutral device ids.

CI declares the feature-gated test targets with required-features, checks
the registry export, builds wai-web for wasm32, and runs two public-text
checks (comparative prose, and private name patterns) with a self-test.
The specification, extensions, research notes, READMEs, glossary and
source comments are rewritten to name no company or product and to make
no comparisons.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-30 22:38:09 -04:00

64 lines
3.9 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WAI — integer-exact neural image sink</title>
<style>
:root { --bg:#06080c; --bg2:#0d1117; --border:#1e2736; --text:#e6edf5; --text2:#8b99ad; --text3:#4a5568; --g:#00e5a0; --w:#f0b429; --mono:'JetBrains Mono','SF Mono',Menlo,monospace; }
* { box-sizing:border-box; margin:0; padding:0; }
body { background:var(--bg); color:var(--text); font-family:var(--mono); padding:24px; }
h1 { font-size:15px; letter-spacing:.04em; margin-bottom:4px; } h1 em { font-style:normal; color:var(--g); }
.sub { font-size:11px; color:var(--text2); margin-bottom:14px; max-width:880px; line-height:1.5; }
code { color:var(--w); }
.bar { display:flex; gap:10px; align-items:center; margin-bottom:10px; flex-wrap:wrap; }
select { background:var(--bg2); color:var(--text); border:1px solid var(--border); border-radius:6px; padding:6px 12px; font-family:var(--mono); font-size:12px; cursor:pointer; }
select:hover { border-color:var(--g); }
canvas { background:#04060a; border:1px solid var(--border); border-radius:10px; display:block; image-rendering:pixelated; }
.hud { display:flex; gap:22px; margin-top:10px; font-size:11px; color:var(--text2); flex-wrap:wrap; }
.hud b { color:var(--text); } .hash { color:var(--g); }
#badge { font-size:12px; padding:4px 12px; border-radius:99px; display:none; }
#badge.ok { display:inline-block; background:rgba(0,229,160,.12); color:var(--g); border:1px solid rgba(0,229,160,.5); }
#badge.bad { display:inline-block; background:rgba(255,107,107,.12); color:#ff6b6b; border:1px solid rgba(255,107,107,.5); }
.note { margin-top:14px; font-size:10.5px; color:var(--text3); max-width:880px; line-height:1.55; }
.note b { color:var(--text2); }
</style>
</head>
<body>
<h1>WAI <em>integer-exact neural image</em> — in-browser, no ML runtime</h1>
<p class="sub">
A <code>wai.neural.int_synth</code> payload arrived: int8 latents + a model spec. This tab decodes it
to RGB with the <b>same pure-i64 Rust</b> that decodes natively, compiled to wasm32 — <b>no
onnxruntime-web, no WebGPU, no float anywhere</b>. Because the decode is integer all the way down
(the integer-entropy contract), the reconstruction is byte-identical on every machine, so the page
re-checks its BLAKE3 against the hash the native reference froze into
<code>neural-conformance/expected_hashes.json</code> — a learned-codec image verified client-side,
no server round-trip.
</p>
<div class="bar">
<select id="vec">
<option value="photo">photo — real trained model, 128×128, 4 layers (PSNR 21.6 dB)</option>
<option value="facade">facade — 72×72, 3 layers</option>
<option value="gradient">gradient — 38×38, 2 layers</option>
<option value="bloom">bloom — 18×18, 1 layer</option>
</select>
<span id="badge"></span>
</div>
<canvas id="c" width="512" height="512"></canvas>
<div class="hud">
<span>image <b id="dims">—</b></span>
<span>latent channels <b id="inch">—</b></span>
<span>synthesis layers <b id="layers">—</b></span>
<span>decoded hash <b class="hash" id="got">—</b></span>
<span>frozen hash <b class="hash" id="want">—</b></span>
</div>
<p class="note">
<b>Why integer synthesis:</b> a float learned decode can round differently on another platform, and a
drift of ~1e-5 in the entropy scale desyncs it, so its decode is reproducible only on the same build —
its reconstruction cannot go in a receipt. <code>int_synth</code> is integer all the way down, so
the hash above is portable: this browser, a native sink, and the conformance corpus all produce the
same bytes. The wire carried latents + weights; your device produced the exact image, and proved it.
</p>
<script type="module" src="int_synth.js"></script>
</body>
</html>