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}