code wiki / _hdl_build / nx_emu_exceed_gate.nx

nx_emu_exceed_gate.nx source

↩ module page · 149 lines · 8762 B

1// nx_emu_exceed_gate.nx -- R0.5 gate: proves the emulator exceed census is MEASURED + HONEST, not self-scored. 2// Measures the real wasm size, verifies no EXCEED row lacks evidence, confirms the panel is honest (carries 3// PARITY + BEHIND rows), and a NEG-CONTROL proves the liar-kill catches a fabricated unevidenced EXCEED. 4// 5// Operator directive (2026-06-20): "stop using tsv, nishi ecosystem only." The exceed census panel now 6// lives on the NATIVE content-addressed seg_store (via nx_native_config), authored BY THIS GATE into a 7// fresh /tmp store each run (self-contained -- the panel is read only here), then read back through ncfg 8// and rebuilt into the TAB/newline buffer that the (unchanged) nx_emu_audit consumes. No TSV, no SQL. 9import "nx_syscalls.nx" 10import "nx_gate_emit_lib.nx" 11import "nx_emu_exceed.nx" 12import "nx_native_config.nx" 13import "nx_gate_verdict.nx" 14 15func cat(dst: *u8, off: i64, s: *u8) -> i64 { 16 var o: i64 = off 17 var i: i64 = 0 18 while s[i] != 0 as u8 { dst[o] = s[i]; o = o + 1; i = i + 1 } 19 return o 20} 21 22// fresh unique native store prefix per run (epoch-stamped, like nx_library_exceed). 23func emu_fresh_prefix(out: *u8, base: *u8) -> i64 { 24 var po: i64 = 0 25 while base[po] != (0 as u8) { out[po] = base[po]; po = po + 1 } 26 var m: i64 = sys_now_ms() 27 let ds: *u8 = sys_mmap(28) 28 var k: i64 = 0 29 if m == 0 { ds[0] = 48 as u8; k = 1 } 30 while m > 0 { ds[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 31 var j: i64 = 0 32 while j < k { out[po] = ds[k - 1 - j]; po = po + 1; j = j + 1 } 33 out[po] = 45 as u8; po = po + 1 34 out[po] = 0 as u8 35 return po 36} 37 38// author one census row (axis/verdict/nishi/incumbent/evidence) into the native store. 39func emu_row(w: *i64, idx: i64, axis: *u8, verdict: *u8, nishi: *u8, incumbent: *u8, evidence: *u8) -> i64 { 40 let keys: *i64 = sys_mmap(8 * 8) as *i64 41 let vals: *i64 = sys_mmap(8 * 8) as *i64 42 keys[0] = ("axis\x00") as i64; vals[0] = (axis as i64) 43 keys[1] = ("verdict\x00") as i64; vals[1] = (verdict as i64) 44 keys[2] = ("nishi\x00") as i64; vals[2] = (nishi as i64) 45 keys[3] = ("incumbent\x00") as i64; vals[3] = (incumbent as i64) 46 keys[4] = ("evidence\x00") as i64; vals[4] = (evidence as i64) 47 return ncfg_add_row(w, "emu\x00" as *u8, idx, keys, vals, 5) 48} 49// seed the 6-row exceed census (faithful copy of the former emu_exceed_panel.tsv) into the store. 50func emu_panel_seed(prefix: *u8) -> i64 { 51 let w: *i64 = ncfg_begin() 52 emu_row(w, 0, "sovereignty\x00" as *u8, "EXCEED\x00" as *u8, "nx-toolchain-no-emscripten\x00" as *u8, "Emscripten+WABT+DOSBox\x00" as *u8, "gate:nx_chip8_wasm_gate\x00" as *u8) 53 emu_row(w, 1, "size\x00" as *u8, "EXCEED\x00" as *u8, "measured-wasm-bytes\x00" as *u8, "em-dosbox-MB-scale\x00" as *u8, "file:web_assets/ch8.wasm\x00" as *u8) 54 emu_row(w, 2, "privacy\x00" as *u8, "EXCEED\x00" as *u8, "zero-network-page\x00" as *u8, "telemetry-varies\x00" as *u8, "emit:web_assets/chip8.html\x00" as *u8) 55 emu_row(w, 3, "license_integrity\x00" as *u8, "EXCEED\x00" as *u8, "provenance-liar-kill\x00" as *u8, "none\x00" as *u8, "gate:nx_rom_provenance_gate\x00" as *u8) 56 emu_row(w, 4, "accuracy\x00" as *u8, "PARITY\x00" as *u8, "verified-subset-cpu+dxyn\x00" as *u8, "reference-full-suite\x00" as *u8, "gate:nx_chip8_gate\x00" as *u8) 57 emu_row(w, 5, "breadth\x00" as *u8, "BEHIND\x00" as *u8, "chip8-on-ramp\x00" as *u8, "dosbox-20yr-mature\x00" as *u8, "-\x00" as *u8) 58 ncfg_set_count(w, "emu\x00" as *u8, 6) 59 return ncfg_commit(prefix, w) 60} 61 62// append a NUL-terminated string into dst at off; returns new offset. 63func emu_putfield(dst: *u8, off: i64, s: *u8) -> i64 { 64 var o: i64 = off 65 var i: i64 = 0 66 if (s as i64) == 0 { return o } 67 while s[i] != (0 as u8) { dst[o] = s[i]; o = o + 1; i = i + 1 } 68 return o 69} 70// read the native census back and rebuild the TAB/newline panel buffer nx_emu_audit consumes. 71// returns the byte length written into out. 72func emu_panel_native(h: *i64, out: *u8) -> i64 { 73 let cnt: i64 = ncfg_count(h, "emu\x00" as *u8) 74 let rk: *i64 = sys_mmap(8 * 8) as *i64 75 let rv: *i64 = sys_mmap(8 * 8) as *i64 76 var o: i64 = 0 77 var i: i64 = 0 78 while i < cnt { 79 let rf: i64 = ncfg_row(h, "emu\x00" as *u8, i, rk, rv, 8) 80 if rf > 0 { 81 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "axis\x00" as *u8)); out[o] = 9 as u8; o = o + 1 82 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "verdict\x00" as *u8)); out[o] = 9 as u8; o = o + 1 83 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "nishi\x00" as *u8)); out[o] = 9 as u8; o = o + 1 84 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "incumbent\x00" as *u8)); out[o] = 9 as u8; o = o + 1 85 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "evidence\x00" as *u8)) 86 out[o] = 10 as u8; o = o + 1 87 } 88 i = i + 1 89 } 90 return o 91} 92 93func main() -> i64 { 94 g_puts("nx_emu_exceed census gate (measured exceed, liar-kill on unevidenced EXCEED)\n" as *u8) 95 var pass: i64 = 0 96 var total: i64 = 0 97 98 // ---- author the census into a fresh NATIVE store, then read it back (no TSV) ---- 99 let prefix: *u8 = sys_mmap(256) 100 emu_fresh_prefix(prefix, "/tmp/emuexceed-\x00" as *u8) 101 if emu_panel_seed(prefix) != 0 { g_puts(" FAIL cannot seed native emu census\nverdict=RED\n" as *u8); sys_exit(1); return 1 } 102 let h: *i64 = ncfg_open(prefix) 103 if (h as i64) == 0 { g_puts(" FAIL cannot open native emu census\nverdict=RED\n" as *u8); sys_exit(1); return 1 } 104 let panel: *u8 = sys_mmap(8192) 105 let plen: i64 = emu_panel_native(h, panel) 106 if plen == 0 { g_puts(" FAIL native emu census is empty\nverdict=RED\n" as *u8); sys_exit(1); return 1 } 107 g_puts(" ---- census panel (axis / verdict / nishi / incumbent / evidence) ----\n" as *u8) 108 sys_write(1, panel, plen) 109 g_puts(" ----------------------------------------------------------------------\n" as *u8) 110 111 // MEASURED anchor: the real sovereign wasm artifact size 112 let size: i64 = ex_wasm_size() 113 g_puts(" [measure] web_assets/ch8.wasm = " as *u8); g_pn(size); g_puts(" bytes\n" as *u8) 114 var szok: i64 = 0 115 if size > 0 { if size < 100000 { szok = 1 } } 116 pass = pass + g_check("size axis is MEASURED real + tiny (0 < ch8.wasm < 100000 bytes)" as *u8, szok); total = total + 1 117 118 // audit the panel 119 let counts: *i64 = sys_mmap(24) as *i64 120 let liars: i64 = nx_emu_audit(panel, plen, counts) 121 g_puts(" [audit] EXCEED=" as *u8); g_pn(counts[0]); g_puts(" PARITY=" as *u8); g_pn(counts[1]); g_puts(" BEHIND=" as *u8); g_pn(counts[2]); g_puts(" liars=" as *u8); g_pn(liars); g_puts("\n" as *u8) 122 pass = pass + g_check("no unevidenced EXCEED -- every EXCEED row carries evidence (not self-scored)" as *u8, liars == 0); total = total + 1 123 pass = pass + g_check("honest: >=1 PARITY axis (accuracy = verified subset, NOT 'beat')" as *u8, counts[1] >= 1); total = total + 1 124 pass = pass + g_check("honest: >=1 BEHIND axis (breadth/maturity behind DOSBox)" as *u8, counts[2] >= 1); total = total + 1 125 pass = pass + g_check(">=4 evidenced EXCEED axes (sovereignty/size/privacy/integrity)" as *u8, counts[0] >= 4); total = total + 1 126 127 // NEG-CONTROL: a fabricated EXCEED row with NO evidence MUST be caught 128 let fake: *u8 = sys_mmap(64) 129 var fo: i64 = 0 130 fo = cat(fake, fo, "fakeaxis" as *u8); fake[fo] = 9 as u8; fo = fo + 1 131 fo = cat(fake, fo, "EXCEED" as *u8); fake[fo] = 9 as u8; fo = fo + 1 132 fo = cat(fake, fo, "x" as *u8); fake[fo] = 9 as u8; fo = fo + 1 133 fo = cat(fake, fo, "y" as *u8); fake[fo] = 9 as u8; fo = fo + 1 134 fo = cat(fake, fo, "-" as *u8) 135 let c2: *i64 = sys_mmap(24) as *i64 136 let liars2: i64 = nx_emu_audit(fake, fo, c2) 137 pass = pass + g_check("NEG-CONTROL: a fabricated unevidenced EXCEED is CAUGHT (liar-kill bites)" as *u8, liars2 >= 1); total = total + 1 138 139 g_puts("---- emu_exceed census gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8) 140 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 141 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 142 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 143 let ctr__dry: *i64 = gv_ctr() 144 ctr__dry[0] = pass 145 ctr__dry[1] = total 146 let rc__dry: i64 = gv_verdict("EMU-EXCEED-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8) 147 sys_exit(rc__dry) 148 return rc__dry 149}