code wiki / _hdl_build / nx_emu_exceed_gate.nx

nx_emu_exceed_gate.nx source

↩ module page · 142 lines · 8321 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" 13 14func cat(dst: *u8, off: i64, s: *u8) -> i64 { 15 var o: i64 = off 16 var i: i64 = 0 17 while s[i] != 0 as u8 { dst[o] = s[i]; o = o + 1; i = i + 1 } 18 return o 19} 20 21// fresh unique native store prefix per run (epoch-stamped, like nx_library_exceed). 22func emu_fresh_prefix(out: *u8, base: *u8) -> i64 { 23 var po: i64 = 0 24 while base[po] != (0 as u8) { out[po] = base[po]; po = po + 1 } 25 var m: i64 = sys_now_ms() 26 let ds: *u8 = sys_mmap(28) 27 var k: i64 = 0 28 if m == 0 { ds[0] = 48 as u8; k = 1 } 29 while m > 0 { ds[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 30 var j: i64 = 0 31 while j < k { out[po] = ds[k - 1 - j]; po = po + 1; j = j + 1 } 32 out[po] = 45 as u8; po = po + 1 33 out[po] = 0 as u8 34 return po 35} 36 37// author one census row (axis/verdict/nishi/incumbent/evidence) into the native store. 38func emu_row(w: *i64, idx: i64, axis: *u8, verdict: *u8, nishi: *u8, incumbent: *u8, evidence: *u8) -> i64 { 39 let keys: *i64 = sys_mmap(8 * 8) as *i64 40 let vals: *i64 = sys_mmap(8 * 8) as *i64 41 keys[0] = ("axis\x00") as i64; vals[0] = (axis as i64) 42 keys[1] = ("verdict\x00") as i64; vals[1] = (verdict as i64) 43 keys[2] = ("nishi\x00") as i64; vals[2] = (nishi as i64) 44 keys[3] = ("incumbent\x00") as i64; vals[3] = (incumbent as i64) 45 keys[4] = ("evidence\x00") as i64; vals[4] = (evidence as i64) 46 return ncfg_add_row(w, "emu\x00" as *u8, idx, keys, vals, 5) 47} 48// seed the 6-row exceed census (faithful copy of the former emu_exceed_panel.tsv) into the store. 49func emu_panel_seed(prefix: *u8) -> i64 { 50 let w: *i64 = ncfg_begin() 51 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) 52 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) 53 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) 54 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) 55 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) 56 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) 57 ncfg_set_count(w, "emu\x00" as *u8, 6) 58 return ncfg_commit(prefix, w) 59} 60 61// append a NUL-terminated string into dst at off; returns new offset. 62func emu_putfield(dst: *u8, off: i64, s: *u8) -> i64 { 63 var o: i64 = off 64 var i: i64 = 0 65 if (s as i64) == 0 { return o } 66 while s[i] != (0 as u8) { dst[o] = s[i]; o = o + 1; i = i + 1 } 67 return o 68} 69// read the native census back and rebuild the TAB/newline panel buffer nx_emu_audit consumes. 70// returns the byte length written into out. 71func emu_panel_native(h: *i64, out: *u8) -> i64 { 72 let cnt: i64 = ncfg_count(h, "emu\x00" as *u8) 73 let rk: *i64 = sys_mmap(8 * 8) as *i64 74 let rv: *i64 = sys_mmap(8 * 8) as *i64 75 var o: i64 = 0 76 var i: i64 = 0 77 while i < cnt { 78 let rf: i64 = ncfg_row(h, "emu\x00" as *u8, i, rk, rv, 8) 79 if rf > 0 { 80 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "axis\x00" as *u8)); out[o] = 9 as u8; o = o + 1 81 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "verdict\x00" as *u8)); out[o] = 9 as u8; o = o + 1 82 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "nishi\x00" as *u8)); out[o] = 9 as u8; o = o + 1 83 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "incumbent\x00" as *u8)); out[o] = 9 as u8; o = o + 1 84 o = emu_putfield(out, o, ncfg_field(rk, rv, rf, "evidence\x00" as *u8)) 85 out[o] = 10 as u8; o = o + 1 86 } 87 i = i + 1 88 } 89 return o 90} 91 92func main() -> i64 { 93 g_puts("nx_emu_exceed census gate (measured exceed, liar-kill on unevidenced EXCEED)\n" as *u8) 94 var pass: i64 = 0 95 var total: i64 = 0 96 97 // ---- author the census into a fresh NATIVE store, then read it back (no TSV) ---- 98 let prefix: *u8 = sys_mmap(256) 99 emu_fresh_prefix(prefix, "/tmp/emuexceed-\x00" as *u8) 100 if emu_panel_seed(prefix) != 0 { g_puts(" FAIL cannot seed native emu census\nverdict=RED\n" as *u8); sys_exit(1); return 1 } 101 let h: *i64 = ncfg_open(prefix) 102 if (h as i64) == 0 { g_puts(" FAIL cannot open native emu census\nverdict=RED\n" as *u8); sys_exit(1); return 1 } 103 let panel: *u8 = sys_mmap(8192) 104 let plen: i64 = emu_panel_native(h, panel) 105 if plen == 0 { g_puts(" FAIL native emu census is empty\nverdict=RED\n" as *u8); sys_exit(1); return 1 } 106 g_puts(" ---- census panel (axis / verdict / nishi / incumbent / evidence) ----\n" as *u8) 107 sys_write(1, panel, plen) 108 g_puts(" ----------------------------------------------------------------------\n" as *u8) 109 110 // MEASURED anchor: the real sovereign wasm artifact size 111 let size: i64 = ex_wasm_size() 112 g_puts(" [measure] web_assets/ch8.wasm = " as *u8); g_pn(size); g_puts(" bytes\n" as *u8) 113 var szok: i64 = 0 114 if size > 0 { if size < 100000 { szok = 1 } } 115 pass = pass + g_check("size axis is MEASURED real + tiny (0 < ch8.wasm < 100000 bytes)" as *u8, szok); total = total + 1 116 117 // audit the panel 118 let counts: *i64 = sys_mmap(24) as *i64 119 let liars: i64 = nx_emu_audit(panel, plen, counts) 120 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) 121 pass = pass + g_check("no unevidenced EXCEED -- every EXCEED row carries evidence (not self-scored)" as *u8, liars == 0); total = total + 1 122 pass = pass + g_check("honest: >=1 PARITY axis (accuracy = verified subset, NOT 'beat')" as *u8, counts[1] >= 1); total = total + 1 123 pass = pass + g_check("honest: >=1 BEHIND axis (breadth/maturity behind DOSBox)" as *u8, counts[2] >= 1); total = total + 1 124 pass = pass + g_check(">=4 evidenced EXCEED axes (sovereignty/size/privacy/integrity)" as *u8, counts[0] >= 4); total = total + 1 125 126 // NEG-CONTROL: a fabricated EXCEED row with NO evidence MUST be caught 127 let fake: *u8 = sys_mmap(64) 128 var fo: i64 = 0 129 fo = cat(fake, fo, "fakeaxis" as *u8); fake[fo] = 9 as u8; fo = fo + 1 130 fo = cat(fake, fo, "EXCEED" as *u8); fake[fo] = 9 as u8; fo = fo + 1 131 fo = cat(fake, fo, "x" as *u8); fake[fo] = 9 as u8; fo = fo + 1 132 fo = cat(fake, fo, "y" as *u8); fake[fo] = 9 as u8; fo = fo + 1 133 fo = cat(fake, fo, "-" as *u8) 134 let c2: *i64 = sys_mmap(24) as *i64 135 let liars2: i64 = nx_emu_audit(fake, fo, c2) 136 pass = pass + g_check("NEG-CONTROL: a fabricated unevidenced EXCEED is CAUGHT (liar-kill bites)" as *u8, liars2 >= 1); total = total + 1 137 138 g_puts("---- emu_exceed census gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8) 139 if pass == total { g_puts("verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 140 g_puts("verdict=RED\n" as *u8); sys_exit(1) 141 return 1 142}