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}