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}