code wiki / _hdl_build / nx_survey_ws_register.nx
nx_survey_ws_register.nx source
↩ module page · 124 lines · 4642 B
1// nx_survey_ws_register.nx -- register the SURVEY/PULSE arc as a LIVE workstream in the WMS registry
2// (orchestration over contention: the machine SSOT owns the stream, the board shows it ALIVE, the
3// dispatcher can machine-verify it via code_link). Exact clone of nx_project_ws_register (pwr_ ->
4// swr_): per-prefix wlock across the ws:ids RMW + ws:<id> write; idempotent; READBACK-verified.
5// code_link = nx_survey_stats_gate (47/47 KAT+adversary gate = the machine-verifiable proof).
6// expect_exit: 0 license_tier: ORIGINAL
7import "nx_ws_cas.nx"
8import "nx_heartbeat_str.nx"
9const SWR_MAGIC_1024: i64 = 1024
10
11const SWR_ID: *u8 = "SURVEY-PULSE-01"
12const SWR_MEM: *u8 = "project-nishi-survey-pulse-2026-07-10"
13const SWR_HB: *u8 = "knowledge/status/wms_heartbeat.log"
14
15func swr_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
16func swr_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 }
17func swr_n(dst: *u8, off: i64, v: i64) -> i64 {
18 var o: i64 = off
19 var m: i64 = v
20 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m }
21 let t: *u8 = sys_mmap(28)
22 var k: i64 = 0
23 if m == 0 { t[0] = 48 as u8; k = 1 }
24 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
25 var i: i64 = 0
26 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 }
27 return o + k
28}
29
30func swr_register(id: *u8, state: *u8, code: *u8) -> i64 {
31 let wp: *u8 = WS_PREFIX
32 let lp: *u8 = sys_mmap(512)
33 var i: i64 = 0
34 while wp[i] != (0 as u8) { lp[i] = wp[i]; i = i + 1 }
35 let suf: *u8 = "wlock"
36 var s: i64 = 0
37 while suf[s] != (0 as u8) { lp[i] = suf[s]; i = i + 1; s = s + 1 }
38 lp[i] = 0 as u8
39 let lfd: i64 = sys_openat_append(lp, 0x1a4)
40 if lfd >= 0 { sys_flock(lfd, SYS_LOCK_EX) }
41
42 let key: *u8 = sys_mmap(192)
43 key[0] = 119 as u8
44 key[1] = 115 as u8
45 key[2] = 58 as u8
46 var k: i64 = 0
47 while id[k] != (0 as u8) { key[3 + k] = id[k]; k = k + 1 }
48 key[3 + k] = 0 as u8
49
50 let rec: *u8 = sys_mmap(SWR_MAGIC_1024)
51 var o: i64 = 0
52 o = swr_cat(rec, o, id)
53 rec[o] = 9 as u8
54 o = o + 1
55 o = swr_cat(rec, o, "E-SVY" as *u8)
56 rec[o] = 9 as u8
57 o = o + 1
58 o = swr_cat(rec, o, state)
59 rec[o] = 9 as u8
60 o = o + 1
61 o = swr_n(rec, o, sys_now_realtime_sec())
62 rec[o] = 9 as u8
63 o = o + 1
64 o = swr_cat(rec, o, SWR_MEM)
65 rec[o] = 9 as u8
66 o = o + 1
67 o = swr_cat(rec, o, code)
68 rec[o] = 9 as u8
69 o = o + 1
70 o = swr_cat(rec, o, "-" as *u8)
71 rec[o] = 0 as u8
72 ws_put_p(WS_PREFIX, key, rec)
73
74 let pq: *i64 = sys_mmap(16) as *i64
75 let lq: *i64 = sys_mmap(16) as *i64
76 if ss_get(WS_PREFIX, "ws:ids" as *u8, pq, lq) == 1 {
77 let ids: *u8 = pq[0] as *u8
78 let idn: i64 = lq[0]
79 if ws_member(ids, idn, id) == 0 {
80 let nb: *u8 = sys_mmap(idn + 192)
81 var c: i64 = 0
82 while c < idn { nb[c] = ids[c]; c = c + 1 }
83 nb[c] = 9 as u8
84 c = c + 1
85 var d: i64 = 0
86 while id[d] != (0 as u8) { nb[c] = id[d]; c = c + 1; d = d + 1 }
87 nb[c] = 0 as u8
88 ws_put_p(WS_PREFIX, "ws:ids" as *u8, nb)
89 }
90 }
91 if lfd >= 0 { sys_flock(lfd, SYS_LOCK_UN); sys_close(lfd) }
92 return 0
93}
94
95func main() -> i64 {
96 swr_puts("=== nx_survey_ws_register -- the SURVEY/PULSE arc into the WMS registry (E-SVY, code_link=nx_survey_stats_gate) ===\n" as *u8)
97 swr_register(SWR_ID, "ACTIVE" as *u8, "nx_survey_stats_gate" as *u8)
98 hb_beat_s(SWR_HB, SWR_ID, 1)
99 // READBACK verify (never assert without reading it back)
100 let pq: *i64 = sys_mmap(16) as *i64
101 let lq: *i64 = sys_mmap(16) as *i64
102 var ok: i64 = 0
103 if ss_get(WS_PREFIX, "ws:SURVEY-PULSE-01" as *u8, pq, lq) == 1 {
104 if lq[0] > 0 {
105 let rb: *u8 = pq[0] as *u8
106 var i: i64 = 0
107 var hit: i64 = 0
108 while i + 5 <= lq[0] {
109 if rb[i] == (69 as u8) { if rb[i+1] == (45 as u8) { if rb[i+2] == (83 as u8) { if rb[i+3] == (86 as u8) { if rb[i+4] == (89 as u8) { hit = 1 } } } } }
110 i = i + 1
111 }
112 if hit == 1 { ok = 1 }
113 }
114 }
115 if ok == 1 {
116 swr_puts("readback=OK (ws:SURVEY-PULSE-01 carries E-SVY) heartbeat=BEATEN\n" as *u8)
117 swr_puts("verdict=GREEN (the survey arc is a registered, machine-verifiable workstream on the board)\n" as *u8)
118 sys_exit(0)
119 return 0
120 }
121 swr_puts("verdict=RED (readback missing)\n" as *u8)
122 sys_exit(1)
123 return 1
124}