code wiki / (root) / nx_mhtarget_gate.nx

nx_mhtarget_gate.nx source

↩ module page · 158 lines · 7936 B

1// nx_mhtarget_gate.nx -- BITE-PROOF for the MakeHuman target dialect, both directions. 2// 3// IT DRIVES THE SHIPPING CODE: every tooth calls nx_mhtarget_lib directly -- the same mht_probe, 4// mht_decode, mht_row and mht_num_micro the CLI calls. 5// 6// FIXTURES ARE WRITTEN AT RUNTIME under /tmp/<gate>/ (bodies are plain constants -- no quote hazard in this 7// dialect). Every path is unlinked before it is written (idempotence). 8// Unlike the BodySlide sibling, the REAL corpus here is CC0 and already fetched -- the real-file 9// verification rides the CLI smoke on the fetched corpus and the banked-mirror watch row; this 10// gate proves the arithmetic and the refusals exactly. 11// 12// license_tier: ORIGINAL expect_exit: 0 13import "nx_syscalls.nx" 14import "nx_gate_verdict.nx" 15import "nx_mhtarget_lib.nx" 16 17const MG_DIR: *u8 = "/tmp/nx_mhtarget_gate" as *u8 18const MG_F_GOOD: *u8 = "/tmp/nx_mhtarget_gate/good.target" as *u8 19const MG_F_BAD: *u8 = "/tmp/nx_mhtarget_gate/bad.target" as *u8 20const MG_F_JUNK: *u8 = "/tmp/nx_mhtarget_gate/junk.txt" as *u8 21const MG_F_EMPTY: *u8 = "/tmp/nx_mhtarget_gate/empty.target" as *u8 22const MG_BUFCAP: i64 = 65536 23const MG_MAXROWS: i64 = 64 24// expected micro values for the good fixture rows, exact 25const MG_R0_DX: i64 = 17000 // .017 -- the LEADING-DOT form the real corpus uses 26const MG_R0_DY: i64 = 0 - 50000 // -0.05 27const MG_R0_DZ: i64 = 0 // 0 28const MG_R1_DX: i64 = 1500000 // 1.5 29const MG_R1_DY: i64 = 0 // 0 30const MG_R1_DZ: i64 = 123000 // .123 31const MG_R2_DX: i64 = 0 - 1000 // -0.001 32const MG_R2_DY: i64 = 250000 // 0.25 33const MG_R2_DZ: i64 = 0 - 1000000 // -1 (whole negative) 34 35const MG_GOOD_BODY: *u8 = "# fixture comment one\n# fixture comment two\n17 .017 -0.05 0\n18 1.5 0 .123\n\n42 -0.001 0.25 -1\n" as *u8 36const MG_BAD_BODY: *u8 = "# one comment\n17 .017 -0.05 0\n19 abc 0 0\n21 1 1 1\n" as *u8 37const MG_JUNK_BODY: *u8 = "this prose has no four token numeric rows at all\nand neither does this line\n" as *u8 38 39func mg_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 40func mg_write(path: *u8, body: *u8, n: i64) -> i64 { 41 sys_unlinkat(path) 42 let fd: i64 = sys_openat_wr(path, MODE_0644) 43 if fd < 0 { return 0 - 1 } 44 if n > 0 { sys_write(fd, body, n) } 45 sys_close(fd) 46 return n 47} 48 49func main(argc: i64, argv: *i64) -> i64 { 50 let ctr: *i64 = gv_ctr() 51 gv_head("=== NX-MHTARGET GATE -- the CC0 morph-target dialect must decode exactly, and refuse everything else ===" as *u8) 52 53 sys_mkdir(MG_DIR, MODE_0755) 54 let sc: *i64 = sys_mmap(64) as *i64 55 56 let n_good: i64 = mg_slen(MG_GOOD_BODY) 57 let w_good: i64 = mg_write(MG_F_GOOD, MG_GOOD_BODY, n_good) 58 let n_bad: i64 = mg_slen(MG_BAD_BODY) 59 let w_bad: i64 = mg_write(MG_F_BAD, MG_BAD_BODY, n_bad) 60 let n_junk: i64 = mg_slen(MG_JUNK_BODY) 61 let w_junk: i64 = mg_write(MG_F_JUNK, MG_JUNK_BODY, n_junk) 62 let w_empty: i64 = mg_write(MG_F_EMPTY, MG_GOOD_BODY, 0) 63 64 gv_puts(" planted: good=" as *u8); gv_num(w_good) 65 gv_puts(" bad=" as *u8); gv_num(w_bad) 66 gv_puts(" junk=" as *u8); gv_num(w_junk) 67 gv_puts(" empty=" as *u8); gv_num(w_empty); gv_puts("\n" as *u8) 68 69 var built: i64 = 0 70 if w_good == n_good { if w_good > 0 { if w_bad == n_bad { if w_junk == n_junk { if w_empty == 0 { built = 1 } } } } } 71 gv_need("every fixture reached its planted condition (written bytes == body bytes, good nonempty, empty empty)" as *u8, built, ctr) 72 73 let good: *u8 = sys_read_file(MG_F_GOOD, sc) 74 let good_n: i64 = sc[0] 75 let facts: *i64 = sys_mmap(MHT_N_SLOTS * 8) as *i64 76 77 // ---- T1 THE BITE 78 mht_probe(good, good_n, good_n, facts) 79 var fired_good: i64 = 0 80 if facts[0] == 1 { fired_good = 1 } 81 let c_rows: i64 = facts[1] 82 let c_comm: i64 = facts[2] 83 let c_blank: i64 = facts[3] 84 let c_maxv: i64 = facts[4] 85 let c_bad: i64 = facts[5] 86 let junk: *u8 = sys_read_file(MG_F_JUNK, sc) 87 let junk_n: i64 = sc[0] 88 mht_probe(junk, junk_n, junk_n, facts) 89 var fired_junk: i64 = 0 90 if facts[0] == 1 { fired_junk = 1 } 91 gv_bite("T1 mht_probe fires on a real target and does NOT fire on four-token-free prose" as *u8, fired_good, fired_junk, ctr) 92 93 // ---- T2 census exact 94 gv_puts(" census: rows=" as *u8); gv_num(c_rows) 95 gv_puts(" comments=" as *u8); gv_num(c_comm) 96 gv_puts(" blanks=" as *u8); gv_num(c_blank) 97 gv_puts(" maxvert=" as *u8); gv_num(c_maxv) 98 gv_puts(" bad=" as *u8); gv_num(c_bad); gv_puts("\n" as *u8) 99 var t2: i64 = 0 100 if c_rows == 3 { if c_comm == 2 { if c_blank == 1 { if c_maxv == 42 { if c_bad == 0 { t2 = 1 } } } } } 101 gv_check("T2 census exact: 3 rows, 2 comments, 1 blank, maxvert 42, 0 bad" as *u8, t2, ctr) 102 103 // ---- T3 decode arithmetic, all three notations in one tooth 104 let idxs: *i64 = sys_mmap(MG_MAXROWS * 8) as *i64 105 let dxs: *i64 = sys_mmap(MG_MAXROWS * 8) as *i64 106 let dys: *i64 = sys_mmap(MG_MAXROWS * 8) as *i64 107 let dzs: *i64 = sys_mmap(MG_MAXROWS * 8) as *i64 108 let meta: *i64 = sys_mmap(16) as *i64 109 let parsed: i64 = mht_decode(good, good_n, idxs, dxs, dys, dzs, MG_MAXROWS, meta) 110 gv_puts(" decode: declared=" as *u8); gv_num(meta[0]) 111 gv_puts(" parsed=" as *u8); gv_num(parsed) 112 gv_puts(" r0=" as *u8); gv_num(dxs[0]); gv_puts("," as *u8); gv_num(dys[0]); gv_puts("," as *u8); gv_num(dzs[0]) 113 gv_puts(" r2=" as *u8); gv_num(dxs[2]); gv_puts("," as *u8); gv_num(dys[2]); gv_puts("," as *u8); gv_num(dzs[2]); gv_puts("\n" as *u8) 114 var t3: i64 = 0 115 if meta[0] == 3 { if parsed == 3 { 116 if dxs[0] == MG_R0_DX { if dys[0] == MG_R0_DY { if dzs[0] == MG_R0_DZ { 117 if dxs[1] == MG_R1_DX { if dys[1] == MG_R1_DY { if dzs[1] == MG_R1_DZ { 118 if dxs[2] == MG_R2_DX { if dys[2] == MG_R2_DY { if dzs[2] == MG_R2_DZ { t3 = 1 } } } } } } } } } } } 119 gv_check("T3 micro decode exact: leading-dot .017 -> 17000, -0.05 -> -50000, 1.5 -> 1500000, .123 -> 123000, -1 -> -1000000" as *u8, t3, ctr) 120 121 // ---- T4 row identity travels 122 var t4: i64 = 0 123 if idxs[0] == 17 { if idxs[1] == 18 { if idxs[2] == 42 { t4 = 1 } } } 124 gv_check("T4 vertex indices travel with their offsets: 17, 18, 42" as *u8, t4, ctr) 125 126 // ---- T5 honest-partial: a bad token stops the parse, parsed < declared visible 127 let bad: *u8 = sys_read_file(MG_F_BAD, sc) 128 let bad_n: i64 = sc[0] 129 let p_bad: i64 = mht_decode(bad, bad_n, idxs, dxs, dys, dzs, MG_MAXROWS, meta) 130 gv_puts(" bad: declared=" as *u8); gv_num(meta[0]) 131 gv_puts(" parsed=" as *u8); gv_num(p_bad); gv_puts("\n" as *u8) 132 var t5: i64 = 0 133 if p_bad == 1 { if meta[0] == 2 { t5 = 1 } } 134 gv_check("T5 a non-numeric token stops the parse: parsed=1 under declared=2, never papered over" as *u8, t5, ctr) 135 136 // ---- T6 a corrupt file is not a target (bad>0 forces refusal on the PROBE side too) 137 mht_probe(bad, bad_n, bad_n, facts) 138 var t6: i64 = 0 139 if facts[0] == 0 { t6 = 1 } 140 gv_check("T6 neg-control-a-file-with-a-corrupt-row-is-refused-by-probe (bad rows force is_target 0)" as *u8, t6, ctr) 141 142 // ---- T7 truncation honesty: cut mid-row, counts abstain, prefix still recognized 143 mht_probe(good, good_n - 5, good_n, facts) 144 var t7: i64 = 0 145 if facts[0] == 1 { if facts[1] == (0 - 1) { if facts[4] == (0 - 1) { t7 = 1 } } } 146 gv_check("T7 a truncated read decides from the complete-line prefix and ABSTAINS from every count" as *u8, t7, ctr) 147 148 // ---- T8 empty refused 149 let emp: *u8 = sys_read_file(MG_F_EMPTY, sc) 150 let emp_n: i64 = sc[0] 151 mht_probe(emp, emp_n, emp_n, facts) 152 var t8: i64 = 0 153 if facts[0] == 0 { t8 = 1 } 154 gv_check("T8 neg-control-a-zero-byte-file-is-not-a-target" as *u8, t8, ctr) 155 156 return gv_verdict("MHTARGET" as *u8, ctr, 157 "the CC0 morph-target dialect decodes to exact micro-unit offsets with fail-closed honesty; the real corpus rides the CLI smoke and the banked-mirror watch row" as *u8) 158}