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}