code wiki / _hdl_build / nx_census_run.nx
nx_census_run.nx source
↩ module page · 237 lines · 10458 B
1// nx_census_run.nx -- X-AUT-003: the DATA-DRIVEN coverage census (one organ, many
2// censuses -- adding a census = adding a conf row, zero rebuild: the epigenetics law
3// applied to coverage itself). PLAIN LANGUAGE: a census proves "every X has its row
4// in Y" mechanically; anything missing becomes a NAMED gap line, never a handwave.
5// conf row: C <name> <universe-file> <anchor> <mode> <target-file> <gapword>
6// universe = lines of <universe-file> containing <anchor>
7// mode=tok2 item = 2nd space-token of the line (e.g. arc names in
8// examiner_arcs.conf rows "A AWARENESS knowledge/...")
9// mode=after item = substring AFTER the anchor, up to space/tab/eol, DEDUPED
10// (e.g. step names from "PULSE-STEP name=nx_..." across many beats)
11// covered = item appears at LINE START of <target-file> followed by a TAB
12// output: CENSUS name=.. covered=N gaps=G + CENSUS-GAP census=.. item=.. rows +
13// final CENSUS-RUN censuses=N gaps_total=G verdict=COVERED|GAPS
14// -> knowledge/status/census_run.log (the Examiner grades verdict=COVERED).
15// Exit 0 = census ran (gaps are WORK, not organ failure); exit 1 = unreadable world.
16// argv[1]=census-conf argv[2]=outlog (gates use scratch worlds).
17// license_tier: ORIGINAL
18import "nx_syscalls.nx"
19const K_MAGIC_1048576: i64 = 1048576
20const K_MAGIC_1048560: i64 = 1048560
21const K_MAGIC_65536: i64 = 65536
22const K_MAGIC_65520: i64 = 65520
23const K_MAGIC_16384: i64 = 16384
24func _p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
25func _fp(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 }
26func _fn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; 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(fd,bb,k); return 0 }
27func cs_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
28func cs_read(path: *u8, buf: *u8, cap: i64) -> i64 {
29 let fd: i64 = sys_openat_rd(path)
30 if fd < 0 { return 0 }
31 var n: i64 = 0
32 var go: i64 = 1
33 while go == 1 { let base: i64 = buf as i64; let r: i64 = sys_read(fd, (base + n) as *u8, cap - n); if r <= 0 { go = 0 } else { n = n + r } if n >= cap { go = 0 } }
34 sys_close(fd)
35 return n
36}
37func cs_slice_has(hay: *u8, a: i64, b: i64, pat: *u8) -> i64 {
38 let pl: i64 = cs_len(pat)
39 if pl == 0 { return 0 }
40 var i: i64 = a
41 while i + pl <= b {
42 var k: i64 = 0
43 var hit: i64 = 1
44 while k < pl { if hay[i+k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } }
45 if hit == 1 { return 1 }
46 i = i + 1
47 }
48 return 0
49}
50// position of pat within [a,b) or -1
51func cs_slice_find(hay: *u8, a: i64, b: i64, pat: *u8) -> i64 {
52 let pl: i64 = cs_len(pat)
53 if pl == 0 { return 0 - 1 }
54 var i: i64 = a
55 while i + pl <= b {
56 var k: i64 = 0
57 var hit: i64 = 1
58 while k < pl { if hay[i+k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } }
59 if hit == 1 { return i }
60 i = i + 1
61 }
62 return 0 - 1
63}
64func cs_tok(buf: *u8, pos: i64, le: i64, pool: *u8, poff: *i64) -> i64 {
65 var t: i64 = pos
66 var s: i64 = 1
67 while s == 1 {
68 if t >= le { s = 0 }
69 else {
70 if buf[t] == (32 as u8) { s = 0 }
71 else { if buf[t] == (9 as u8) { s = 0 } else { pool[poff[0]] = buf[t]; poff[0] = poff[0] + 1; t = t + 1 } }
72 }
73 }
74 pool[poff[0]] = 0 as u8; poff[0] = poff[0] + 1
75 return t
76}
77// is item (nul-str) at any LINE START of target, followed by TAB?
78func cs_in_target(tg: *u8, tn: i64, item: *u8) -> i64 {
79 let il: i64 = cs_len(item)
80 if il == 0 { return 1 }
81 var i: i64 = 0
82 var at: i64 = 1
83 while i < tn {
84 if at == 1 {
85 if i + il < tn {
86 var k: i64 = 0
87 var hit: i64 = 1
88 while k < il { if tg[i+k] != item[k] { hit = 0; k = il } else { k = k + 1 } }
89 if hit == 1 { if tg[i+il] == (9 as u8) { return 1 } }
90 }
91 }
92 if tg[i] == (10 as u8) { at = 1 } else { at = 0 }
93 i = i + 1
94 }
95 return 0
96}
97// already collected? (dedupe set = nul-separated names in seen[0..sn))
98func cs_seen(seen: *u8, sn: i64, item: *u8) -> i64 {
99 let il: i64 = cs_len(item)
100 var i: i64 = 0
101 while i < sn {
102 var k: i64 = 0
103 var hit: i64 = 1
104 while k < il { if seen[i+k] != item[k] { hit = 0; k = il } else { k = k + 1 } }
105 if hit == 1 { if seen[i+il] == (0 as u8) { return 1 } }
106 var s: i64 = 1
107 while s == 1 { if i >= sn { s = 0 } else { if seen[i] == (0 as u8) { s = 0 } i = i + 1 } }
108 }
109 return 0
110}
111// run ONE census row; returns gaps
112func cs_one(name: *u8, up: *u8, anchor: *u8, mode2: i64, tp: *u8, lfd: i64) -> i64 {
113 let ub: *u8 = sys_mmap(K_MAGIC_1048576)
114 let un: i64 = cs_read(up, ub, K_MAGIC_1048560)
115 let tg: *u8 = sys_mmap(K_MAGIC_1048576)
116 let tn: i64 = cs_read(tp, tg, K_MAGIC_1048560)
117 let item: *u8 = sys_mmap(512)
118 let seen: *u8 = sys_mmap(K_MAGIC_65536)
119 var sn: i64 = 0
120 var covered: i64 = 0
121 var gaps: i64 = 0
122 var i: i64 = 0
123 while i < un {
124 var le: i64 = i
125 var s: i64 = 1
126 while s == 1 { if le >= un { s = 0 } else { if ub[le] == (10 as u8) { s = 0 } else { le = le + 1 } } }
127 var ap: i64 = cs_slice_find(ub, i, le, anchor)
128 // tok2 mode: the anchor must sit at LINE START (comment lines that merely
129 // mention the anchor text are not universe rows)
130 if mode2 == 1 { if ap != i { ap = 0 - 1 } }
131 if ap >= 0 {
132 var ipos: i64 = 0 - 1
133 if mode2 == 1 {
134 // tok2: skip first space-token from line start
135 var t1: i64 = i
136 var s1: i64 = 1
137 while s1 == 1 { if t1 >= le { s1 = 0 } else { if ub[t1] == (32 as u8) { s1 = 0 } else { t1 = t1 + 1 } } }
138 ipos = t1 + 1
139 } else {
140 ipos = ap + cs_len(anchor)
141 }
142 if ipos >= 0 {
143 if ipos < le {
144 // copy item to nul-str
145 var w: i64 = ipos
146 var o: i64 = 0
147 var s2: i64 = 1
148 while s2 == 1 {
149 if w >= le { s2 = 0 }
150 else {
151 if ub[w] == (32 as u8) { s2 = 0 }
152 else { if ub[w] == (9 as u8) { s2 = 0 } else { item[o] = ub[w]; o = o + 1; w = w + 1 } }
153 }
154 }
155 item[o] = 0 as u8
156 if o > 0 {
157 if cs_seen(seen, sn, item) == 0 {
158 var c: i64 = 0
159 while c <= o { seen[sn] = item[c]; sn = sn + 1; c = c + 1 }
160 if cs_in_target(tg, tn, item) == 1 { covered = covered + 1 } else {
161 gaps = gaps + 1
162 _fp(lfd, "CENSUS-GAP census=" as *u8)
163 _fp(lfd, name)
164 _fp(lfd, " item=" as *u8)
165 _fp(lfd, item)
166 _fp(lfd, "\n" as *u8)
167 }
168 }
169 }
170 }
171 }
172 }
173 i = le + 1
174 }
175 _fp(lfd, "CENSUS name=" as *u8); _fp(lfd, name)
176 _fp(lfd, " covered=" as *u8); _fn(lfd, covered)
177 _fp(lfd, " gaps=" as *u8); _fn(lfd, gaps)
178 _fp(lfd, "\n" as *u8)
179 _p(" " as *u8); _p(name); _p(": census done\n" as *u8)
180 return gaps
181}
182func main(argc: i64, argv: *i64) -> i64 {
183 var cp: *u8 = "knowledge/registry/census.conf" as *u8
184 var lp: *u8 = "knowledge/status/census_run.log" as *u8
185 if argc >= 2 { cp = argv[1] as *u8 }
186 if argc >= 3 { lp = argv[2] as *u8 }
187 _p("=== CENSUS RUN: every coverage claim proven, every gap NAMED (conf-driven) ===\n" as *u8)
188 let conf: *u8 = sys_mmap(K_MAGIC_65536)
189 let cn: i64 = cs_read(cp, conf, K_MAGIC_65520)
190 if cn <= 0 { _p(" census conf MISSING -- fail loud\n" as *u8); sys_exit(1); return 1 }
191 let lfd: i64 = sys_openat_append(lp, 0x1a4)
192 if lfd < 0 { _p(" census log open failed\n" as *u8); sys_exit(1); return 1 }
193 let pool: *u8 = sys_mmap(K_MAGIC_16384)
194 let poffb: *i64 = sys_mmap(16) as *i64
195 poffb[0] = 0
196 var ncens: i64 = 0
197 var gtotal: i64 = 0
198 var ci: i64 = 0
199 while ci < cn {
200 var le: i64 = ci
201 var scan: i64 = 1
202 while scan == 1 {
203 if le >= cn { scan = 0 }
204 else { if conf[le] == (10 as u8) { scan = 0 } else { le = le + 1 } }
205 }
206 if conf[ci] == (67 as u8) {
207 let nm: i64 = (pool as i64) + poffb[0]
208 var t: i64 = cs_tok(conf, ci + 2, le, pool, poffb)
209 let up: i64 = (pool as i64) + poffb[0]
210 t = cs_tok(conf, t + 1, le, pool, poffb)
211 let an: i64 = (pool as i64) + poffb[0]
212 t = cs_tok(conf, t + 1, le, pool, poffb)
213 // conf tokens split on space, so anchors encode spaces as '_' -- translate
214 let anp: *u8 = an as *u8
215 var ui: i64 = 0
216 while anp[ui] != (0 as u8) { if anp[ui] == (95 as u8) { anp[ui] = 32 as u8 } ui = ui + 1 }
217 let md: i64 = (pool as i64) + poffb[0]
218 t = cs_tok(conf, t + 1, le, pool, poffb)
219 let tp: i64 = (pool as i64) + poffb[0]
220 t = cs_tok(conf, t + 1, le, pool, poffb)
221 var mode2: i64 = 0
222 let mdp: *u8 = md as *u8
223 if mdp[0] == (116 as u8) { if mdp[1] == (111 as u8) { mode2 = 1 } }
224 ncens = ncens + 1
225 gtotal = gtotal + cs_one(nm as *u8, up as *u8, an as *u8, mode2, tp as *u8, lfd)
226 }
227 ci = le + 1
228 }
229 _fp(lfd, "CENSUS-RUN epoch=" as *u8); _fn(lfd, sys_now_realtime_sec())
230 _fp(lfd, " censuses=" as *u8); _fn(lfd, ncens)
231 _fp(lfd, " gaps_total=" as *u8); _fn(lfd, gtotal)
232 if gtotal == 0 { _fp(lfd, " verdict=COVERED\n" as *u8) } else { _fp(lfd, " verdict=GAPS\n" as *u8) }
233 sys_close(lfd)
234 if gtotal == 0 { _p(" CENSUS RUN: COVERED (every claim held)\n" as *u8) } else { _p(" CENSUS RUN: GAPS (named in census_run.log -- gaps are work)\n" as *u8) }
235 sys_exit(0)
236 return 0
237}