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}