nx_research_investigate_gate.nx source
↩ module page · 83 lines · 4811 B
1// nx_research_investigate_gate.nx -- liar-kill gate for S4 the INVESTIGATION LOOP controller (deterministic, $0).
2// Shows the ACTUAL iteration traces + honest termination for three real cases: CONVERGE (loop grounds a report
3// that started with an open gap), STALLED (gaps stop decreasing -> stop early, never infinite), BUDGET (gaps
4// decrease but hit the cap -> stop and report remaining gaps). license_tier: ORIGINAL
5import "nx_research_investigate.nx"
6import "nx_syscalls.nx"
7
8func st_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
9func st_putn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1} sys_write(1,bb,k); return 0 }
10func st_trace(trace: *i64, n: i64) -> i64 {
11 st_puts("[" as *u8)
12 var i: i64 = 0
13 while i < n { if i > 0 { st_puts("," as *u8) } st_putn(trace[i]); i = i + 1 }
14 st_puts("]" as *u8)
15 return 0
16}
17func st_status(s: i64) -> i64 {
18 if s == 0 { st_puts("DONE-GROUNDED" as *u8) } else { if s == 1 { st_puts("DONE-BUDGET" as *u8) } else { if s == 2 { st_puts("DONE-STALLED" as *u8) } else { st_puts("CONTINUE" as *u8) } } }
19 return 0
20}
21
22func main() -> i64 {
23 var pass: i64 = 0
24 var total: i64 = 0
25 let trace: *i64 = sys_mmap(128) as *i64
26 let out: *i64 = sys_mmap(64) as *i64
27 let out2: *i64 = sys_mmap(64) as *i64
28 let seq: *i64 = sys_mmap(128) as *i64
29
30 // T1 CONVERGE -- the REAL S3 scenario: a 2-section report starts with 1 uncited claim (the fabricated-[3]
31 // Location claim); the loop investigates, grounds it, and stops. gaps per iteration: 1 -> 0.
32 total = total + 1
33 seq[0] = 1; seq[1] = 0
34 riv_run(seq, 2, 5, trace, out)
35 st_puts("T1 CONVERGE trace=" as *u8); st_trace(trace, out[0]); st_puts(" iters=" as *u8); st_putn(out[0]); st_puts(" final_gaps=" as *u8); st_putn(out[1]); st_puts(" status=" as *u8); st_status(out[2]); st_puts("\n" as *u8)
36 if out[0] == 2 { if out[1] == 0 { if out[2] == 0 { pass = pass + 1 } else { st_puts("T1 FAIL status\n" as *u8) } } else { st_puts("T1 FAIL gaps\n" as *u8) } } else { st_puts("T1 FAIL iters\n" as *u8) }
37
38 // T2 STALLED (liar-kill: no progress -> STOP EARLY, never loop forever). gaps: 2 -> 2 (stuck).
39 total = total + 1
40 seq[0] = 2; seq[1] = 2; seq[2] = 2; seq[3] = 2; seq[4] = 2
41 riv_run(seq, 5, 5, trace, out)
42 st_puts("T2 STALLED trace=" as *u8); st_trace(trace, out[0]); st_puts(" iters=" as *u8); st_putn(out[0]); st_puts(" final_gaps=" as *u8); st_putn(out[1]); st_puts(" status=" as *u8); st_status(out[2]); st_puts("\n" as *u8)
43 if out[2] == 2 { if out[0] == 2 { pass = pass + 1 } else { st_puts("T2 FAIL did-not-stop-early\n" as *u8) } } else { st_puts("T2 FAIL not-stalled\n" as *u8) }
44
45 // T3 BUDGET (decreasing but hits the cap -> stop, report remaining gaps honestly). gaps: 3 -> 2 -> 1, cap 3.
46 total = total + 1
47 seq[0] = 3; seq[1] = 2; seq[2] = 1
48 riv_run(seq, 3, 3, trace, out)
49 st_puts("T3 BUDGET trace=" as *u8); st_trace(trace, out[0]); st_puts(" iters=" as *u8); st_putn(out[0]); st_puts(" final_gaps=" as *u8); st_putn(out[1]); st_puts(" status=" as *u8); st_status(out[2]); st_puts("\n" as *u8)
50 if out[2] == 1 { if out[1] == 1 { pass = pass + 1 } else { st_puts("T3 FAIL remaining-gaps\n" as *u8) } } else { st_puts("T3 FAIL not-budget\n" as *u8) }
51
52 // T4 riv_next unit decisions
53 total = total + 1
54 var t4: i64 = 1
55 if riv_next(0, 0, 5, 9) != 0 { t4 = 0 } // grounded
56 if riv_next(2, 4, 5, 9) != 1 { t4 = 0 } // budget (iter+1>=max)
57 if riv_next(2, 1, 5, 2) != 2 { t4 = 0 } // stalled (gaps>=prev)
58 if riv_next(2, 1, 5, 9) != 3 { t4 = 0 } // continue
59 if t4 == 1 { pass = pass + 1 } else { st_puts("T4 FAIL riv_next\n" as *u8) }
60
61 // T5 riv_gaps aggregation
62 total = total + 1
63 var t5: i64 = 1
64 if riv_gaps(1, 0, 0) != 1 { t5 = 0 }
65 if riv_gaps(2, 1, 3) != 6 { t5 = 0 }
66 if t5 == 1 { pass = pass + 1 } else { st_puts("T5 FAIL riv_gaps\n" as *u8) }
67
68 // T6 determinism
69 total = total + 1
70 seq[0] = 3; seq[1] = 2; seq[2] = 1
71 riv_run(seq, 3, 3, trace, out)
72 riv_run(seq, 3, 3, trace, out2)
73 var t6: i64 = 1
74 if out[0] != out2[0] { t6 = 0 }
75 if out[1] != out2[1] { t6 = 0 }
76 if out[2] != out2[2] { t6 = 0 }
77 if t6 == 1 { pass = pass + 1 } else { st_puts("T6 FAIL not-deterministic\n" as *u8) }
78
79 st_puts("RESEARCH-INVESTIGATE " as *u8); st_putn(pass); st_puts("/" as *u8); st_putn(total); st_puts("\n" as *u8)
80 if pass == total { st_puts("RESEARCH-INVESTIGATE ALL-PASS\n" as *u8); sys_exit(0) }
81 sys_exit(1)
82 return 1
83}