code wiki / _hdl_build / nx_discover_loop.nx
nx_discover_loop.nx source
↩ module page · 81 lines · 3743 B
1// nx_discover_loop.nx -- the DURABILITY primitive for auto-discovery: refresh the LIVE registry
2// from disk AND verify completeness in one shot, so a scheduler (pulse beat / Stop-hook) has ONE
3// self-checking entry point and the 427-arc integration can never silently rot (the failure that
4// started this whole arc). Unlike nx_ws_discover_gate (which proves the mechanism on a SCRATCH
5// prefix), this checks the ACTUAL live registry the board reads: every project-*.md on disk must
6// resolve in knowledge/store/ws-. Idempotent (re-run registers 0 when nothing changed). RED if the
7// live registry is missing any arc = a real drift alarm. Sovereign. license_tier: ORIGINAL
8import "nx_ws_ingest.nx"
9import "nx_ws_index_lib.nx"
10import "nx_workstream_store.nx"
11import "nx_seg_store.nx"
12import "nx_framed_append.nx"
13import "nx_syscalls.nx"
14
15const DL_MEMDIR: *u8 = "/mnt/c/Users/elder/.claude/projects/C--Users-elder/memory"
16const DL_LOG: *u8 = "knowledge/status/discover_loop.log"
17const DL_CAP: i64 = 8192
18
19func dp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
20func dn(v: i64) -> i64 {
21 let bb: *u8 = sys_mmap(28); var m: i64 = v
22 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
23 let t: *u8 = sys_mmap(28); var k: i64 = 0
24 if m == 0 { t[0] = 48 as u8; k = 1 }
25 while m > 0 { t[k] = ((48 + (m % 10)) as u8); m = m / 10; k = k + 1 }
26 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
27 sys_write(1, bb, k); return 0
28}
29
30// coverage of the LIVE registry: how many project-*.md ids on disk resolve under WS_PREFIX.
31func dl_live_coverage(memdir: *u8, disk_out: *i64) -> i64 {
32 let names: *i64 = sys_mmap(8 * DL_CAP) as *i64
33 let mtimes: *i64 = sys_mmap(8 * DL_CAP) as *i64
34 let cnt: i64 = wme_scan(memdir, names, mtimes, DL_CAP)
35 disk_out[0] = cnt
36 if cnt < 0 { return 0 - 1 }
37 let h: *i64 = ss_open(WS_PREFIX)
38 let keybuf: *u8 = sys_mmap(512)
39 let idb: *u8 = sys_mmap(256)
40 let rq: *i64 = sys_mmap(16) as *i64
41 let rl: *i64 = sys_mmap(16) as *i64
42 var covered: i64 = 0
43 var i: i64 = 0
44 while i < cnt {
45 wsi_id_from_name(names[i] as *u8, idb)
46 wsi_build_key(idb, keybuf)
47 if ss_hget(h, keybuf, rq, rl) == 1 { covered = covered + 1 }
48 i = i + 1
49 }
50 return covered
51}
52
53func main(argc: i64, argv: *i64) -> i64 {
54 // 1) refresh the LIVE registry (idempotent).
55 let out4: *i64 = sys_mmap(64) as *i64
56 let rc: i64 = wsi_ingest(DL_MEMDIR, out4)
57 // 2) verify completeness on the LIVE registry.
58 let disk: *i64 = sys_mmap(16) as *i64
59 let covered: i64 = dl_live_coverage(DL_MEMDIR, disk)
60 let d: i64 = disk[0]
61
62 var green: i64 = 0
63 if rc >= 0 { if covered == d { if d > 0 { green = 1 } } }
64
65 dp("WS-DISCOVER-LOOP scanned=" as *u8); dn(out4[0])
66 dp(" registered_new=" as *u8); dn(out4[1]); dp(" skipped=" as *u8); dn(out4[2])
67 dp(" live_coverage=" as *u8); dn(covered); dp("/" as *u8); dn(d)
68
69 let buf: *u8 = sys_mmap(512)
70 var o: i64 = 0
71 o = fa_cat(buf, o, "DISCOVER-LOOP ts=\x00" as *u8); o = fa_catn(buf, o, sys_now_realtime_sec())
72 o = fa_cat(buf, o, " scanned=\x00" as *u8); o = fa_catn(buf, o, out4[0])
73 o = fa_cat(buf, o, " registered_new=\x00" as *u8); o = fa_catn(buf, o, out4[1])
74 o = fa_cat(buf, o, " live_coverage=\x00" as *u8); o = fa_catn(buf, o, covered)
75 o = fa_cat(buf, o, " disk=\x00" as *u8); o = fa_catn(buf, o, d)
76 if green == 1 { o = fa_cat(buf, o, " verdict=GREEN\x00" as *u8) } else { o = fa_cat(buf, o, " verdict=RED\x00" as *u8) }
77 fa_appendz(DL_LOG, buf, 512)
78
79 if green == 1 { dp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
80 dp(" verdict=RED\n" as *u8); sys_exit(1); return 1
81}