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}