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}