code wiki / _hdl_build / nx_organ_registry_gate.nx
nx_organ_registry_gate.nx source
↩ module page · 131 lines · 5453 B
1// nx_organ_registry_gate.nx -- POINTER-INTEGRITY GUARD for consolidation.
2//
3// The durable fix for "an organ vanished because consolidation deleted it and
4// left the pointers dangling" (caught live: nx_fetch, the merged research
5// fetcher, was dedup-deleted -> SOURCE-NOT-FOUND days later). Per
6// feedback-no-tool-proliferation-consolidate-or-justify + Cardinal 13
7// (additive-only: consolidation SUPERSEDES-AND-PRESERVES, never deletes a
8// superseder), this guard reads the canonical-organ registry
9// (knowledge/registry/organ_supersession.tsv) and asserts EVERY listed
10// canonical organ's source still resolves on disk. RED the instant one is
11// missing -> the consolidation breakage surfaces LOUDLY (REACTIVE pillar)
12// instead of as a mysterious build failure later.
13//
14// Liar-kill: a hardcoded BOGUS path must read as MISSING (proves the checker
15// actually stats the filesystem and isn't rubber-stamping GREEN).
16//
17// Evidence -> knowledge/status/organ_registry.log
18// Composes: nx_syscalls (file probe). license_tier: ORIGINAL
19import "nx_syscalls.nx"
20
21const REG_PATH: *u8 = "knowledge/registry/organ_supersession.tsv"
22const ORG_LOG: *u8 = "knowledge/status/organ_registry.log"
23
24func ew(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 }
25func ewn(fd: i64, v: i64) -> i64 {
26 let bb: *u8 = sys_mmap(28); var m: i64 = v
27 if m < 0 { m = 0 - m; sys_write(fd, "-" as *u8, 1) }
28 let t: *u8 = sys_mmap(28); var k: i64 = 0
29 if m == 0 { t[0] = 48; k = 1 }
30 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
31 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
32 sys_write(fd, bb, k); return 0
33}
34
35// does this source path resolve on disk?
36func org_exists(relpath: *u8) -> i64 {
37 let fd: i64 = sys_openat_rd(relpath)
38 if fd < 0 { return 0 }
39 sys_close(fd)
40 return 1
41}
42
43// copy src[a..b) into dst, NUL-terminate; return length
44func org_copy(dst: *u8, src: *u8, a: i64, b: i64) -> i64 {
45 var i: i64 = 0
46 while a + i < b { dst[i] = src[a + i]; i = i + 1 }
47 dst[i] = 0 as u8
48 return i
49}
50
51func main() -> i64 {
52 var ok: i64 = 1
53
54 // multi-target writer: stdout + the durable log
55 let namebuf: *u8 = sys_mmap(512)
56 let pathbuf: *u8 = sys_mmap(1024)
57
58 // ---- liar-kill self-test: a bogus path MUST be missing ----
59 var selftest_ok: i64 = 1
60 if org_exists("runtime/nx__bogus_sentinel_zzz__.nx" as *u8) != 0 { selftest_ok = 0; ok = 0 }
61
62 // ---- read the registry ----
63 let lb: *i64 = sys_mmap(16) as *i64
64 let data: *u8 = sys_read_file(REG_PATH, lb)
65 var rows: i64 = 0
66 var present: i64 = 0
67 var missing: i64 = 0
68 var registry_ok: i64 = 1
69 if (data as i64) == 0 { registry_ok = 0; ok = 0 }
70
71 // open the log once for the per-missing detail lines
72 let logfd: i64 = sys_openat_append(ORG_LOG, 420)
73
74 if registry_ok == 1 {
75 let n: i64 = lb[0]
76 var pos: i64 = 0
77 while pos < n {
78 // find end of line
79 var eol: i64 = pos
80 var fe: i64 = 0
81 while fe == 0 { if eol >= n { fe = 1 } else { if (data[eol] & 0xff) == 10 { fe = 1 } else { eol = eol + 1 } } }
82 // skip blank lines and comments (#...)
83 var skip: i64 = 0
84 if eol <= pos { skip = 1 }
85 if skip == 0 { if (data[pos] & 0xff) == 35 { skip = 1 } } // '#'
86 if skip == 0 {
87 // field 1 = name [pos, tab1)
88 var tab1: i64 = pos
89 var f1: i64 = 0
90 while f1 == 0 { if tab1 >= eol { f1 = 1 } else { if (data[tab1] & 0xff) == 9 { f1 = 1 } else { tab1 = tab1 + 1 } } }
91 if tab1 < eol {
92 // field 2 = relpath [tab1+1, tab2)
93 var tab2: i64 = tab1 + 1
94 var f2: i64 = 0
95 while f2 == 0 { if tab2 >= eol { f2 = 1 } else { if (data[tab2] & 0xff) == 9 { f2 = 1 } else { tab2 = tab2 + 1 } } }
96 org_copy(namebuf, data, pos, tab1)
97 org_copy(pathbuf, data, tab1 + 1, tab2)
98 rows = rows + 1
99 if org_exists(pathbuf) == 1 {
100 present = present + 1
101 } else {
102 missing = missing + 1
103 ok = 0
104 if logfd >= 1 { ew(logfd, " MISSING-CANONICAL name=" as *u8); ew(logfd, namebuf); ew(logfd, " path=" as *u8); ew(logfd, pathbuf); ew(logfd, "\n" as *u8) }
105 ew(1, " MISSING-CANONICAL name=" as *u8); ew(1, namebuf); ew(1, " path=" as *u8); ew(1, pathbuf); ew(1, "\n" as *u8)
106 }
107 }
108 }
109 pos = eol + 1
110 }
111 }
112
113 // ---- verdict to stdout + log ----
114 var fd: i64 = 1
115 while fd >= 1 {
116 ew(fd, "ORGANREGISTRYGATE authored=organ selftest_bogus_detected=" as *u8); ewn(fd, selftest_ok)
117 ew(fd, " registry_readable=" as *u8); ewn(fd, registry_ok)
118 ew(fd, " canonical_rows=" as *u8); ewn(fd, rows)
119 ew(fd, " present=" as *u8); ewn(fd, present)
120 ew(fd, " missing=" as *u8); ewn(fd, missing)
121 if ok == 1 { ew(fd, " verdict=GREEN\n" as *u8) } else { ew(fd, " verdict=RED\n" as *u8) }
122 if fd == 1 {
123 if logfd >= 1 { fd = logfd } else { fd = 0 }
124 } else {
125 sys_close(fd); fd = 0
126 }
127 }
128
129 if ok == 1 { return 0 }
130 return 1
131}