code wiki / _hdl_build / nx_doc_heal_let_gate.nx
nx_doc_heal_let_gate.nx source
↩ module page · 64 lines · 3931 B
1import "nx_gate_gn.nx"
2// nx_doc_heal_let_gate.nx -- liar-kill gate for the Doctor's let-reassign auto-fixer (autonomous FIX). MUST-FIX: a
3// `let` that is reassigned -> rewritten to `var` (incl. the exact `hit1` case that bit this session). MUST-NOT-BREAK:
4// a clean `let` (never reassigned), a `==` comparison, and a `NAME[i] = ...` index-assignment are all left untouched
5// (no false rewrites). expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_doc_heal_let.nx"
8import "nx_gate_verdict.nx"
9
10func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
11func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
12func gfind(hay: *u8, hl: i64, needle: *u8) -> i64 {
13 let nl: i64 = slen(needle); if nl == 0 { return 0-1 }
14 var i: i64 = 0
15 while i + nl <= hl { var k: i64=0; var hit: i64=1; while k<nl { if hay[i+k]!=needle[k]{hit=0;k=nl}else{k=k+1} } if hit==1 {return i} i=i+1 }
16 return 0-1
17}
18func ghas(hay: *u8, hl: i64, needle: *u8) -> i64 { if gfind(hay, hl, needle) >= 0 { return 1 } return 0 }
19
20func main() -> i64 {
21 gp("=== nx_doc_heal_let_gate: Doctor auto-fix of let-reassign (var) -- must-fix + must-not-break ===\n" as *u8)
22 let out: *u8 = sys_mmap(8192)
23 var pass: i64 = 0; var fail: i64 = 0
24
25 // KAT1 must-fix: reassigned let -> var
26 let s1: *u8 = "func f() -> i64 { let x: i64 = 0; x = 1; return x }" as *u8
27 let c1: i64 = dhl_heal(s1, slen(s1), out, 8192)
28 if ghas(out, slen(out), "var x: i64 = 0" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-not-fixed\n" as *u8) }
29 if gfind(out, slen(out), "let x" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-let-remains\n" as *u8) }
30 if c1 >= 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-no-change\n" as *u8) }
31
32 // KAT2 must-not-break: a clean let (never reassigned) stays let
33 let s2: *u8 = "func g() -> i64 { let y: i64 = 5; return y + 1 }" as *u8
34 let c2: i64 = dhl_heal(s2, slen(s2), out, 8192)
35 if ghas(out, slen(out), "let y: i64 = 5" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-clean-touched\n" as *u8) }
36 if c2 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-spurious-change\n" as *u8) }
37
38 // KAT3 must-not-break: `==` comparison is not an assignment
39 let s3: *u8 = "func h() -> i64 { let z: i64 = 0; if z == 1 { return 2 } return z }" as *u8
40 let c3: i64 = dhl_heal(s3, slen(s3), out, 8192)
41 if c3 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat3-eqeq-mistaken\n" as *u8) }
42
43 // KAT4 must-not-break: a NAME[i] = ... index-assignment does NOT reassign the binding
44 let s4: *u8 = "func k() -> i64 { let p: *u8 = z(); p[0] = 5 as u8; return 0 }" as *u8
45 let c4: i64 = dhl_heal(s4, slen(s4), out, 8192)
46 if c4 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat4-index-mistaken\n" as *u8) }
47
48 // KAT5 the exact session case: `let hit1 ... hit1 = 1`
49 let s5: *u8 = "let hit1: i64 = 0; if r == 1 { hit1 = 1 }" as *u8
50 let c5: i64 = dhl_heal(s5, slen(s5), out, 8192)
51 if ghas(out, slen(out), "var hit1" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat5-not-fixed\n" as *u8) }
52 if c5 >= 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat5-no-change\n" as *u8) }
53
54 gp("DOC-HEAL-LET-GATE pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
55 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
56 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
57 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
58 let ctr__dry: *i64 = gv_ctr()
59 ctr__dry[0] = pass
60 ctr__dry[1] = pass + fail
61 let rc__dry: i64 = gv_verdict("DOC-HEAL-LET-GATE" as *u8, ctr__dry, "autonomous FIX: reassigned let->var; clean let / == / index-assign untouched)" as *u8)
62 sys_exit(rc__dry)
63 return rc__dry
64}