code wiki / _hdl_build / nx_teacher_role_exceed_gate.nx
nx_teacher_role_exceed_gate.nx source
↩ module page · 80 lines · 4691 B
1// nx_teacher_role_exceed_gate.nx -- proves the role grader's sovereignty check has TEETH (it is not a
2// rubber-stamp): a CLEAN organ grades sovereign, a planted forbidden dep grades NOT-sovereign, and a
3// MISSING file grades NOT-sovereign. Without this, "9/9 sovereign" could be a fake green.
4// T1 clean fixture (only nx_ imports) -> sovereign=1
5// T2[neg] fixture with a forbidden dep (python3) -> sovereign=0 (liar-kill)
6// T3[neg] fixture with a shell shebang -> sovereign=0
7// T4[neg] missing file -> sovereign=0 (cannot grade a non-existent organ)
8// GREEN iff all. Sovereign: imports nx_teacher_role_exceed + nx_syscalls. license_tier: ORIGINAL
9import "nx_teacher_role_exceed.nx"
10import "nx_syscalls.nx"
11import "nx_gate_verdict.nx"
12
13func rg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != 0 as u8 { n = n + 1 } sys_write(1, s, n); return 0 }
14func rg_putn(v: i64) -> i64 {
15 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
16 var m: i64 = v; let d: *u8 = sys_mmap(24); var k: i64 = 0
17 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
18 var j: i64 = k - 1
19 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 }
20 return 0
21}
22func rg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != 0 as u8 { dst[off + i] = s[i]; i = i + 1 } return off + i }
23func rg_catn(dst: *u8, off: i64, v: i64) -> i64 {
24 var m: i64 = v; var o: i64 = off
25 let t: *u8 = sys_mmap(28); var k: i64 = 0
26 if m == 0 { t[0] = 48 as u8; k = 1 }
27 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
28 var i: i64 = 0; while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 }
29 return o + k
30}
31func rg_join(out: *u8, a: *u8, b: *u8) -> i64 { var o: i64 = rg_cat(out, 0, a); o = rg_cat(out, o, b); out[o] = 0 as u8; return o }
32func rg_write(path: *u8, content: *u8) -> i64 {
33 let fd: i64 = sys_openat_wr(path, 0x1a4); if fd < 0 { return 0 - 1 }
34 var n: i64 = 0; while content[n] != 0 as u8 { n = n + 1 }
35 sys_write(fd, content, n); sys_close(fd); return 0
36}
37func rg_assert(label: *u8, cond: i64) -> i64 {
38 if cond != 0 { rg_puts(" [PASS] "); rg_puts(label); rg_puts("\n"); return 1 }
39 rg_puts(" [FAIL] "); rg_puts(label); rg_puts("\n"); return 0
40}
41
42func main() -> i64 {
43 rg_puts("=== nx_teacher_role_exceed_gate: the sovereignty check has teeth (liar-killed) ===\n")
44 let ep: i64 = sys_now_realtime_sec()
45 let clean: *u8 = sys_mmap(256); var c0: i64 = rg_cat(clean, 0, "/tmp/rge_clean-" as *u8); c0 = rg_catn(clean, c0, ep); c0 = rg_cat(clean, c0, ".nx" as *u8); clean[c0] = 0 as u8
46 let dirty: *u8 = sys_mmap(256); var d0: i64 = rg_cat(dirty, 0, "/tmp/rge_dirty-" as *u8); d0 = rg_catn(dirty, d0, ep); d0 = rg_cat(dirty, d0, ".nx" as *u8); dirty[d0] = 0 as u8
47 let shel: *u8 = sys_mmap(256); var s0: i64 = rg_cat(shel, 0, "/tmp/rge_shell-" as *u8); s0 = rg_catn(shel, s0, ep); s0 = rg_cat(shel, s0, ".nx" as *u8); shel[s0] = 0 as u8
48 let miss: *u8 = sys_mmap(256); var m0: i64 = rg_cat(miss, 0, "/tmp/rge_missing-" as *u8); m0 = rg_catn(miss, m0, ep); m0 = rg_cat(miss, m0, ".nx" as *u8); miss[m0] = 0 as u8
49
50 rg_write(clean, "import \"nx_syscalls.nx\"\nfunc main() -> i64 { return 0 }\n\x00" as *u8)
51 rg_write(dirty, "// drives python3 to do the work\nfunc main() -> i64 { return 0 }\n\x00" as *u8)
52 rg_write(shel, "#!/bin/sh\necho hi\n\x00" as *u8)
53
54 var pass: i64 = 0
55 var total: i64 = 0
56 var c: i64 = 0
57
58 c = 0; if re_sovereign(clean) == 1 { c = 1 }
59 total = total + 1; pass = pass + rg_assert("T1 clean organ -> sovereign=1", c)
60
61 c = 0; if re_sovereign(dirty) == 0 { c = 1 }
62 total = total + 1; pass = pass + rg_assert("T2[neg] forbidden dep (python3) -> sovereign=0", c)
63
64 c = 0; if re_sovereign(shel) == 0 { c = 1 }
65 total = total + 1; pass = pass + rg_assert("T3[neg] shell shebang -> sovereign=0", c)
66
67 c = 0; if re_sovereign(miss) == 0 { c = 1 }
68 total = total + 1; pass = pass + rg_assert("T4[neg] missing file -> sovereign=0", c)
69
70 rg_puts("\n---- nx_teacher_role_exceed gate: passed "); rg_putn(pass); rg_puts(" / "); rg_putn(total); rg_puts(" ----\n")
71 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
72 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
73 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
74 let ctr__dry: *i64 = gv_ctr()
75 ctr__dry[0] = pass
76 ctr__dry[1] = total
77 let rc__dry: i64 = gv_verdict("TEACHER-ROLE-EXCEED-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
78 sys_exit(rc__dry)
79 return rc__dry
80}