code wiki / _hdl_build / _xorc_parts_gate.nx
_xorc_parts_gate.nx source
↩ module page · 77 lines · 4161 B
1// _xorc_parts_gate.nx -- self-validating gate for the X-ORC role-parts chain.
2// X-ORC-006 (owner parts, live): knowledge/parts/<owner>.txt exist + non-empty.
3// X-ORC-008 (section parts, rung2): knowledge/parts/section_<name>.txt exist and are LEAD-FIRST
4// (the FIRST "owner=" line in a section file == that section's lead per sections.tsv).
5// NEG/tamper: a bogus section file must NOT exist (proves the existence checks discriminate).
6// GREEN per rung iff its checks pass; writes machine-matchable verdicts to xorc_parts_gate.log.
7import "nx_syscalls.nx"
8
9func g_puts(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
10func g_putn(fd: i64, v: i64) -> i64 {
11 let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { sys_write(fd, "-" as *u8, 1); m = 0 - m }
12 let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 }
13 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
14 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(fd, bb, k); return 0
15}
16func g_read(path: *u8, buf: *u8, cap: i64) -> i64 {
17 let fd: i64 = sys_openat_rd(path)
18 if fd < 0 { return 0 - 1 }
19 var tot: i64 = 0
20 var go: i64 = 1
21 while go == 1 {
22 let r: i64 = sys_read(fd, (buf as i64 + tot) as *u8, cap - tot)
23 if r <= 0 { go = 0 } else { tot = tot + r; if tot >= cap { go = 0 } }
24 }
25 sys_close(fd)
26 return tot
27}
28func g_exists(path: *u8) -> i64 { let fd: i64 = sys_openat_rd(path); if fd >= 0 { sys_close(fd); return 1 } return 0 }
29// is the first "owner=" value in buf[0..n) equal to name (NUL-terminated), name-terminated by a space?
30func g_first_owner_is(buf: *u8, n: i64, name: *u8) -> i64 {
31 var i: i64 = 0
32 while i + 6 < n {
33 if buf[i] == (111 as u8) { if buf[i+1] == (119 as u8) { if buf[i+2] == (110 as u8) { if buf[i+3] == (101 as u8) { if buf[i+4] == (114 as u8) { if buf[i+5] == (61 as u8) {
34 var j: i64 = 0
35 var ok: i64 = 1
36 while name[j] != (0 as u8) { if buf[i+6+j] != name[j] { ok = 0 } j = j + 1 }
37 if ok == 1 { if buf[i+6+j] == (32 as u8) { return 1 } }
38 return 0
39 } } } } } }
40 i = i + 1
41 }
42 return 0
43}
44func main(argc: i64, argv: *i64) -> i64 {
45 let buf: *u8 = sys_mmap(2097152)
46 // X-ORC-006: owner parts delivered (Engineer.txt non-empty).
47 var own_ok: i64 = 0
48 if g_read("knowledge/parts/Engineer.txt" as *u8, buf, 2097152) > 0 { own_ok = 1 }
49 // X-ORC-008: lead-first section parts. triage->Engineer, research->Researcher.
50 var sec_ok: i64 = 0
51 let n1: i64 = g_read("knowledge/parts/section_triage.txt" as *u8, buf, 2097152)
52 if n1 > 0 { if g_first_owner_is(buf, n1, "Engineer" as *u8) == 1 { sec_ok = 1 } }
53 var sec2_ok: i64 = 0
54 let n2: i64 = g_read("knowledge/parts/section_research.txt" as *u8, buf, 2097152)
55 if n2 > 0 { if g_first_owner_is(buf, n2, "Researcher" as *u8) == 1 { sec2_ok = 1 } }
56 // NEG/tamper: a bogus section must be absent.
57 var neg_ok: i64 = 0
58 if g_exists("knowledge/parts/section_zzz_nonexistent.txt" as *u8) == 0 { neg_ok = 1 }
59
60 let x006: i64 = own_ok
61 let x008: i64 = sec_ok * sec2_ok * neg_ok
62 g_puts(1, "XORC-PARTS-GATE own_ok=" as *u8); g_putn(1, own_ok)
63 g_puts(1, " sec_ok=" as *u8); g_putn(1, sec_ok); g_puts(1, " sec2_ok=" as *u8); g_putn(1, sec2_ok)
64 g_puts(1, " neg_ok=" as *u8); g_putn(1, neg_ok); g_puts(1, "\n" as *u8)
65 let lf: i64 = sys_openat_append("knowledge/status/xorc_parts_gate.log" as *u8, 420)
66 if lf >= 0 {
67 g_puts(lf, "XORC006-OWNER own_ok=" as *u8); g_putn(lf, own_ok)
68 if x006 == 1 { g_puts(lf, " verdict=GREEN\n" as *u8) } else { g_puts(lf, " verdict=RED\n" as *u8) }
69 g_puts(lf, "XORC008-SECTION sec_ok=" as *u8); g_putn(lf, sec_ok)
70 g_puts(lf, " sec2_ok=" as *u8); g_putn(lf, sec2_ok); g_puts(lf, " neg_ok=" as *u8); g_putn(lf, neg_ok)
71 if x008 == 1 { g_puts(lf, " verdict=GREEN\n" as *u8) } else { g_puts(lf, " verdict=RED\n" as *u8) }
72 sys_close(lf)
73 }
74 if x006 == 1 { if x008 == 1 { sys_exit(0) } }
75 sys_exit(1)
76 return 1
77}