code wiki / _hdl_build / nx_project_ws_register.nx

nx_project_ws_register.nx source

↩ module page · 125 lines · 4707 B

1// nx_project_ws_register.nx -- register the PROJECT MANAGEMENT arc as a LIVE workstream in the WMS 2// registry (the tutor-doctrine debt: the PM system's own build managed BY the PM system). Mirrors 3// nx_pm_sclass's pms_register exactly: hold the per-prefix wlock across the ws:ids RMW AND the ws:<id> 4// record write (no nested ws_put_locked = no self-deadlock); idempotent (ws_put_p skips unchanged, 5// ws:ids appended once). code_link = nx_project_gate so the dispatcher can machine-verify + complete it. 6// Beats the string-keyed heartbeat so the board shows the stream ALIVE. Verifies by READBACK. 7// expect_exit: 0 license_tier: ORIGINAL 8import "nx_ws_cas.nx" 9import "nx_heartbeat_str.nx" 10const PWR_MAGIC_1024: i64 = 1024 11 12const PWR_ID: *u8 = "PROJECT-SOTA-01" 13const PWR_MEM: *u8 = "project-nishi-projectmgmt-sota-2026-07-09" 14const PWR_HB: *u8 = "knowledge/status/wms_heartbeat.log" 15 16func pwr_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 17func pwr_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64 = off; var i: i64 = 0; while s[i] != (0 as u8) { dst[o] = s[i]; o = o + 1; i = i + 1 } return o } 18func pwr_n(dst: *u8, off: i64, v: i64) -> i64 { 19 var o: i64 = off 20 var m: i64 = v 21 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m } 22 let t: *u8 = sys_mmap(28) 23 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 27 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 } 28 return o + k 29} 30 31func pwr_register(id: *u8, state: *u8, code: *u8) -> i64 { 32 let wp: *u8 = WS_PREFIX 33 let lp: *u8 = sys_mmap(512) 34 var i: i64 = 0 35 while wp[i] != (0 as u8) { lp[i] = wp[i]; i = i + 1 } 36 let suf: *u8 = "wlock" 37 var s: i64 = 0 38 while suf[s] != (0 as u8) { lp[i] = suf[s]; i = i + 1; s = s + 1 } 39 lp[i] = 0 as u8 40 let lfd: i64 = sys_openat_append(lp, 0x1a4) 41 if lfd >= 0 { sys_flock(lfd, SYS_LOCK_EX) } 42 43 let key: *u8 = sys_mmap(192) 44 key[0] = 119 as u8 45 key[1] = 115 as u8 46 key[2] = 58 as u8 47 var k: i64 = 0 48 while id[k] != (0 as u8) { key[3 + k] = id[k]; k = k + 1 } 49 key[3 + k] = 0 as u8 50 51 let rec: *u8 = sys_mmap(PWR_MAGIC_1024) 52 var o: i64 = 0 53 o = pwr_cat(rec, o, id) 54 rec[o] = 9 as u8 55 o = o + 1 56 o = pwr_cat(rec, o, "E-PM" as *u8) 57 rec[o] = 9 as u8 58 o = o + 1 59 o = pwr_cat(rec, o, state) 60 rec[o] = 9 as u8 61 o = o + 1 62 o = pwr_n(rec, o, sys_now_realtime_sec()) 63 rec[o] = 9 as u8 64 o = o + 1 65 o = pwr_cat(rec, o, PWR_MEM) 66 rec[o] = 9 as u8 67 o = o + 1 68 o = pwr_cat(rec, o, code) 69 rec[o] = 9 as u8 70 o = o + 1 71 o = pwr_cat(rec, o, "-" as *u8) 72 rec[o] = 0 as u8 73 ws_put_p(WS_PREFIX, key, rec) 74 75 let pq: *i64 = sys_mmap(16) as *i64 76 let lq: *i64 = sys_mmap(16) as *i64 77 if ss_get(WS_PREFIX, "ws:ids" as *u8, pq, lq) == 1 { 78 let ids: *u8 = pq[0] as *u8 79 let idn: i64 = lq[0] 80 if ws_member(ids, idn, id) == 0 { 81 let nb: *u8 = sys_mmap(idn + 192) 82 var c: i64 = 0 83 while c < idn { nb[c] = ids[c]; c = c + 1 } 84 nb[c] = 9 as u8 85 c = c + 1 86 var d: i64 = 0 87 while id[d] != (0 as u8) { nb[c] = id[d]; c = c + 1; d = d + 1 } 88 nb[c] = 0 as u8 89 ws_put_p(WS_PREFIX, "ws:ids" as *u8, nb) 90 } 91 } 92 if lfd >= 0 { sys_flock(lfd, SYS_LOCK_UN); sys_close(lfd) } 93 return 0 94} 95 96func main() -> i64 { 97 pwr_puts("=== nx_project_ws_register -- the PM arc into the WMS registry (E-PM, code_link=nx_project_gate) ===\n" as *u8) 98 pwr_register(PWR_ID, "ACTIVE" as *u8, "nx_project_gate" as *u8) 99 hb_beat_s(PWR_HB, PWR_ID, 1) 100 // READBACK verify (never assert without reading it back) 101 let pq: *i64 = sys_mmap(16) as *i64 102 let lq: *i64 = sys_mmap(16) as *i64 103 var ok: i64 = 0 104 if ss_get(WS_PREFIX, "ws:PROJECT-SOTA-01" as *u8, pq, lq) == 1 { 105 if lq[0] > 0 { 106 let rb: *u8 = pq[0] as *u8 107 var i: i64 = 0 108 var hit: i64 = 0 109 while i + 4 <= lq[0] { 110 if rb[i] == (69 as u8) { if rb[i+1] == (45 as u8) { if rb[i+2] == (80 as u8) { if rb[i+3] == (77 as u8) { hit = 1 } } } } 111 i = i + 1 112 } 113 if hit == 1 { ok = 1 } 114 } 115 } 116 if ok == 1 { 117 pwr_puts("readback=OK (ws:PROJECT-SOTA-01 carries E-PM) heartbeat=BEATEN\n" as *u8) 118 pwr_puts("verdict=GREEN (the PM arc is a registered, machine-verifiable workstream on its own board)\n" as *u8) 119 sys_exit(0) 120 return 0 121 } 122 pwr_puts("verdict=RED (readback missing)\n" as *u8) 123 sys_exit(1) 124 return 1 125}