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]>
64 lines
3.9 KiB
HTML
64 lines
3.9 KiB
HTML
<!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>
|