code wiki / _hdl_build / nx_doc_autoheal_gate.nx
nx_doc_autoheal_gate.nx source
↩ module page · 64 lines · 4632 B
1import "nx_gate_gn.nx"
2// nx_doc_autoheal_gate.nx -- liar-kill gate for the Doctor's autonomous RESOLVE loop (recall -> route -> fix ->
3// verify). Proves the loop turns a real failing source into a verified-clean one, AND that it is honest by
4// construction: it never invents a fix for a novel diagnostic, and never falsely claims a heal for a symptom its
5// one fixer cannot handle (reserved-keyword sub-case, clean source). Depends on the ki- catalogue carrying the
6// empty-.s lesson (seeded durably by nx_meet_bug_train); KAT1 fails LOUD if that recall is missing. expect_exit: 0
7import "nx_syscalls.nx"
8import "nx_doc_autoheal.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, needle: *u8) -> i64 { if gfind(hay, slen(hay), needle) >= 0 { return 1 } return 0 }
19
20func main() -> i64 {
21 gp("=== nx_doc_autoheal_gate: Doctor autonomous RESOLVE loop (recall -> route -> fix -> verify) ===\n" as *u8)
22 let out: *u8 = sys_mmap(8192)
23 let oid: *u8 = sys_mmap(128)
24 let orem: *u8 = sys_mmap(2048)
25 var pass: i64 = 0; var fail: i64 = 0
26
27 // the real diagnostic a build emits for the #1 cause (contains the NX-EMPTYS-REALERR signature)
28 let de: *u8 = "[nx_sov_build_run] nx_meet_foo: COMPILE-FAIL (empty .s after retries)" as *u8
29
30 // KAT1 the loop HEALS a real reassigned-let source end-to-end and VERIFIES the defect is gone
31 let s1: *u8 = "func f() -> i64 { let x: i64 = 0; x = 1; return x }" as *u8
32 let r1: i64 = dah_resolve(de, slen(de), s1, slen(s1), out, 8192, oid, orem)
33 if r1 == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-not-healed r=" as *u8); gn(r1); gp("\n" as *u8) }
34 if ghas(out, "var x: i64 = 0" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-no-var\n" as *u8) }
35 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) }
36 if dah_has_reassigned_let(out, slen(out)) == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-postcond-dirty\n" as *u8) }
37 if ghas(oid, "NX-EMPTYS" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-wrong-recall id=" as *u8); gp(oid); gp("\n" as *u8) }
38
39 // KAT2 honest NO-FIX: an empty-.s caused by a reserved keyword (no reassigned let) -> routed to our class but our
40 // let-fixer has no applicable change -> DAH_NOFIX (the reserved-kw renamer is the sibling follow-on), NOT a fake heal
41 let s2: *u8 = "func q(match: i64) -> i64 { return match + 1 }" as *u8
42 let r2: i64 = dah_resolve(de, slen(de), s2, slen(s2), out, 8192, oid, orem)
43 if r2 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-should-be-nofix r=" as *u8); gn(r2); gp("\n" as *u8) }
44
45 // KAT3 neg-control: a novel/clean diagnostic -> DAH_UNKNOWN; the loop invents nothing
46 let d3: *u8 = "everything compiled and ran fine, all green, nothing to see" as *u8
47 let r3: i64 = dah_resolve(d3, slen(d3), s1, slen(s1), out, 8192, oid, orem)
48 if r3 == (0-1) { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat3-should-be-unknown r=" as *u8); gn(r3); gp("\n" as *u8) }
49
50 // KAT4 the exact session case heals end-to-end
51 let s4: *u8 = "let hit1: i64 = 0; if r == 1 { hit1 = 1 }" as *u8
52 let r4: i64 = dah_resolve(de, slen(de), s4, slen(s4), out, 8192, oid, orem)
53 if r4 == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat4-not-healed r=" as *u8); gn(r4); gp("\n" as *u8) }
54 if ghas(out, "var hit1" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat4-no-var-hit1\n" as *u8) }
55
56 // KAT5 must-not-break: a clean let (never reassigned) + the same diag -> DAH_NOFIX (no false heal)
57 let s5: *u8 = "func g() -> i64 { let y: i64 = 5; return y + 1 }" as *u8
58 let r5: i64 = dah_resolve(de, slen(de), s5, slen(s5), out, 8192, oid, orem)
59 if r5 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat5-clean-falsely-touched r=" as *u8); gn(r5); gp("\n" as *u8) }
60
61 gp("DOC-AUTOHEAL-GATE pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
62 if fail == 0 { gp(" verdict=GREEN (autonomous resolve: recall->route->fix->verify heals real let-reassign; UNKNOWN/NOFIX honest)\n" as *u8); sys_exit(0); return 0 }
63 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
64}