code wiki / _hdl_build / nx_route_diff.nx
nx_route_diff.nx source
↩ module page · 195 lines · 10819 B
1// nx_route_diff.nx -- toolsplane (seq162 DETECTION half). The mgmt route-set SHRINK detector: the 9-debt
2// regression class this week was routes (/api/promote,/tools/register,/cap/mint) silently vanishing on a
3// deploy. nx_api_contract catches a HARDCODED-critical route going missing; THIS catches ANY route vanishing
4// vs a captured baseline (full-set diff), transactionally: `snapshot` before a deploy, `check` after -> a
5// REMOVED route = a contract regression (exit 3 + rollback hint). Reads the live route set by fork-capturing
6// the sovereign nx_https_get.elf (GET /api, public, 127.0.0.1:8443 override) -- ZERO mgmt-binary touch. The
7// ENFORCEMENT/auto-rollback half stays mgmt-owned; this is the composable observer (orchestrator can queue
8// snapshot->deploy->check). READ-ONLY over the live API; baseline + verdict to the evidence layer.
9// nx_route_diff snapshot | check
10// ENVELOPE: 128 routes, 64KB capture, declared. exit: 0 GREEN(no shrink) | 3 RED-SHRINK | 4 fetch-fail | 2 usage.
11// license_tier: ORIGINAL expect_exit: 0
12import "nx_tool_run.nx"
13const K_MAGIC_32000: i64 = 32000
14const K_MAGIC_8000: i64 = 8000
15const K_MAGIC_65536: i64 = 65536
16const K_MAGIC_8192: i64 = 8192
17const K_MAGIC_32768: i64 = 32768
18const K_MAGIC_16384: i64 = 16384
19const K_MAGIC_16300: i64 = 16300
20const K_MAGIC_16000: i64 = 16000
21
22func rd_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
23func rd_b(rep: *u8, pos: i64, s: *u8) -> i64 { var p: i64 = pos; var i: i64 = 0; while s[i] != (0 as u8) { if p < K_MAGIC_32000 { rep[p] = s[i]; p = p + 1 } i = i + 1 } return p }
24func rd_bn(rep: *u8, pos: i64, v: i64) -> i64 { var p: i64 = pos; var m: i64 = v; if m < 0 { if p < K_MAGIC_32000 { rep[p] = 45 as u8; p = p + 1 } m = 0 - m } let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 } while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } var i: i64 = 0; while i < k { if p < K_MAGIC_32000 { rep[p] = t[k - 1 - i]; p = p + 1 } i = i + 1 } return p }
25func rd_reads(path: *u8, buf: *u8, cap: i64) -> i64 {
26 let fd: i64 = sys_openat_rd(path)
27 if fd < 0 { return 0 - 1 }
28 var n: i64 = 0
29 var go: i64 = 1
30 while go == 1 { let r: i64 = sys_read(fd, (buf as i64 + n) as *u8, cap - n); if r <= 0 { go = 0 } else { n = n + r } if n >= cap { go = 0 } }
31 sys_close(fd)
32 return n
33}
34func rd_word(buf: *u8, s: i64, e: i64, pat: *u8, pl: i64) -> i64 {
35 if pl == 0 { return 0 - 1 }
36 var i: i64 = s
37 var found: i64 = 0 - 1
38 while i + pl <= e {
39 var k: i64 = 0
40 var m: i64 = 1
41 while k < pl { if buf[i + k] != pat[k] { m = 0; k = pl } else { k = k + 1 } }
42 if m == 1 { found = i; i = e } else { i = i + 1 }
43 }
44 return found
45}
46// extract quoted route strings from buf's routes[...] array into blob (NUL-terminated), offsets in offs; return count
47func rd_extract(buf: *u8, n: i64, blob: *u8, offs: *i64, maxr: i64) -> i64 {
48 let ro: i64 = rd_word(buf, 0, n, "routes" as *u8, 6)
49 if ro < 0 { return 0 }
50 // advance to the array-open [
51 var p: i64 = ro
52 var f1: i64 = 1
53 while f1 == 1 { if p >= n { f1 = 0 } else { if buf[p] == (91 as u8) { f1 = 0 } else { p = p + 1 } } }
54 if p >= n { return 0 }
55 p = p + 1
56 var cnt: i64 = 0
57 var bp: i64 = 0
58 var go: i64 = 1
59 while go == 1 {
60 var scan: i64 = 1
61 while scan == 1 { if p >= n { scan = 0 } else { let c: i64 = buf[p]; if c == 34 { scan = 0 } else { if c == 93 { scan = 0 } else { p = p + 1 } } } }
62 if p >= n { go = 0 } else { if buf[p] == (93 as u8) { go = 0 } else {
63 let qs: i64 = p + 1
64 var qe: i64 = qs
65 var s2: i64 = 1
66 while s2 == 1 { if qe >= n { s2 = 0 } else { if buf[qe] == (34 as u8) { s2 = 0 } else { qe = qe + 1 } } }
67 if cnt < maxr { offs[cnt] = bp; var i: i64 = qs; while i < qe { if bp < K_MAGIC_8000 { blob[bp] = buf[i]; bp = bp + 1 } i = i + 1 } blob[bp] = 0 as u8; bp = bp + 1; cnt = cnt + 1 }
68 p = qe + 1
69 } }
70 }
71 return cnt
72}
73// does span [ls,le) of a equal the NUL-terminated string z?
74func rd_span_eq_z(a: *u8, ls: i64, le: i64, z: *u8) -> i64 {
75 var i: i64 = ls
76 var j: i64 = 0
77 while i < le { if z[j] == (0 as u8) { return 0 } if a[i] != z[j] { return 0 } i = i + 1; j = j + 1 }
78 if z[j] != (0 as u8) { return 0 }
79 return 1
80}
81// is NUL-term route z present as a whole line in baseline bbuf[0,bn)?
82func rd_in_baseline(bbuf: *u8, bn: i64, z: *u8) -> i64 {
83 var ls: i64 = 0
84 var i: i64 = 0
85 var hit: i64 = 0
86 while i <= bn {
87 var isend: i64 = 0
88 if i == bn { isend = 1 } else { if bbuf[i] == (10 as u8) { isend = 1 } }
89 if isend == 1 { if i > ls { if rd_span_eq_z(bbuf, ls, i, z) == 1 { hit = 1; i = bn } } ls = i + 1 }
90 i = i + 1
91 }
92 return hit
93}
94// is a baseline line [ls,le) present in the current blob route set (cnt routes)?
95func rd_line_in_cur(bbuf: *u8, ls: i64, le: i64, blob: *u8, offs: *i64, cnt: i64) -> i64 {
96 var j: i64 = 0
97 var hit: i64 = 0
98 while j < cnt { if rd_span_eq_z(bbuf, ls, le, (blob as i64 + offs[j]) as *u8) == 1 { hit = 1; j = cnt } else { j = j + 1 } }
99 return hit
100}
101func main(argc: i64, argv: *i64) -> i64 {
102 if argc < 2 { rd_w(2, "usage: nx_route_diff snapshot | check\n" as *u8); sys_exit(2); return 2 }
103 let verb: *u8 = argv[1] as *u8
104 let HG: *u8 = "/volume1/homes/elderwesto/nishihost/nx_https_get.elf" as *u8
105 let baseline: *u8 = "knowledge/status/route_baseline.txt" as *u8
106 let basetmp: *u8 = "knowledge/status/route_baseline.txt.tmp" as *u8
107 // fetch live routes
108 let cap: i64 = K_MAGIC_65536
109 let cbuf: *u8 = sys_mmap(cap + 16)
110 let olen: *i64 = sys_mmap(16) as *i64
111 let av: *i64 = sys_mmap(16 * 8) as *i64
112 av[0] = HG as i64
113 av[1] = "https://nishifamily.com/api" as *u8 as i64
114 av[2] = "127.0.0.1:8443" as *u8 as i64
115 av[3] = 0
116 let frc: i64 = tr_run_capture(HG, av, cbuf, cap, olen)
117 let cn: i64 = olen[0]
118 if frc == 127 { rd_w(1, "ROUTE-DIFF verdict=FETCH-FAIL exec-127\n" as *u8); sys_exit(4); return 4 }
119 if cn <= 0 { rd_w(1, "ROUTE-DIFF verdict=FETCH-FAIL empty\n" as *u8); sys_exit(4); return 4 }
120 let blob: *u8 = sys_mmap(K_MAGIC_8192)
121 let offs: *i64 = sys_mmap(128 * 8) as *i64
122 let cur: i64 = rd_extract(cbuf, cn, blob, offs, 128)
123 if cur <= 0 { rd_w(1, "ROUTE-DIFF verdict=FETCH-FAIL no-routes-parsed\n" as *u8); sys_exit(4); return 4 }
124 let rep: *u8 = sys_mmap(K_MAGIC_32768)
125 var p: i64 = 0
126 let v0: i64 = verb[0]
127 if v0 == 115 {
128 // snapshot: write routes one-per-line to baseline (atomic)
129 var wp: i64 = 0
130 let wbuf: *u8 = sys_mmap(K_MAGIC_16384)
131 var i: i64 = 0
132 while i < cur { var j: i64 = offs[i]; while blob[j] != (0 as u8) { if wp < K_MAGIC_16300 { wbuf[wp] = blob[j]; wp = wp + 1 } j = j + 1 } if wp < K_MAGIC_16300 { wbuf[wp] = 10 as u8; wp = wp + 1 } i = i + 1 }
133 let tfd: i64 = sys_openat_wr(basetmp, 420)
134 if tfd < 0 { rd_w(1, "ROUTE-DIFF verdict=WRITE-FAIL\n" as *u8); sys_exit(4); return 4 }
135 sys_write(tfd, wbuf, wp); sys_close(tfd); sys_renameat(basetmp, baseline)
136 p = rd_b(rep, p, "ROUTE-DIFF verb=snapshot routes=" as *u8); p = rd_bn(rep, p, cur)
137 p = rd_b(rep, p, " -> baseline knowledge/status/route_baseline.txt VERDICT=GREEN (baseline captured)\n" as *u8)
138 sys_write(1, rep, p)
139 sys_exit(0); return 0
140 }
141 // check: diff current vs baseline
142 let bbuf: *u8 = sys_mmap(K_MAGIC_16384)
143 let bn: i64 = rd_reads(baseline, bbuf, K_MAGIC_16000)
144 if bn < 0 {
145 // no baseline yet -> initialize
146 var wp2: i64 = 0
147 let wbuf2: *u8 = sys_mmap(K_MAGIC_16384)
148 var i2: i64 = 0
149 while i2 < cur { var j2: i64 = offs[i2]; while blob[j2] != (0 as u8) { if wp2 < K_MAGIC_16300 { wbuf2[wp2] = blob[j2]; wp2 = wp2 + 1 } j2 = j2 + 1 } if wp2 < K_MAGIC_16300 { wbuf2[wp2] = 10 as u8; wp2 = wp2 + 1 } i2 = i2 + 1 }
150 let tfd2: i64 = sys_openat_wr(basetmp, 420)
151 if tfd2 >= 0 { sys_write(tfd2, wbuf2, wp2); sys_close(tfd2); sys_renameat(basetmp, baseline) }
152 p = rd_b(rep, p, "ROUTE-DIFF verb=check routes=" as *u8); p = rd_bn(rep, p, cur)
153 p = rd_b(rep, p, " no-prior-baseline -> INITIALIZED VERDICT=GREEN\n" as *u8)
154 sys_write(1, rep, p)
155 let lfdi: i64 = sys_openat_append("knowledge/status/route_diff.log" as *u8, 420)
156 if lfdi >= 0 { sys_write(lfdi, rep, p); sys_close(lfdi) }
157 sys_exit(0); return 0
158 }
159 // count baseline lines + REMOVED (baseline line not in current)
160 var basec: i64 = 0
161 var removed: i64 = 0
162 p = rd_b(rep, p, "ROUTE-DIFF verb=check current=" as *u8); p = rd_bn(rep, p, cur)
163 p = rd_b(rep, p, " (caps: 128 routes, 64KB capture; source=fork nx_https_get GET /api)\nREMOVED (in baseline, GONE now): " as *u8)
164 var ls: i64 = 0
165 var i3: i64 = 0
166 while i3 <= bn {
167 var isend: i64 = 0
168 if i3 == bn { isend = 1 } else { if bbuf[i3] == (10 as u8) { isend = 1 } }
169 if isend == 1 { if i3 > ls { basec = basec + 1; if rd_line_in_cur(bbuf, ls, i3, blob, offs, cur) == 0 { removed = removed + 1; var k: i64 = ls; while k < i3 { if p < K_MAGIC_32000 { rep[p] = bbuf[k]; p = p + 1 } k = k + 1 } p = rd_b(rep, p, " " as *u8) } } ls = i3 + 1 }
170 i3 = i3 + 1
171 }
172 // ADDED (current route not in baseline)
173 p = rd_b(rep, p, "\nADDED (new since baseline): " as *u8)
174 var added: i64 = 0
175 var i4: i64 = 0
176 while i4 < cur { let z: *u8 = (blob as i64 + offs[i4]) as *u8; if rd_in_baseline(bbuf, bn, z) == 0 { added = added + 1; p = rd_b(rep, p, z); p = rd_b(rep, p, " " as *u8) } i4 = i4 + 1 }
177 p = rd_b(rep, p, "\nSUMMARY baseline=" as *u8); p = rd_bn(rep, p, basec)
178 p = rd_b(rep, p, " current=" as *u8); p = rd_bn(rep, p, cur)
179 p = rd_b(rep, p, " added=" as *u8); p = rd_bn(rep, p, added)
180 p = rd_b(rep, p, " removed=" as *u8); p = rd_bn(rep, p, removed)
181 if removed > 0 {
182 p = rd_b(rep, p, "\nVERDICT=RED-SHRINK (" as *u8); p = rd_bn(rep, p, removed)
183 p = rd_b(rep, p, " route(s) vanished = deploy contract regression; rollback: nx_mgmt POST /api/rollback then re-snapshot)\n" as *u8)
184 } else {
185 p = rd_b(rep, p, "\nVERDICT=GREEN (no route shrink)\n" as *u8)
186 }
187 sys_write(1, rep, p)
188 let lfd: i64 = sys_openat_append("knowledge/status/route_diff.log" as *u8, 420)
189 if lfd >= 0 { sys_write(lfd, rep, p); sys_close(lfd) }
190 let tfd3: i64 = sys_openat_wr("knowledge/status/route_diff.out.tmp" as *u8, 420)
191 if tfd3 >= 0 { sys_write(tfd3, rep, p); sys_close(tfd3); sys_renameat("knowledge/status/route_diff.out.tmp" as *u8, "knowledge/status/route_diff.out" as *u8) }
192 if removed > 0 { sys_exit(3); return 3 }
193 sys_exit(0)
194 return 0
195}