code wiki / _hdl_build / nx_arch_board.nx
nx_arch_board.nx source
↩ module page · 870 lines · 45843 B
1// nx_arch_board.nx -- THE TEAM'S STANDING JUDGMENT OF THE FAMILY TREE (operator 2026-07-16: "get the nishi
2// team and architect and builder and pm and all that logically evaluating our family tree and making sure
3// we are doing state of the art architecture"). This is the ARCH DRIFT RATCHET rung (mom 13) of the
4// ecosystem-design review, built as a COMPOSER: it fork+execs the existing sovereign instruments (small
5// sharp tools -> curated capability, per the mcp-coverage doctrine) and adds the two metrics no instrument
6// carried (visibility violations = rung mom-29; validation depth = rung mom-22; base-change advisory =
7// rung mom-3). Every metric row is DATA-DRIVEN (knowledge/registry/arch_policy.data: metric|role|weight|
8// direction|target) and RATCHETED against a banked baseline (knowledge/registry/arch_baseline.data):
9// improvements tighten the limit automatically, so erosion can never be silent -- limit = min(target,
10// baseline) for `le` metrics, max for `ge`. Each row is attributed to the accountable ROLE (architect/
11// janitor/examiner/...), and the failing rows sorted by momentum-weight ARE the PM's ranked worklist.
12// Composes (never rebuilds): nx_eco_graph_arch (cycles/propagation/fan-in) + nx_dup_detect (fused dup
13// clusters) + nx_eco_rooted_set (islands) + nx_capability_placement (RACI placement violations).
14// nx_arch_board gate -- adversarial self-test of the ratchet verdict
15// nx_arch_board run <store-prefix> [core-dir] [organ-dir] -- judge; exit 0 GREEN / 1 RED
16// nx_arch_board bank <store-prefix> [core-dir] [organ-dir] -- judge + bank baseline (refuses on any
17// instrument failure -- never bank a broken measurement)
18// license_tier: ORIGINAL module: nishi-core.architect.arch_board
19import "nx_syscalls.nx"
20import "nx_eco_graph.nx"
21import "nx_seg_store.nx"
22const AB_MAGIC_2166136261: i64 = 2166136261
23const AB_MAGIC_16777619: i64 = 16777619
24const AB_MAGIC_4611686018427387903: i64 = 4611686018427387903
25const AB_MAGIC_4294967295: i64 = 4294967295
26const AB_MAGIC_65536: i64 = 65536
27const AB_MAGIC_12345: i64 = 12345
28const AB_MAGIC_99999: i64 = 99999
29const AB_MAGIC_262144: i64 = 262144
30const AB_MAGIC_1000003: i64 = 1000003
31const AB_MAGIC_131072: i64 = 131072
32const AB_MAGIC_16384: i64 = 16384
33const AB_MAGIC_1048576: i64 = 1048576
34
35const AB_ZSLOTS: i64 = 65536
36const AB_ZARENA: i64 = 2097152
37const AB_OUTCAP: i64 = 1048576
38const AB_MAXROW: i64 = 32
39// verdicts
40const AB_PASS: i64 = 1
41const AB_RED: i64 = 2
42const AB_NOTICE: i64 = 3
43// metric-value indices (mv array)
44const MV_CYCLES: i64 = 0
45const MV_AVGDEP: i64 = 1
46const MV_FANIN: i64 = 2
47const MV_VIS: i64 = 3
48const MV_VAL: i64 = 4
49const MV_ISL: i64 = 5
50const MV_DUP: i64 = 6
51const MV_PLACE: i64 = 7
52const MV_BASEH: i64 = 8
53const MV_ISLU: i64 = 9
54const MV_DP: i64 = 10
55const MV_N: i64 = 11
56
57func ab_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
58func ab_pn(v: i64) -> i64 {
59 var m: i64 = v; if m < 0 { ab_p("-" as *u8); m = 0 - m }
60 let t: *u8 = sys_mmap(24); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 }
61 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
62 let o: *u8 = sys_mmap(24); var i: i64 = 0; while i < k { o[i] = t[k-1-i]; i = i + 1 } sys_write(1, o, k)
63 sys_munmap(t, 24); sys_munmap(o, 24); return 0
64}
65func ab_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
66func ab_streq(a: *u8, b: *u8) -> i64 { var i: i64 = 0; while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } if b[i] != (0 as u8) { return 0 } return 1 }
67// equality of buf[ao..ao+al) against NUL-terminated b (exact, both-terminate)
68func ab_memeq_s(a: *u8, ao: i64, al: i64, b: *u8) -> i64 {
69 var i: i64 = 0
70 while i < al { if b[i] == (0 as u8) { return 0 } if a[ao+i] != b[i] { return 0 } i = i + 1 }
71 if b[al] != (0 as u8) { return 0 }
72 return 1
73}
74// does buf[o..o+l) end with NUL-terminated suffix?
75func ab_ends(a: *u8, o: i64, l: i64, suf: *u8) -> i64 {
76 let sl: i64 = ab_slen(suf)
77 if l < sl { return 0 }
78 var i: i64 = 0
79 while i < sl { if a[o+l-sl+i] != suf[i] { return 0 } i = i + 1 }
80 return 1
81}
82// append helpers for building page/baseline buffers
83func ab_bapp(b: *u8, pos: i64, s: *u8) -> i64 { var p: i64 = pos; var i: i64 = 0; while s[i] != (0 as u8) { b[p] = s[i]; p = p + 1; i = i + 1 } return p }
84func ab_bappn(b: *u8, pos: i64, v: i64) -> i64 {
85 var p: i64 = pos; var m: i64 = v
86 if m < 0 { b[p] = 45 as u8; p = p + 1; m = 0 - m }
87 let t: *u8 = sys_mmap(24); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 }
88 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
89 var i: i64 = 0; while i < k { b[p] = t[k-1-i]; p = p + 1; i = i + 1 }
90 sys_munmap(t, 24); return p
91}
92// append buf[o..o+l) (raw bytes)
93func ab_bappb(b: *u8, pos: i64, src: *u8, o: i64, l: i64) -> i64 { var p: i64 = pos; var i: i64 = 0; while i < l { b[p] = src[o+i]; p = p + 1; i = i + 1 } return p }
94// bounded whole-file read (bounded-VSZ law: NEVER sys_read_file in organs)
95func ab_read_small(path: *u8, buf: *u8, cap: i64) -> i64 {
96 let fd: i64 = sys_openat_rd(path)
97 if fd < 0 { return 0 - 1 }
98 var n: i64 = 0; var r: i64 = 1
99 while r > 0 { r = sys_read(fd, (buf as i64 + n) as *u8, cap - 1 - n); if r > 0 { n = n + r } if n >= cap - 1 { r = 0 } }
100 sys_close(fd)
101 buf[n] = 0 as u8
102 return n
103}
104func ab_write_file(path: *u8, buf: *u8, len: i64) -> i64 {
105 let fd: i64 = sys_openat_wr(path, 420)
106 if fd < 0 { return 0 - 1 }
107 var off: i64 = 0
108 while off < len { let w: i64 = sys_write(fd, (buf as i64 + off) as *u8, len - off); if w <= 0 { sys_close(fd); return 0 - 1 } off = off + w }
109 sys_close(fd)
110 return 0
111}
112func ab_fnv(buf: *u8, len: i64) -> i64 {
113 var h: i64 = AB_MAGIC_2166136261
114 var i: i64 = 0
115 while i < len { h = h ^ (buf[i] as i64); h = (h * AB_MAGIC_16777619) & AB_MAGIC_4611686018427387903; i = i + 1 }
116 return h
117}
118// substring search: return index just AFTER key, or -1
119func ab_find(buf: *u8, blen: i64, key: *u8) -> i64 {
120 let kl: i64 = ab_slen(key)
121 if kl == 0 { return 0 - 1 }
122 var i: i64 = 0
123 while i + kl <= blen {
124 var m: i64 = 1
125 var j: i64 = 0
126 while j < kl { if buf[i+j] != key[j] { m = 0; j = kl } else { j = j + 1 } }
127 if m == 1 { return i + kl }
128 i = i + 1
129 }
130 return 0 - 1
131}
132// parse digits starting exactly at pos; -1 if none
133func ab_num_at(buf: *u8, blen: i64, pos: i64) -> i64 {
134 if pos < 0 { return 0 - 1 }
135 var v: i64 = 0; var any: i64 = 0; var i: i64 = pos
136 var go: i64 = 1
137 while go == 1 {
138 if i >= blen { go = 0 } else {
139 let c: i64 = buf[i] as i64
140 if c < 48 { go = 0 } else { if c > 57 { go = 0 } else { v = v * 10 + (c - 48); any = 1; i = i + 1 } }
141 }
142 }
143 if any == 0 { return 0 - 1 }
144 return v
145}
146func ab_num_after(buf: *u8, blen: i64, key: *u8) -> i64 { return ab_num_at(buf, blen, ab_find(buf, blen, key)) }
147// ---- SOVEREIGN STORE data plane (operator law 2026-07-16: organ data lives in knowledge/store/
148// seg-stores, NEVER new flat .txt/.tsv/.data -- the two-copy trap). The board OWNS its store
149// (producer-writes-own-data law): keys policy / baseline / fixtures / worklist. ----
150func ab_store_get(key: *u8, lenout: *i64) -> *u8 {
151 let po: *i64 = sys_mmap(16) as *i64
152 let lo: *i64 = sys_mmap(16) as *i64
153 let r: i64 = ss_get("knowledge/store/archboard-" as *u8, key, po, lo)
154 if r != 1 { lenout[0] = 0 - 1; return 0 as *u8 }
155 lenout[0] = lo[0]
156 return po[0] as *u8
157}
158func ab_store_put(key: *u8, val: *u8, vlen: i64) -> i64 {
159 let w: *i64 = ss_begin()
160 if ss_add(w, 1, key, val, vlen) != 0 { return 0 - 1 }
161 let sid: i64 = ss_next_segid("knowledge/store/archboard-" as *u8)
162 if sid < 0 { return 0 - 2 } // 0 = valid FIRST segid on a fresh store (absent manifest)
163 return ss_commit("knowledge/store/archboard-" as *u8, w, sid)
164}
165// is pat[po..po+pl) a substring of hay[ho..ho+hl)?
166func ab_contains(hay: *u8, ho: i64, hl: i64, pat: *u8, po: i64, pl: i64) -> i64 {
167 if pl == 0 { return 0 }
168 var i: i64 = 0
169 while i + pl <= hl {
170 var m: i64 = 1
171 var j: i64 = 0
172 while j < pl { if hay[ho+i+j] != pat[po+j] { m = 0; j = pl } else { j = j + 1 } }
173 if m == 1 { return 1 }
174 i = i + 1
175 }
176 return 0
177}
178// classify islands: for each line of ibuf, match against pattern lines of tbuf (`=name` exact, else
179// substring; # comments). Returns UNEXPLAINED count (prints first 10 -- the janitor's true worklist).
180func ab_islands_unexplained(ibuf: *u8, ilen: i64, tbuf: *u8, tlen: i64) -> i64 {
181 var unex: i64 = 0
182 var shown: i64 = 0
183 var ls: i64 = 0
184 var i: i64 = 0
185 while i <= ilen {
186 var eol: i64 = 0
187 if i >= ilen { eol = 1 } else { if ibuf[i] == (10 as u8) { eol = 1 } }
188 if eol == 1 {
189 var e: i64 = i
190 if e > ls { if ibuf[e-1] == (13 as u8) { e = e - 1 } }
191 if e > ls {
192 // scan patterns
193 var matched: i64 = 0
194 var pls: i64 = 0
195 var pi: i64 = 0
196 while pi <= tlen {
197 var peol: i64 = 0
198 if pi >= tlen { peol = 1 } else { if tbuf[pi] == (10 as u8) { peol = 1 } }
199 if peol == 1 {
200 var pe: i64 = pi
201 if pe > pls { if tbuf[pe-1] == (13 as u8) { pe = pe - 1 } }
202 if pe > pls { if tbuf[pls] != (35 as u8) {
203 if tbuf[pls] == (61 as u8) {
204 // exact: =name
205 if pe - pls - 1 == e - ls {
206 var eq: i64 = 1
207 var k: i64 = 0
208 while k < e - ls { if tbuf[pls+1+k] != ibuf[ls+k] { eq = 0; k = e - ls } else { k = k + 1 } }
209 if eq == 1 { matched = 1; pi = tlen }
210 }
211 } else {
212 if ab_contains(ibuf, ls, e - ls, tbuf, pls, pe - pls) == 1 { matched = 1; pi = tlen }
213 }
214 } }
215 pls = pi + 1
216 }
217 pi = pi + 1
218 }
219 if matched == 0 {
220 unex = unex + 1
221 if shown < 10 { ab_p(" [island-UNEXPLAINED] " as *u8); sys_write(1, ((ibuf as i64)+ls) as *u8, e - ls); ab_p("\n" as *u8); shown = shown + 1 }
222 }
223 }
224 ls = i + 1
225 }
226 i = i + 1
227 }
228 return unex
229}
230
231// fork + exec instrument with stdout+stderr redirected to outpath (argv built IN THE CHILD -- the proven
232// fork law); parent waits. Returns child exit code, or -1 on fork/wait failure.
233func ab_exec_capture(bin: *u8, a1: *u8, a2: *u8, outpath: *u8) -> i64 {
234 let pid: i64 = sys_fork()
235 if pid < 0 { return 0 - 1 }
236 if pid == 0 {
237 let av: *i64 = sys_mmap(48) as *i64
238 av[0] = bin as i64
239 var k: i64 = 1
240 if (a1 as i64) != 0 { av[1] = a1 as i64; k = 2; if (a2 as i64) != 0 { av[2] = a2 as i64; k = 3 } }
241 av[k] = 0
242 let ev: *i64 = sys_mmap(16) as *i64
243 ev[0] = 0
244 let fd: i64 = sys_openat_wr(outpath, 420)
245 if fd < 0 { sys_exit(112) }
246 sys_dup3(fd, 1, 0)
247 sys_dup3(fd, 2, 0)
248 sys_execve(bin, av, ev)
249 sys_exit(127)
250 }
251 let st: *i64 = sys_mmap(16) as *i64
252 let r: i64 = sys_wait4(pid, st, 0)
253 let code: i64 = (st[0] / 256) & 255
254 sys_munmap(st as *u8, 16)
255 if r < 0 { return 0 - 1 }
256 return code
257}
258
259// ---- zone table: .nx basename -> zone (1=CORE runtime/, 2=ORGAN runtime/_hdl_build/, 3=AMBIGUOUS both) ----
260func abz_hash(s: *u8, o: i64, l: i64) -> i64 { var h: i64 = AB_MAGIC_2166136261; var i: i64 = 0; while i < l { h = h ^ (s[o+i] as i64); h = (h * AB_MAGIC_16777619) & AB_MAGIC_4294967295; i = i + 1 } return h }
261// insert name (from src[so..so+sl)) with zone; returns 3 if it became ambiguous, else zone
262func abz_insert(zoff: *i64, zzone: *i64, zlen: *i64, arena: *u8, aused: *i64, src: *u8, so: i64, sl: i64, zone: i64) -> i64 {
263 var slot: i64 = abz_hash(src, so, sl) % AB_ZSLOTS
264 if slot < 0 { slot = 0 - slot }
265 var go: i64 = 1
266 var res: i64 = zone
267 while go == 1 {
268 if zoff[slot] < 0 {
269 let base: i64 = aused[0]
270 var i: i64 = 0
271 while i < sl { arena[base+i] = src[so+i]; i = i + 1 }
272 arena[base+sl] = 0 as u8
273 zoff[slot] = base; zlen[slot] = sl; zzone[slot] = zone
274 aused[0] = base + sl + 1
275 go = 0
276 } else {
277 if zlen[slot] == sl {
278 var eq: i64 = 1
279 var j: i64 = 0
280 while j < sl { if arena[zoff[slot]+j] != src[so+j] { eq = 0; j = sl } else { j = j + 1 } }
281 if eq == 1 { if zzone[slot] != zone { zzone[slot] = 3; res = 3 } go = 0 } else { slot = slot + 1; if slot >= AB_ZSLOTS { slot = 0 } }
282 } else { slot = slot + 1; if slot >= AB_ZSLOTS { slot = 0 } }
283 }
284 }
285 return res
286}
287func abz_get(zoff: *i64, zzone: *i64, zlen: *i64, arena: *u8, src: *u8, so: i64, sl: i64) -> i64 {
288 var slot: i64 = abz_hash(src, so, sl) % AB_ZSLOTS
289 if slot < 0 { slot = 0 - slot }
290 var probes: i64 = 0
291 while probes < AB_ZSLOTS {
292 if zoff[slot] < 0 { return 0 }
293 if zlen[slot] == sl {
294 var eq: i64 = 1
295 var j: i64 = 0
296 while j < sl { if arena[zoff[slot]+j] != src[so+j] { eq = 0; j = sl } else { j = j + 1 } }
297 if eq == 1 { return zzone[slot] }
298 }
299 slot = slot + 1; if slot >= AB_ZSLOTS { slot = 0 }
300 probes = probes + 1
301 }
302 return 0
303}
304// scan a directory's .nx entries into the zone table; returns count (or -1 open fail)
305func ab_scan_dir(dir: *u8, zone: i64, zoff: *i64, zzone: *i64, zlen: *i64, arena: *u8, aused: *i64, ambig: *i64) -> i64 {
306 let fd: i64 = sys_openat_rd(dir)
307 if fd < 0 { return 0 - 1 }
308 let buf: *u8 = sys_mmap(AB_MAGIC_65536)
309 var cnt: i64 = 0
310 var nr: i64 = 1
311 while nr > 0 {
312 nr = sys_getdents64(fd, buf, AB_MAGIC_65536)
313 if nr > 0 {
314 var o: i64 = 0
315 while o < nr {
316 let reclen: i64 = (buf[o+16] as i64) + ((buf[o+17] as i64) * 256)
317 if reclen <= 0 { o = nr } else {
318 let dtype: i64 = buf[o+18] as i64
319 if dtype != 4 {
320 var nl: i64 = 0
321 while buf[o+19+nl] != (0 as u8) { nl = nl + 1 }
322 if nl > 3 { if ab_ends(buf, o+19, nl, ".nx" as *u8) == 1 {
323 if abz_insert(zoff, zzone, zlen, arena, aused, buf, o+19, nl, zone) == 3 { ambig[0] = ambig[0] + 1 }
324 cnt = cnt + 1
325 } }
326 }
327 o = o + reclen
328 }
329 }
330 }
331 }
332 sys_close(fd)
333 sys_munmap(buf, AB_MAGIC_65536)
334 return cnt
335}
336
337// ---- ★THE PURE RATCHET VERDICT (gated): limit = min(target, baseline) for le / max for ge, so an
338// improvement, once banked, becomes the new floor -- erosion below a banked win is RED even when still
339// inside the policy target. ch = change-advisory (NOTICE on drift, for the base-change contract).
340// cur < 0 = instrument failure = RED (fail-closed: a broken measurement never passes). Unknown direction
341// = RED (fail-closed on policy typos).
342func ab_verdict(dir: i64, tgt: i64, hasbl: i64, bl: i64, cur: i64) -> i64 {
343 if cur < 0 { return AB_RED }
344 if dir == 1 { var lim: i64 = tgt; if hasbl == 1 { if bl < lim { lim = bl } } if cur <= lim { return AB_PASS } return AB_RED }
345 if dir == 2 { var lim2: i64 = tgt; if hasbl == 1 { if bl > lim2 { lim2 = bl } } if cur >= lim2 { return AB_PASS } return AB_RED }
346 if dir == 3 { if hasbl == 0 { return AB_PASS } if cur == bl { return AB_PASS } return AB_NOTICE }
347 return AB_RED
348}
349// effective limit (for printing) -- must mirror ab_verdict's limit math
350func ab_limit(dir: i64, tgt: i64, hasbl: i64, bl: i64) -> i64 {
351 if dir == 1 { if hasbl == 1 { if bl < tgt { return bl } } return tgt }
352 if dir == 2 { if hasbl == 1 { if bl > tgt { return bl } } return tgt }
353 return tgt
354}
355
356func ab_gate() -> i64 {
357 ab_p("=== nx_arch_board GATE -- the ratchet verdict must be un-gameable ===\n" as *u8)
358 var fail: i64 = 0
359 if ab_verdict(1, 10, 0, 0, 7) == AB_PASS { ab_p(" [PASS] le within target, no baseline -> PASS\n" as *u8) } else { ab_p(" [FAIL] T1\n" as *u8); fail = 1 }
360 if ab_verdict(1, 10, 0, 0, 11) == AB_RED { ab_p(" [PASS] le above target -> RED (policy floor holds)\n" as *u8) } else { ab_p(" [FAIL] T2\n" as *u8); fail = 1 }
361 if ab_verdict(1, 10, 1, 5, 7) == AB_RED { ab_p(" [PASS] ratchet TEETH: banked 5 < target 10, cur 7 -> RED (a banked win may not erode, even inside target)\n" as *u8) } else { ab_p(" [FAIL] T3 ratchet-tighten\n" as *u8); fail = 1 }
362 if ab_verdict(2, 600, 1, 750, 700) == AB_RED { ab_p(" [PASS] ge ratchet: banked 750 > target 600, cur 700 -> RED (depth may not drop below banked)\n" as *u8) } else { ab_p(" [FAIL] T4\n" as *u8); fail = 1 }
363 if ab_verdict(3, 0, 1, AB_MAGIC_12345, AB_MAGIC_99999) == AB_NOTICE { ab_p(" [PASS] ch drift -> NOTICE (base-change contract advisory)\n" as *u8) } else { ab_p(" [FAIL] T5\n" as *u8); fail = 1 }
364 if ab_verdict(9, 10, 0, 0, 1) == AB_RED { ab_p(" [PASS] unknown direction -> RED (fail-closed on policy typo)\n" as *u8) } else { ab_p(" [FAIL] T6\n" as *u8); fail = 1 }
365 if ab_verdict(1, 10, 1, 5, 0 - 1) == AB_RED { ab_p(" [PASS] instrument failure (cur=-1) -> RED (a broken measurement never passes)\n" as *u8) } else { ab_p(" [FAIL] T7\n" as *u8); fail = 1 }
366 if ab_verdict(1, 10, 1, 5, 4) == AB_PASS { ab_p(" [PASS] improvement under banked -> PASS (and bank tightens next)\n" as *u8) } else { ab_p(" [FAIL] T8\n" as *u8); fail = 1 }
367 // T9 store round-trip: the sovereign data plane itself must prove put->get byte-exact each build
368 var sok: i64 = 0
369 if ab_store_put("gate_probe" as *u8, "ratchet-store-alive" as *u8, 19) == 0 {
370 let glp: *i64 = sys_mmap(16) as *i64
371 let gb: *u8 = ab_store_get("gate_probe" as *u8, glp)
372 if glp[0] == 19 { if (gb as i64) != 0 {
373 var geq: i64 = 1
374 let gw: *u8 = "ratchet-store-alive" as *u8
375 var gi: i64 = 0
376 while gi < 19 { if gb[gi] != gw[gi] { geq = 0 } gi = gi + 1 }
377 if geq == 1 { sok = 1 }
378 } }
379 }
380 if sok == 1 { ab_p(" [PASS] sovereign-store round-trip (put/get byte-exact, seg-commit)\n" as *u8) } else { ab_p(" [FAIL] T9 store round-trip\n" as *u8); fail = 1 }
381 if fail == 0 { ab_p("=== GATE GREEN: erosion cannot be silent -- improvements lock in, failures fail closed ===\n" as *u8); sys_exit(0); return 0 }
382 ab_p("=== GATE RED ===\n" as *u8); sys_exit(1); return 1
383}
384
385// resolve policy metric name -> mv index (fail-closed: unknown -> -1 -> RED row)
386func ab_resolve(name: *u8, no: i64, nl: i64) -> i64 {
387 if ab_memeq_s(name, no, nl, "cycles" as *u8) == 1 { return MV_CYCLES }
388 if ab_memeq_s(name, no, nl, "avg_dependents" as *u8) == 1 { return MV_AVGDEP }
389 if ab_memeq_s(name, no, nl, "base_fanin_pct" as *u8) == 1 { return MV_FANIN }
390 if ab_memeq_s(name, no, nl, "visibility_violations" as *u8) == 1 { return MV_VIS }
391 if ab_memeq_s(name, no, nl, "validation_depth_permille" as *u8) == 1 { return MV_VAL }
392 if ab_memeq_s(name, no, nl, "islands" as *u8) == 1 { return MV_ISL }
393 if ab_memeq_s(name, no, nl, "islands_unexplained" as *u8) == 1 { return MV_ISLU }
394 if ab_memeq_s(name, no, nl, "flat_dataplanes" as *u8) == 1 { return MV_DP }
395 if ab_memeq_s(name, no, nl, "dup_clusters" as *u8) == 1 { return MV_DUP }
396 if ab_memeq_s(name, no, nl, "placement_violations" as *u8) == 1 { return MV_PLACE }
397 if ab_memeq_s(name, no, nl, "base_hash" as *u8) == 1 { return MV_BASEH }
398 return 0 - 1
399}
400func ab_vname(v: i64) -> *u8 { if v == AB_PASS { return "PASS" as *u8 } if v == AB_NOTICE { return "NOTICE" as *u8 } return "RED" as *u8 }
401
402// baseline lookup: rows "metric|value\n"; returns 1 + writes *out, else 0
403func ab_bl_get(bbuf: *u8, blen: i64, name: *u8, no: i64, nl: i64, out: *i64) -> i64 {
404 var ls: i64 = 0; var i: i64 = 0
405 while i <= blen {
406 var eol: i64 = 0
407 if i >= blen { eol = 1 } else { if bbuf[i] == (10 as u8) { eol = 1 } }
408 if eol == 1 {
409 if i > ls { if bbuf[ls] != (35 as u8) {
410 var bar: i64 = 0 - 1
411 var j: i64 = ls
412 while j < i { if bbuf[j] == (124 as u8) { bar = j; j = i } else { j = j + 1 } }
413 if bar > ls {
414 if bar - ls == nl {
415 var eq: i64 = 1
416 var k: i64 = 0
417 while k < nl { if bbuf[ls+k] != name[no+k] { eq = 0; k = nl } else { k = k + 1 } }
418 if eq == 1 { out[0] = ab_num_at(bbuf, blen, bar + 1); return 1 }
419 }
420 }
421 } }
422 ls = i + 1
423 }
424 i = i + 1
425 }
426 return 0
427}
428
429// ---- the full judgment: measure -> judge -> rank -> page -> (bank) ----
430func ab_run(store: *u8, coredir: *u8, organdir: *u8, do_bank: i64) -> i64 {
431 ab_p("=== NX ARCH BOARD -- the team's standing judgment of the family tree ===\n" as *u8)
432 // 1) run the instruments (composition, not reimplementation)
433 let x_arch: i64 = ab_exec_capture("./nx_eco_graph_arch.elf" as *u8, store, 0 as *u8, "logs/ab_arch.out" as *u8)
434 let x_dup: i64 = ab_exec_capture("./nx_dup_detect.elf" as *u8, store, 0 as *u8, "logs/ab_dup.out" as *u8)
435 let x_root: i64 = ab_exec_capture("./nx_eco_rooted_set.elf" as *u8, store, "logs/ab_islands.txt" as *u8, "logs/ab_rooted.out" as *u8)
436 let x_plc: i64 = ab_exec_capture("./nx_capability_placement.elf" as *u8, "classify" as *u8, "knowledge/registry/crew_capabilities.data" as *u8, "logs/ab_place.out" as *u8)
437 ab_p("[instruments] eco_graph_arch=" as *u8); ab_pn(x_arch)
438 ab_p(" dup_detect=" as *u8); ab_pn(x_dup)
439 ab_p(" rooted_set=" as *u8); ab_pn(x_root)
440 ab_p(" placement=" as *u8); ab_pn(x_plc); ab_p(" (exit codes; 0=ok)\n" as *u8)
441 // 2) parse instrument outputs
442 let mv: *i64 = sys_mmap(MV_N * 8) as *i64
443 var q: i64 = 0
444 while q < MV_N { mv[q] = 0 - 1; q = q + 1 }
445 let obuf: *u8 = sys_mmap(AB_OUTCAP)
446 var on: i64 = ab_read_small("logs/ab_arch.out" as *u8, obuf, AB_OUTCAP)
447 if x_arch == 0 { if on > 0 {
448 mv[MV_CYCLES] = ab_num_after(obuf, on, "nontrivial SCCs=" as *u8)
449 mv[MV_AVGDEP] = ab_num_after(obuf, on, "avg transitive dependents per organ=" as *u8)
450 let fi: i64 = ab_find(obuf, on, "direct-importers=" as *u8)
451 if fi >= 0 { let po: i64 = ab_find(obuf, on, "% of all organs)" as *u8); if po >= 0 { var ps: i64 = po - 17; var pd: i64 = ps; while pd > 0 { let c: i64 = obuf[pd-1] as i64; if c >= 48 { if c <= 57 { pd = pd - 1 } else { pd = 0 - pd } } else { pd = 0 - pd } } if pd < 0 { pd = 0 - pd } mv[MV_FANIN] = ab_num_at(obuf, on, pd) } }
452 } }
453 on = ab_read_small("logs/ab_dup.out" as *u8, obuf, AB_OUTCAP)
454 if x_dup == 0 { if on > 0 { mv[MV_DUP] = ab_num_after(obuf, on, "CONFIRMED-dup-clusters>=2=" as *u8) } }
455 on = ab_read_small("logs/ab_rooted.out" as *u8, obuf, AB_OUTCAP)
456 if x_root == 0 { if on > 0 { mv[MV_ISL] = ab_num_after(obuf, on, "from-god-rooted (" as *u8) } }
457 // island taxonomy (the janitor's judgment layer): raw islands minus classified compiler/gauntlet
458 // fixtures = UNEXPLAINED islands. Fail-closed: no taxonomy file -> -1 -> RED (the taxonomy must exist).
459 if x_root == 0 {
460 let ibuf: *u8 = sys_mmap(AB_MAGIC_262144)
461 let il: i64 = ab_read_small("logs/ab_islands.txt" as *u8, ibuf, AB_MAGIC_262144)
462 let tlp: *i64 = sys_mmap(16) as *i64
463 let tbuf: *u8 = ab_store_get("fixtures" as *u8, tlp)
464 let tl: i64 = tlp[0]
465 if il >= 0 { if tl > 0 { mv[MV_ISLU] = ab_islands_unexplained(ibuf, il, tbuf, tl) } }
466 ab_p("[islands] raw=" as *u8); ab_pn(mv[MV_ISL])
467 ab_p(" fixture-classified=" as *u8)
468 if mv[MV_ISLU] >= 0 { ab_pn(mv[MV_ISL] - mv[MV_ISLU]) } else { ab_p("?" as *u8) }
469 ab_p(" UNEXPLAINED=" as *u8); ab_pn(mv[MV_ISLU]); ab_p("\n" as *u8)
470 sys_munmap(ibuf, AB_MAGIC_262144)
471 // tbuf points INTO the store's read mapping (not a mapping base) -- no munmap; one-shot process
472 }
473 on = ab_read_small("logs/ab_place.out" as *u8, obuf, AB_OUTCAP)
474 if x_plc == 0 { if on > 0 { mv[MV_PLACE] = ab_num_after(obuf, on, "VIOLATIONS=" as *u8) } }
475 // 5th instrument: flat-file data-plane census (the store-law ruler, ecosystem-wide) -- rows banked
476 // to the board's store (key=dataplanes) so the eat queue is store-served, never a flat twin.
477 let x_dp: i64 = ab_exec_capture("./nx_dataplane_census.elf" as *u8, coredir, organdir, "logs/ab_dataplane.out" as *u8)
478 on = ab_read_small("logs/ab_dataplane.out" as *u8, obuf, AB_OUTCAP)
479 if x_dp == 0 { if on > 0 {
480 mv[MV_DP] = ab_num_after(obuf, on, "FLAT-DATAPLANES pairs=" as *u8)
481 ab_store_put("dataplanes" as *u8, obuf, on)
482 } }
483 ab_p("[dataplanes] census exit=" as *u8); ab_pn(x_dp)
484 ab_p(" flat (organ,path) pairs=" as *u8); ab_pn(mv[MV_DP]); ab_p(" (rows: get dataplanes)\n" as *u8)
485 // 3) zone map (disk truth) + the two inline metrics the rungs named
486 let zoff: *i64 = sys_mmap(AB_ZSLOTS * 8) as *i64
487 let zzone: *i64 = sys_mmap(AB_ZSLOTS * 8) as *i64
488 let zlen: *i64 = sys_mmap(AB_ZSLOTS * 8) as *i64
489 let zarena: *u8 = sys_mmap(AB_ZARENA)
490 let aused: *i64 = sys_mmap(16) as *i64
491 let ambig: *i64 = sys_mmap(16) as *i64
492 aused[0] = 0; ambig[0] = 0
493 var zi: i64 = 0
494 while zi < AB_ZSLOTS { zoff[zi] = 0 - 1; zi = zi + 1 }
495 let ncore: i64 = ab_scan_dir(coredir, 1, zoff, zzone, zlen, zarena, aused, ambig)
496 let norgan: i64 = ab_scan_dir(organdir, 2, zoff, zzone, zlen, zarena, aused, ambig)
497 ab_p("[zones] CORE(" as *u8); ab_p(coredir); ab_p(")=" as *u8); ab_pn(ncore)
498 ab_p(" ORGAN(" as *u8); ab_p(organdir); ab_p(")=" as *u8); ab_pn(norgan)
499 ab_p(" ambiguous-basenames=" as *u8); ab_pn(ambig[0]); ab_p("\n" as *u8)
500 // visibility: CORE node importing an ORGAN node = boundary violation (base must not see app layer)
501 let g: *EcoGraph = eg_load(store)
502 if (g as i64) == 0 { ab_p("ARCH-BOARD RED: eco_graph store load failed\n" as *u8); return 1 }
503 if ncore > 0 { if norgan > 0 {
504 var viol: i64 = 0
505 var shown: i64 = 0
506 var u: i64 = 0
507 while u < g.node_count {
508 let uoff: i64 = g.node_off[u]
509 var ul: i64 = 0
510 while g.arena[uoff+ul] != (0 as u8) { ul = ul + 1 }
511 if abz_get(zoff, zzone, zlen, zarena, g.arena, uoff, ul) == 1 {
512 var p: i64 = g.out_head[u]
513 while p < g.out_head[u+1] {
514 let v: i64 = g.out_list[p]
515 let voff: i64 = g.node_off[v]
516 var vl: i64 = 0
517 while g.arena[voff+vl] != (0 as u8) { vl = vl + 1 }
518 if abz_get(zoff, zzone, zlen, zarena, g.arena, voff, vl) == 2 {
519 viol = viol + 1
520 if shown < 32 { ab_p(" [visibility] CORE " as *u8); sys_write(1, ((g.arena as i64)+uoff) as *u8, ul); ab_p(" -> ORGAN " as *u8); sys_write(1, ((g.arena as i64)+voff) as *u8, vl); ab_p("\n" as *u8); shown = shown + 1 }
521 }
522 p = p + 1
523 }
524 }
525 u = u + 1
526 }
527 mv[MV_VIS] = viol
528 } }
529 // validation depth: of the .nx files on disk (both zones), how many have a paired _test/_gate file?
530 // HONEST SCOPE: counts PAIRED-FILE validators only (self-gating organs with a `gate` verb are not
531 // counted) and the generated stub-family inflates the numerator -- the permille is a RATCHET floor,
532 // not an absolute coverage claim.
533 var subjects: i64 = 0
534 var covered: i64 = 0
535 let cand: *u8 = sys_mmap(160)
536 zi = 0
537 while zi < AB_ZSLOTS {
538 if zoff[zi] >= 0 {
539 let noff: i64 = zoff[zi]
540 let nl: i64 = zlen[zi]
541 let stem: i64 = nl - 3
542 var isval: i64 = 0
543 if ab_ends(zarena, noff, stem, "_test" as *u8) == 1 { isval = 1 }
544 if ab_ends(zarena, noff, stem, "_gate" as *u8) == 1 { isval = 1 }
545 if isval == 0 { if stem < 120 {
546 subjects = subjects + 1
547 var cvd: i64 = 0
548 var w: i64 = 0
549 while w < stem { cand[w] = zarena[noff+w]; w = w + 1 }
550 var w2: i64 = ab_bapp(cand, stem, "_test.nx" as *u8)
551 cand[w2] = 0 as u8
552 if abz_get(zoff, zzone, zlen, zarena, cand, 0, w2) > 0 { cvd = 1 }
553 if cvd == 0 {
554 w2 = ab_bapp(cand, stem, "_gate.nx" as *u8)
555 cand[w2] = 0 as u8
556 if abz_get(zoff, zzone, zlen, zarena, cand, 0, w2) > 0 { cvd = 1 }
557 }
558 covered = covered + cvd
559 } }
560 }
561 zi = zi + 1
562 }
563 if subjects > 0 { mv[MV_VAL] = covered * 1000 / subjects }
564 // base-change contract (advisory): FNV of the two sworn-interface files
565 let fb: *u8 = sys_mmap(AB_OUTCAP)
566 let pj: *u8 = sys_mmap(256)
567 var pl: i64 = ab_bapp(pj, 0, coredir)
568 pl = ab_bapp(pj, pl, "/nx_syscalls.nx" as *u8)
569 pj[pl] = 0 as u8
570 var fn1: i64 = ab_read_small(pj, fb, AB_OUTCAP)
571 var h1: i64 = 0 - 1
572 if fn1 > 0 { h1 = ab_fnv(fb, fn1) }
573 pl = ab_bapp(pj, 0, coredir)
574 pl = ab_bapp(pj, pl, "/nx_tier.nx" as *u8)
575 pj[pl] = 0 as u8
576 var fn2: i64 = ab_read_small(pj, fb, AB_OUTCAP)
577 var h2: i64 = 0 - 1
578 if fn2 > 0 { h2 = ab_fnv(fb, fn2) }
579 if h1 >= 0 { if h2 >= 0 { mv[MV_BASEH] = (h1 ^ (h2 * AB_MAGIC_1000003)) & AB_MAGIC_4611686018427387903 } }
580 // 4) policy + baseline (SOVEREIGN STORE keys, never flat files) -> judged rows
581 let pnp: *i64 = sys_mmap(16) as *i64
582 let pbuf: *u8 = ab_store_get("policy" as *u8, pnp)
583 let pn: i64 = pnp[0]
584 if pn <= 0 { ab_p("ARCH-BOARD RED: store key `policy` absent (knowledge/store/archboard-; seed: nx_arch_board put policy <staged-file>)\n" as *u8); return 1 }
585 let bnp: *i64 = sys_mmap(16) as *i64
586 var bbuf: *u8 = ab_store_get("baseline" as *u8, bnp)
587 var bn: i64 = bnp[0]
588 if bn < 0 { bn = 0; bbuf = sys_mmap(16); ab_p("[baseline] no banked key yet -- policy targets only (run `bank` after review to arm the ratchet)\n" as *u8) }
589 // row arrays
590 let r_no: *i64 = sys_mmap(AB_MAXROW*8) as *i64
591 let r_nl: *i64 = sys_mmap(AB_MAXROW*8) as *i64
592 let r_ro: *i64 = sys_mmap(AB_MAXROW*8) as *i64
593 let r_rl: *i64 = sys_mmap(AB_MAXROW*8) as *i64
594 let r_w: *i64 = sys_mmap(AB_MAXROW*8) as *i64
595 let r_dir: *i64 = sys_mmap(AB_MAXROW*8) as *i64
596 let r_tgt: *i64 = sys_mmap(AB_MAXROW*8) as *i64
597 let r_cur: *i64 = sys_mmap(AB_MAXROW*8) as *i64
598 let r_lim: *i64 = sys_mmap(AB_MAXROW*8) as *i64
599 let r_v: *i64 = sys_mmap(AB_MAXROW*8) as *i64
600 var nrow: i64 = 0
601 var ls: i64 = 0
602 var i: i64 = 0
603 while i <= pn {
604 var eol: i64 = 0
605 if i >= pn { eol = 1 } else { if pbuf[i] == (10 as u8) { eol = 1 } }
606 if eol == 1 {
607 if i > ls { if pbuf[ls] != (35 as u8) { if nrow < AB_MAXROW {
608 // metric|role|weight|direction|target
609 var b1: i64 = 0 - 1
610 var b2: i64 = 0 - 1
611 var b3: i64 = 0 - 1
612 var b4: i64 = 0 - 1
613 var j: i64 = ls
614 while j < i { if pbuf[j] == (124 as u8) { if b1 < 0 { b1 = j } else { if b2 < 0 { b2 = j } else { if b3 < 0 { b3 = j } else { if b4 < 0 { b4 = j } } } } } j = j + 1 }
615 if b4 > 0 {
616 r_no[nrow] = ls; r_nl[nrow] = b1 - ls
617 r_ro[nrow] = b1 + 1; r_rl[nrow] = b2 - b1 - 1
618 r_w[nrow] = ab_num_at(pbuf, pn, b2 + 1)
619 var dc: i64 = 0
620 if pbuf[b3+1] == (108 as u8) { dc = 1 }
621 if pbuf[b3+1] == (103 as u8) { dc = 2 }
622 if pbuf[b3+1] == (99 as u8) { dc = 3 }
623 r_dir[nrow] = dc
624 r_tgt[nrow] = ab_num_at(pbuf, pn, b4 + 1)
625 let mi: i64 = ab_resolve(pbuf, r_no[nrow], r_nl[nrow])
626 var cur: i64 = 0 - 1
627 if mi >= 0 { cur = mv[mi] }
628 r_cur[nrow] = cur
629 let blv: *i64 = sys_mmap(16) as *i64
630 let hasbl: i64 = ab_bl_get(bbuf, bn, pbuf, r_no[nrow], r_nl[nrow], blv)
631 r_lim[nrow] = ab_limit(r_dir[nrow], r_tgt[nrow], hasbl, blv[0])
632 r_v[nrow] = ab_verdict(r_dir[nrow], r_tgt[nrow], hasbl, blv[0], cur)
633 sys_munmap(blv as *u8, 16)
634 nrow = nrow + 1
635 }
636 } } }
637 ls = i + 1
638 }
639 i = i + 1
640 }
641 // 5) print judged rows + PM-ranked worklist + health; build the page alongside
642 let page: *u8 = sys_mmap(AB_MAGIC_131072)
643 var pp: i64 = 0
644 pp = ab_bapp(page, pp, "<!-- self-emitted by nx_arch_board (census-sync law: the page cannot drift from the run) -->\n<title>Nishi Arch Board</title><h1>ARCH BOARD -- standing judgment of the family tree</h1>\n<table border=1 cellpadding=4><tr><th>role</th><th>metric</th><th>current</th><th>limit</th><th>weight</th><th>verdict</th></tr>\n" as *u8)
645 var wsum: i64 = 0
646 var wpass: i64 = 0
647 var nred: i64 = 0
648 var r: i64 = 0
649 while r < nrow {
650 ab_p("[" as *u8); sys_write(1, ((pbuf as i64)+r_ro[r]) as *u8, r_rl[r]); ab_p("] " as *u8)
651 sys_write(1, ((pbuf as i64)+r_no[r]) as *u8, r_nl[r])
652 ab_p(" = " as *u8); ab_pn(r_cur[r])
653 ab_p(" (limit " as *u8); ab_pn(r_lim[r]); ab_p(", w" as *u8); ab_pn(r_w[r]); ab_p(") -> " as *u8)
654 ab_p(ab_vname(r_v[r])); ab_p("\n" as *u8)
655 wsum = wsum + r_w[r]
656 if r_v[r] == AB_RED { nred = nred + 1 } else { wpass = wpass + r_w[r] }
657 pp = ab_bapp(page, pp, "<tr><td>" as *u8)
658 pp = ab_bappb(page, pp, pbuf, r_ro[r], r_rl[r])
659 pp = ab_bapp(page, pp, "</td><td>" as *u8)
660 pp = ab_bappb(page, pp, pbuf, r_no[r], r_nl[r])
661 pp = ab_bapp(page, pp, "</td><td>" as *u8)
662 pp = ab_bappn(page, pp, r_cur[r])
663 pp = ab_bapp(page, pp, "</td><td>" as *u8)
664 pp = ab_bappn(page, pp, r_lim[r])
665 pp = ab_bapp(page, pp, "</td><td>" as *u8)
666 pp = ab_bappn(page, pp, r_w[r])
667 pp = ab_bapp(page, pp, "</td><td>" as *u8)
668 pp = ab_bapp(page, pp, ab_vname(r_v[r]))
669 pp = ab_bapp(page, pp, "</td></tr>\n" as *u8)
670 r = r + 1
671 }
672 ab_p("--- PM-RANKED WORKLIST (momentum-weight desc; these rows ARE the priorities) ---\n" as *u8)
673 pp = ab_bapp(page, pp, "</table><h2>PM-ranked worklist</h2><ol>\n" as *u8)
674 let done: *i64 = sys_mmap(AB_MAXROW*8) as *i64
675 var d: i64 = 0
676 while d < nrow { done[d] = 0; d = d + 1 }
677 var emitted: i64 = 0
678 var pass_n: i64 = 0
679 while pass_n < nrow {
680 var best: i64 = 0 - 1
681 var bi: i64 = 0
682 while bi < nrow {
683 if done[bi] == 0 { if r_v[bi] != AB_PASS { if best < 0 { best = bi } else { if r_w[bi] > r_w[best] { best = bi } } } }
684 bi = bi + 1
685 }
686 if best >= 0 {
687 done[best] = 1
688 ab_p(" w" as *u8); ab_pn(r_w[best]); ab_p(" [" as *u8)
689 sys_write(1, ((pbuf as i64)+r_ro[best]) as *u8, r_rl[best]); ab_p("] " as *u8)
690 sys_write(1, ((pbuf as i64)+r_no[best]) as *u8, r_nl[best])
691 ab_p(" cur=" as *u8); ab_pn(r_cur[best]); ab_p(" limit=" as *u8); ab_pn(r_lim[best])
692 ab_p(" -> " as *u8); ab_p(ab_vname(r_v[best])); ab_p("\n" as *u8)
693 pp = ab_bapp(page, pp, "<li>w" as *u8)
694 pp = ab_bappn(page, pp, r_w[best])
695 pp = ab_bapp(page, pp, " [" as *u8)
696 pp = ab_bappb(page, pp, pbuf, r_ro[best], r_rl[best])
697 pp = ab_bapp(page, pp, "] " as *u8)
698 pp = ab_bappb(page, pp, pbuf, r_no[best], r_nl[best])
699 pp = ab_bapp(page, pp, " -> " as *u8)
700 pp = ab_bapp(page, pp, ab_vname(r_v[best]))
701 pp = ab_bapp(page, pp, "</li>\n" as *u8)
702 emitted = emitted + 1
703 } else { pass_n = nrow }
704 pass_n = pass_n + 1
705 }
706 if emitted == 0 { ab_p(" (empty -- every judged axis is at or better than its ratchet)\n" as *u8); pp = ab_bapp(page, pp, "<li>(empty -- all axes at or better than ratchet)</li>\n" as *u8) }
707 var health: i64 = 0
708 if wsum > 0 { health = wpass * 1000 / wsum }
709 ab_p("--- BOARD: rows=" as *u8); ab_pn(nrow)
710 ab_p(" health=" as *u8); ab_pn(health)
711 ab_p("/1000 RED=" as *u8); ab_pn(nred)
712 if nred == 0 { ab_p(" verdict=GREEN (ratchet intact)\n" as *u8) } else { ab_p(" verdict=RED (regression or instrument failure -- eat before feature work, per the eat-debt law)\n" as *u8) }
713 pp = ab_bapp(page, pp, "</ol><h2>Verdict: " as *u8)
714 if nred == 0 { pp = ab_bapp(page, pp, "GREEN" as *u8) } else { pp = ab_bapp(page, pp, "RED" as *u8) }
715 pp = ab_bapp(page, pp, " -- health " as *u8)
716 pp = ab_bappn(page, pp, health)
717 pp = ab_bapp(page, pp, "/1000</h2>\n" as *u8)
718 ab_write_file("knowledge/arch_board.html" as *u8, page, pp)
719 ab_p("[page] knowledge/arch_board.html emitted (" as *u8); ab_pn(pp); ab_p(" bytes)\n" as *u8)
720 // 6) bank (atomic, refuses on any instrument failure)
721 if do_bank == 1 {
722 var anyfail: i64 = 0
723 r = 0
724 while r < nrow { if r_cur[r] < 0 { anyfail = 1 } r = r + 1 }
725 if anyfail == 1 { ab_p("BANK REFUSED: an instrument failed (cur<0) -- never bank a broken measurement (fail-safe)\n" as *u8); return 4 }
726 let bl2: *u8 = sys_mmap(AB_MAGIC_16384)
727 var bp: i64 = ab_bapp(bl2, 0, "# archboard store key=baseline -- banked by nx_arch_board bank; the ratchet: limits tighten to these\n" as *u8)
728 r = 0
729 while r < nrow {
730 bp = ab_bappb(bl2, bp, pbuf, r_no[r], r_nl[r])
731 bp = ab_bapp(bl2, bp, "|" as *u8)
732 bp = ab_bappn(bl2, bp, r_cur[r])
733 bp = ab_bapp(bl2, bp, "\n" as *u8)
734 r = r + 1
735 }
736 if ab_store_put("baseline" as *u8, bl2, bp) == 0 {
737 ab_p("[bank] baseline banked to the SOVEREIGN STORE (key=baseline, " as *u8); ab_pn(nrow); ab_p(" metrics; seg-commit atomic) -- the ratchet is armed at today's truth\n" as *u8)
738 } else { ab_p("[bank] STORE PUT FAILED -- baseline unchanged (fail-safe)\n" as *u8); return 4 }
739 }
740 if nred == 0 { return 0 }
741 return 1
742}
743
744// ---- validation WORKLIST emitter (the w22 rung as a CONSUMABLE QUEUE, not a campaign): every disk-present
745// organ lacking a paired _test/_gate, ranked by graph fan-in (risk = how many organs depend on the ungated
746// one). Emits knowledge/registry/validation_worklist.data rows `fanin|name` (top 200) -- the forge/team's
747// inbound queue; the PM eats from the top. ----
748func ab_worklist(store: *u8, coredir: *u8, organdir: *u8) -> i64 {
749 let g: *EcoGraph = eg_load(store)
750 if (g as i64) == 0 { ab_p("worklist: store load failed\n" as *u8); return 1 }
751 let zoff: *i64 = sys_mmap(AB_ZSLOTS * 8) as *i64
752 let zzone: *i64 = sys_mmap(AB_ZSLOTS * 8) as *i64
753 let zlen: *i64 = sys_mmap(AB_ZSLOTS * 8) as *i64
754 let zarena: *u8 = sys_mmap(AB_ZARENA)
755 let aused: *i64 = sys_mmap(16) as *i64
756 let ambig: *i64 = sys_mmap(16) as *i64
757 aused[0] = 0; ambig[0] = 0
758 var zi: i64 = 0
759 while zi < AB_ZSLOTS { zoff[zi] = 0 - 1; zi = zi + 1 }
760 ab_scan_dir(coredir, 1, zoff, zzone, zlen, zarena, aused, ambig)
761 ab_scan_dir(organdir, 2, zoff, zzone, zlen, zarena, aused, ambig)
762 // candidates: graph nodes present on disk, not themselves validators, with no paired validator
763 let cfan: *i64 = sys_mmap((g.node_count + 2) * 8) as *i64
764 let cidx: *i64 = sys_mmap((g.node_count + 2) * 8) as *i64
765 var nc: i64 = 0
766 let cand: *u8 = sys_mmap(160)
767 var i: i64 = 0
768 while i < g.node_count {
769 let off: i64 = g.node_off[i]
770 var l: i64 = 0
771 while g.arena[off+l] != (0 as u8) { l = l + 1 }
772 if abz_get(zoff, zzone, zlen, zarena, g.arena, off, l) > 0 { if l > 3 { if l < 120 {
773 let stem: i64 = l - 3
774 var isval: i64 = 0
775 if ab_ends(g.arena, off, stem, "_test" as *u8) == 1 { isval = 1 }
776 if ab_ends(g.arena, off, stem, "_gate" as *u8) == 1 { isval = 1 }
777 if isval == 0 {
778 var w: i64 = 0
779 while w < stem { cand[w] = g.arena[off+w]; w = w + 1 }
780 var cv: i64 = 0
781 var w2: i64 = ab_bapp(cand, stem, "_test.nx" as *u8)
782 if abz_get(zoff, zzone, zlen, zarena, cand, 0, w2) > 0 { cv = 1 }
783 if cv == 0 { w2 = ab_bapp(cand, stem, "_gate.nx" as *u8); if abz_get(zoff, zzone, zlen, zarena, cand, 0, w2) > 0 { cv = 1 } }
784 if cv == 0 { cfan[nc] = g.in_head[i+1] - g.in_head[i]; cidx[nc] = i; nc = nc + 1 }
785 }
786 } } }
787 i = i + 1
788 }
789 // emit top 200 by fan-in (selection; ties keep first)
790 let out: *u8 = sys_mmap(AB_MAGIC_65536)
791 var op: i64 = ab_bapp(out, 0, "# archboard store key=worklist -- ungated organs ranked by fan-in (risk); emitted by nx_arch_board worklist.\n# Consume from the top: gate the organs the most of the ecosystem depends on. rows: fanin|name\n" as *u8)
792 var emitted: i64 = 0
793 while emitted < 200 {
794 var best: i64 = 0 - 1
795 var bi: i64 = 0
796 while bi < nc { if cfan[bi] >= 0 { if best < 0 { best = bi } else { if cfan[bi] > cfan[best] { best = bi } } } bi = bi + 1 }
797 if best < 0 { emitted = 200 } else {
798 op = ab_bappn(out, op, cfan[best])
799 op = ab_bapp(out, op, "|" as *u8)
800 let boff: i64 = g.node_off[cidx[best]]
801 var bl: i64 = 0
802 while g.arena[boff+bl] != (0 as u8) { bl = bl + 1 }
803 op = ab_bappb(out, op, g.arena, boff, bl)
804 op = ab_bapp(out, op, "\n" as *u8)
805 cfan[best] = 0 - 1
806 emitted = emitted + 1
807 }
808 }
809 if ab_store_put("worklist" as *u8, out, op) == 0 {
810 ab_p("worklist: " as *u8); ab_pn(nc); ab_p(" ungated organs; top-200 by fan-in -> SOVEREIGN STORE knowledge/store/archboard- key=worklist (the forge/team inbound queue; read: nx_arch_board get worklist)\n" as *u8)
811 return 0
812 }
813 ab_p("worklist: STORE PUT FAILED\n" as *u8)
814 return 1
815}
816
817func main(argc: i64, argv: *i64) -> i64 {
818 // self-locating (cron-safe): chdir to the directory of our own ELF so every relative path
819 // (instruments, knowledge/, logs/) resolves from the nishihost home regardless of caller cwd --
820 // lets the cron row keep the sworn absolute-/nishihost/-binary shape the reconciler's taint
821 // rule requires, with no wrapper script.
822 let sp: *u8 = sys_mmap(512)
823 let sl: i64 = sys_readlinkat("/proc/self/exe" as *u8, sp, 511)
824 if sl > 0 {
825 var cut: i64 = 0 - 1
826 var si: i64 = 0
827 while si < sl { if sp[si] == (47 as u8) { cut = si } si = si + 1 }
828 if cut > 0 { sp[cut] = 0 as u8; sys_chdir(sp) }
829 }
830 if argc < 2 { return ab_gate() }
831 let verb: *u8 = argv[1] as *u8
832 if ab_streq(verb, "gate" as *u8) == 1 { return ab_gate() }
833 var core: *u8 = "buildroot/runtime" as *u8
834 var organ: *u8 = "buildroot/runtime/_hdl_build" as *u8
835 if argc >= 4 { core = argv[3] as *u8 }
836 if argc >= 5 { organ = argv[4] as *u8 }
837 if ab_streq(verb, "run" as *u8) == 1 {
838 if argc < 3 { ab_p("usage: nx_arch_board run <store-prefix> [core-dir] [organ-dir]\n" as *u8); return 2 }
839 return ab_run(argv[2] as *u8, core, organ, 0)
840 }
841 if ab_streq(verb, "bank" as *u8) == 1 {
842 if argc < 3 { ab_p("usage: nx_arch_board bank <store-prefix> [core-dir] [organ-dir]\n" as *u8); return 2 }
843 return ab_run(argv[2] as *u8, core, organ, 1)
844 }
845 if ab_streq(verb, "worklist" as *u8) == 1 {
846 if argc < 3 { ab_p("usage: nx_arch_board worklist <store-prefix> [core-dir] [organ-dir]\n" as *u8); return 2 }
847 return ab_worklist(argv[2] as *u8, core, organ)
848 }
849 // sovereign-store operator interface: policy/fixture updates stage a file then `put`; any
850 // consumer (forge, PM, human) reads via `get` -- the STORE is the only SSOT, no flat twins.
851 if ab_streq(verb, "put" as *u8) == 1 {
852 if argc < 4 { ab_p("usage: nx_arch_board put <key> <staged-file>\n" as *u8); return 2 }
853 let vb: *u8 = sys_mmap(AB_MAGIC_1048576)
854 let vn: i64 = ab_read_small(argv[3] as *u8, vb, AB_MAGIC_1048576)
855 if vn <= 0 { ab_p("put: staged file unreadable/empty\n" as *u8); return 3 }
856 if ab_store_put(argv[2] as *u8, vb, vn) == 0 { ab_p("put OK: key=" as *u8); ab_p(argv[2] as *u8); ab_p(" bytes=" as *u8); ab_pn(vn); ab_p(" (seg-commit atomic)\n" as *u8); return 0 }
857 ab_p("put FAILED\n" as *u8)
858 return 3
859 }
860 if ab_streq(verb, "get" as *u8) == 1 {
861 if argc < 3 { ab_p("usage: nx_arch_board get <key>\n" as *u8); return 2 }
862 let glp2: *i64 = sys_mmap(16) as *i64
863 let gb2: *u8 = ab_store_get(argv[2] as *u8, glp2)
864 if glp2[0] < 0 { ab_p("get: key absent\n" as *u8); return 3 }
865 sys_write(1, gb2, glp2[0])
866 return 0
867 }
868 ab_p("usage: nx_arch_board gate | run <store> [core organ] | bank <store> [core organ] | worklist <store> [core organ] | put <key> <file> | get <key>\n" as *u8)
869 return 2
870}