code wiki / _hdl_build / nx_autofix_ensemble_gate.nx
nx_autofix_ensemble_gate.nx source
↩ module page · 74 lines · 4369 B
1// nx_autofix_ensemble_gate.nx -- gate for THE LIVE ENSEMBLE orchestrator (nx_autofix_ensemble).
2// On nx_gate_verdict (D001 law). Gates the NEW logic = miss-extraction (fork-loop + cascade are
3// already-gated elfs). Imports the shared lib (nx_autofix_ens_lib) so it tests the ORGAN'S code:
4// T1 miss count = exactly the non-green rows
5// T2 a MISS row IS in the misses-manifest (full name|path preserved for maker#2)
6// T3 a GREEN row is NOT in the misses-manifest (never re-run a resolved instance)
7// T4 all-green ledger -> 0 misses (maker#2 skipped)
8// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
9import "nx_autofix_ens_lib.nx"
10import "nx_gate_verdict.nx"
11import "nx_syscalls.nx"
12
13func aeg_has(q: *u8, n: i64, s: *u8) -> i64 {
14 var sl: i64 = 0; while s[sl] != (0 as u8) { sl = sl + 1 }
15 if sl == 0 { return 1 }
16 var i: i64 = 0
17 while i + sl <= n {
18 var hit: i64 = 1
19 var j: i64 = 0
20 while j < sl { if q[i+j] != s[j] { hit = 0; j = sl } else { j = j + 1 } }
21 if hit == 1 { return 1 }
22 i = i + 1
23 }
24 return 0
25}
26
27func main() -> i64 {
28 let ctr: *i64 = gv_ctr()
29 gv_head("nx_autofix_ensemble gate -- miss-extraction: hand maker#2 exactly maker#1's unresolved rows" as *u8)
30
31 let man: *u8 = "a|runtime/a.nx\nb|runtime/b.nx\nc|runtime/c.nx\nd|runtime/d.nx\n" as *u8
32 let l1: *u8 = "AUTOFIX-AUTO ts=1 cand=a located=a attempts=1 maker=GREEN revert=1 symj=GREEN\nAUTOFIX-AUTO ts=1 cand=b located=b attempts=5 maker=MISS revert=1 symj=SKIP\nAUTOFIX-AUTO ts=1 cand=c located=c attempts=1 maker=GREEN revert=1 symj=GREEN\nAUTOFIX-AUTO ts=1 cand=d located=d attempts=5 maker=MISS revert=1 symj=SKIP\n" as *u8
33 let mannn: i64 = ael_slen(man)
34 let l1n: i64 = ael_slen(l1)
35 let out: *u8 = sys_mmap(65536)
36 let box: *i64 = sys_mmap(8) as *i64
37 let cnt: i64 = ael_extract_misses(l1, l1n, man, mannn, out, box)
38
39 var t1: i64 = 0
40 if cnt == 2 { t1 = 1 }
41 gv_check("T1 miss count = 2 (b,d)" as *u8, t1, ctr)
42 gv_check("T2 miss row b preserved (name|path)" as *u8, aeg_has(out, box[0], "b|runtime/b.nx" as *u8), ctr)
43 gv_check("T3 green row a NOT in misses" as *u8, 1 - aeg_has(out, box[0], "a|runtime/a.nx" as *u8), ctr)
44
45 let l1g: *u8 = "AUTOFIX-AUTO ts=1 cand=a located=a attempts=1 maker=GREEN revert=1 symj=GREEN\nAUTOFIX-AUTO ts=1 cand=b located=b attempts=1 maker=GREEN revert=1 symj=GREEN\nAUTOFIX-AUTO ts=1 cand=c located=c attempts=1 maker=GREEN revert=1 symj=GREEN\nAUTOFIX-AUTO ts=1 cand=d located=d attempts=1 maker=GREEN revert=1 symj=GREEN\n" as *u8
46 let l1gn: i64 = ael_slen(l1g)
47 let out2: *u8 = sys_mmap(65536)
48 let box2: *i64 = sys_mmap(8) as *i64
49 let cnt2: i64 = ael_extract_misses(l1g, l1gn, man, mannn, out2, box2)
50 var t4: i64 = 0
51 if cnt2 == 0 { t4 = 1 }
52 gv_check("T4 all-green -> 0 misses (skip maker#2)" as *u8, t4, ctr)
53
54 // F960 N-maker staging: every maker MUST get its own ledger path, else maker#3 clobbers maker#2's
55 // ledger and the union silently loses a maker's greens (a wrong-but-plausible 2-maker-looking result).
56 let p1: *u8 = sys_mmap(64)
57 let p2: *u8 = sys_mmap(64)
58 let p3: *u8 = sys_mmap(64)
59 ael_stage_path(p1, "/tmp/ens_l" as *u8, 1, ".ledger" as *u8)
60 ael_stage_path(p2, "/tmp/ens_l" as *u8, 2, ".ledger" as *u8)
61 ael_stage_path(p3, "/tmp/ens_l" as *u8, 3, ".ledger" as *u8)
62 gv_check("T5 stage path 1 = the 2-maker organ's exact legacy path (back-compat)" as *u8, aeg_has(p1, ael_slen(p1), "/tmp/ens_l1.ledger" as *u8), ctr)
63 gv_check("T6 stage path 3 is DISTINCT from 1 and 2 (no ledger clobber)" as *u8, 1 - aeg_has(p3, ael_slen(p3), "/tmp/ens_l2.ledger" as *u8), ctr)
64 var t7: i64 = 0
65 if ael_slen(p2) == ael_slen(p3) { if aeg_has(p2, ael_slen(p2), "/tmp/ens_l2.ledger" as *u8) == 1 { t7 = 1 } }
66 gv_check("T7 stage paths are single-digit and uniform (AE_MAXMK<=9 holds)" as *u8, t7, ctr)
67 let pm: *u8 = sys_mmap(64)
68 ael_stage_path(pm, "/tmp/ens_miss" as *u8, 2, ".txt" as *u8)
69 gv_check("T8 miss-manifest path is per-stage too (chained misses never overwrite)" as *u8, aeg_has(pm, ael_slen(pm), "/tmp/ens_miss2.txt" as *u8), ctr)
70
71 let rc: i64 = gv_verdict("AUTOFIX-ENSEMBLE-GATE" as *u8, ctr, "miss-extraction hands each maker exactly the unresolved rows; per-stage paths never collide" as *u8)
72 sys_exit(rc)
73 return rc
74}