code wiki / _hdl_build / nx_vizsla_ops_gate.nx

nx_vizsla_ops_gate.nx source

↩ module page · 326 lines · 14220 B

1// nx_vizsla_ops_gate.nx -- VIZSLA V6 gate: the projects+maintenance fabric is 2// gate-proven against construction-known fixtures with HAND-COUNTED day 3// arithmetic (the oracle lives in this header, not the module under test). 4// 5// today = 2026-06-10. catalog: soon_days 14; vehicle-gas {oil-change 180, 6// tire-rotation 180, registration-renewal 365}; home-hvac {filter-change 90}. 7// assets: car1 vehicle-gas, hvac1 home-hvac => 4 slots. 8// ledger (seg-4001): oil done 2026-01-15 (an OLDER 2025-11-01 row is stored 9// AFTER it -- latest date must win); tire 2025-12-20; filter 2026-02-25; 10// deck steps 1,2 done; tax step 1 done. 11// hand counts: oil Jan15->Jun10 = 16+28+31+30+31+10 = 146 days, due_in 34 OK; 12// tire Dec20->Jun10 = 11+31+28+31+30+31+10 = 172, due_in 8 <= 14 DUE; 13// filter Feb25->Jun10 = 3+31+30+31+10 = 105, due_in -15 OVERDUE; 14// registration never done = NEVER schedule-first. 15// => verdict assets=2 tasks=4 ok=1 due=1 overdue=1 never=1 16// soon_days 5 fixture (data edit ONLY): tire due_in 8 > 5 => OK; ok=2 due=0. 17// projects: deck 3 steps (1,2 done) => 2/3 next=3:railings ACTIVE; 18// tax 1 step done => COMPLETE. => projects=2 active=1 complete=1 19// 20// Rows: 21// 1 loud-fail-missing-catalog due on absent catalog => exit 1 22// 2 log-load 7 rows -> new=7 committed seg-4001 23// 3 idempotent-relog new=0 dup_instore=7 segment=none (law 10) 24// 4 latest-wins-ok oil row exact (last=2026-01-15 days=146 due_in=34 OK) 25// 5 due-soon tire row exact (due_in=8 DUE schedule) 26// 6 overdue filter row exact (due_in=-15 OVERDUE do-now) 27// 7 never-first registration NEVER schedule-first 28// 8 verdict-counts assets=2 tasks=4 ok=1 due=1 overdue=1 never=1 29// 9 data-driven-soon soon_days=5 file => tire OK, ok=2 due=0, same binary 30// 10 due-determinism byte-identical twice 31// 11 project-active deck 2/3 next=3:railings ACTIVE 32// 12 project-complete tax COMPLETE + verdict 2/1/1 33// 13 status-determinism byte-identical twice 34// Evidence: VIZSLA-OPS-GATE line -> stdout + knowledge/status/vizsla_gate.log; 35// exit 0 iff 13/13. 36// spec: knowledge/specs/2026-06-10-nishi-vizsla-ladder.md license_tier: ORIGINAL 37import "nx_syscalls.nx" 38import "nx_gate_verdict.nx" 39 40func og_slen(s: *u8) -> i64 { 41 var n: i64 = 0 42 while s[n] != (0 as u8) { n = n + 1 } 43 return n 44} 45 46func og_p(s: *u8) -> i64 { 47 sys_write(1, s, og_slen(s)) 48 return 0 49} 50 51func og_cat(dst: *u8, off: i64, s: *u8) -> i64 { 52 var i: i64 = 0 53 while s[i] != (0 as u8) { dst[off + i] = s[i]; i = i + 1 } 54 return off + i 55} 56 57func og_catn(dst: *u8, off: i64, v: i64) -> i64 { 58 var o: i64 = off 59 var m: i64 = v 60 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m } 61 let t: *u8 = sys_mmap(28) 62 var k: i64 = 0 63 if m == 0 { t[0] = 48 as u8; k = 1 } 64 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 65 var i: i64 = 0 66 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 } 67 return o + k 68} 69 70func og_write(path: *u8, content: *u8) -> i64 { 71 let fd: i64 = sys_openat_wr(path, 0x1a4) 72 if fd < 0 { return 0 - 1 } 73 sys_write(fd, content, og_slen(content)) 74 sys_close(fd) 75 return 0 76} 77 78func og_readall(path: *u8, szout: *i64) -> *u8 { 79 let fd: i64 = sys_openat_rd(path) 80 if fd < 0 { szout[0] = 0 - 1; return 0 as *u8 } 81 let sz: i64 = sys_lseek(fd, 0, 2) 82 sys_lseek(fd, 0, 0) 83 let buf: *u8 = sys_mmap(sz + 64) 84 var got: i64 = 0 85 var n: i64 = 1 86 while n > 0 { 87 n = sys_read(fd, (buf as i64 + got) as *u8, 65536) 88 if n > 0 { got = got + n } 89 } 90 sys_close(fd) 91 szout[0] = got 92 return buf 93} 94 95// run elf with argv tail from a null-terminated ptr-array (any arity); 96// stdout+stderr -> outpath; returns WEXITSTATUS or 128+sig 97func og_runv(elf: *u8, args: *i64, outpath: *u8) -> i64 { 98 let pid: i64 = sys_fork() 99 if pid == 0 { 100 if (outpath as i64) != 0 { 101 let ofd: i64 = sys_openat_wr(outpath, 0x1a4) 102 if ofd >= 0 { sys_dup3(ofd, 1, 0); sys_dup3(ofd, 2, 0) } 103 } 104 let argv: *i64 = sys_mmap(128) as *i64 105 argv[0] = elf as i64 106 var i: i64 = 0 107 var go: i64 = 1 108 while go == 1 { 109 if args[i] == 0 { go = 0 } else { 110 argv[i + 1] = args[i] 111 i = i + 1 112 } 113 } 114 argv[i + 1] = 0 115 let envp: *i64 = sys_mmap(16) as *i64 116 envp[0] = 0 117 sys_execve(elf, argv, envp) 118 sys_exit(127) 119 } 120 let st: *i64 = sys_mmap(16) as *i64 121 sys_wait4(pid, st, 0) 122 let sig: i64 = st[0] & 0x7f 123 if sig != 0 { return 128 + sig } 124 return (st[0] >> 8) & 0xff 125} 126 127func og_has(path: *u8, needle: *u8) -> i64 { 128 let szp: *i64 = sys_mmap(16) as *i64 129 let b: *u8 = og_readall(path, szp) 130 let sz: i64 = szp[0] 131 let n: i64 = og_slen(needle) 132 if sz < n { return 0 } 133 var i: i64 = 0 134 while i + n <= sz { 135 var ok: i64 = 1 136 var j: i64 = 0 137 while j < n { 138 if b[i + j] != needle[j] { ok = 0; j = n } else { j = j + 1 } 139 } 140 if ok == 1 { return 1 } 141 i = i + 1 142 } 143 return 0 144} 145 146func og_fileeq(p1: *u8, p2: *u8) -> i64 { 147 let s1: *i64 = sys_mmap(16) as *i64 148 let s2: *i64 = sys_mmap(16) as *i64 149 let b1: *u8 = og_readall(p1, s1) 150 let b2: *u8 = og_readall(p2, s2) 151 if s1[0] != s2[0] { return 0 } 152 if s1[0] <= 0 { return 0 } 153 var i: i64 = 0 154 while i < s1[0] { 155 if b1[i] != b2[i] { return 0 } 156 i = i + 1 157 } 158 return 1 159} 160 161func og_row(name: *u8, pass: i64) -> i64 { 162 og_p("ROW " as *u8) 163 og_p(name) 164 if pass == 1 { og_p(" PASS\n" as *u8) } else { og_p(" FAIL\n" as *u8) } 165 return pass 166} 167 168// build a null-terminated arg array from up to 5 ptrs (0-terminated early) 169func og_args(a1: *u8, a2: *u8, a3: *u8, a4: *u8, a5: *u8) -> *i64 { 170 let a: *i64 = sys_mmap(64) as *i64 171 a[0] = a1 as i64 172 a[1] = a2 as i64 173 a[2] = a3 as i64 174 a[3] = a4 as i64 175 a[4] = a5 as i64 176 a[5] = 0 177 return a 178} 179 180func main(argc: i64, argv: *i64) -> i64 { 181 og_p("=== VIZSLA OPS GATE: projects+maintenance fabric KATs (hand-counted days) ===\n" as *u8) 182 var ob: *u8 = "buildroot/_build/nx_vizsla_ops.sov.elf" as *u8 183 if argc > 1 { ob = argv[1] as *u8 } 184 let pr: i64 = sys_openat_rd(ob) 185 if pr >= 0 { sys_close(pr) } 186 else { 187 og_p(" instrument missing -> rebuilding via durable runner\n" as *u8) 188 og_runv("_offc/nx_sov_build_run.elf" as *u8, og_args("nx_vizsla_ops" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8), "/tmp/vzo_rebuild.out" as *u8) 189 } 190 191 // epoch-unique virgin store prefix 192 let pfx: *u8 = sys_mmap(128) 193 var po: i64 = 0 194 po = og_cat(pfx, po, "/tmp/vzoG" as *u8) 195 po = og_catn(pfx, po, sys_now_us()) 196 po = og_cat(pfx, po, "-" as *u8) 197 pfx[po] = 0 as u8 198 199 let cat: *u8 = "CONF soon_days 14\nMAINT vehicle-gas oil-change 180 engine-oil\nMAINT vehicle-gas tire-rotation 180 rotate\nMAINT vehicle-gas registration-renewal 365 state-reg\nMAINT home-hvac filter-change 90 merv-filter\n" as *u8 200 og_write("/tmp/vzo_cat.txt" as *u8, cat) 201 let cat5: *u8 = "CONF soon_days 5\nMAINT vehicle-gas oil-change 180 engine-oil\nMAINT vehicle-gas tire-rotation 180 rotate\nMAINT vehicle-gas registration-renewal 365 state-reg\nMAINT home-hvac filter-change 90 merv-filter\n" as *u8 202 og_write("/tmp/vzo_cat5.txt" as *u8, cat5) 203 let ass: *u8 = "HAVE car1 vehicle-gas family-truck\nHAVE hvac1 home-hvac main-system\n" as *u8 204 og_write("/tmp/vzo_ass.txt" as *u8, ass) 205 let lg: *u8 = "DONE 2026-01-15 car1 oil-change synthetic\nDONE 2025-11-01 car1 oil-change older-row-stored-later\nDONE 2025-12-20 car1 tire-rotation all-four\nDONE 2026-02-25 hvac1 filter-change merv13\nSTEPDONE 2026-05-01 deck 1 permits-pulled\nSTEPDONE 2026-05-20 deck 2 framing-done\nSTEPDONE 2026-04-15 tax 1 filed\n" as *u8 206 og_write("/tmp/vzo_log.txt" as *u8, lg) 207 let prj: *u8 = "PROJ deck ada backyard-deck\nSTEP deck 1 permits\nSTEP deck 2 framing\nSTEP deck 3 railings\nPROJ tax bea tax-season-2025\nSTEP tax 1 file-returns\n" as *u8 208 og_write("/tmp/vzo_prj.txt" as *u8, prj) 209 210 let fcat: *u8 = "/tmp/vzo_cat.txt" as *u8 211 let fass: *u8 = "/tmp/vzo_ass.txt" as *u8 212 let tdy: *u8 = "2026-06-10" as *u8 213 var pass: i64 = 0 214 var r: i64 = 0 215 216 // row 1: loud-fail on missing catalog 217 let rc1: i64 = og_runv(ob, og_args("due" as *u8, "/tmp/vzo_cat_NOPE.txt" as *u8, fass, pfx, tdy), "/tmp/vzo_out1.txt" as *u8) 218 r = 0 219 if rc1 == 1 { r = 1 } 220 pass = pass + og_row("loud-fail-missing-catalog" as *u8, r) 221 222 // row 2: ledger load (4 DONE + 3 STEPDONE) 223 let rc2: i64 = og_runv(ob, og_args("log" as *u8, "/tmp/vzo_log.txt" as *u8, pfx, "4001" as *u8, 0 as *u8), "/tmp/vzo_out2.txt" as *u8) 224 r = 0 225 if rc2 == 0 { 226 if og_has("/tmp/vzo_out2.txt" as *u8, "VIZSLA-OPS-LOG scanned=7 new=7 dup_infile=0 dup_instore=0 segment=seg-4001" as *u8) == 1 { r = 1 } 227 } 228 pass = pass + og_row("log-load" as *u8, r) 229 230 // row 3: idempotent re-log (law 10) 231 let rc3: i64 = og_runv(ob, og_args("log" as *u8, "/tmp/vzo_log.txt" as *u8, pfx, "4009" as *u8, 0 as *u8), "/tmp/vzo_out3.txt" as *u8) 232 r = 0 233 if rc3 == 0 { 234 if og_has("/tmp/vzo_out3.txt" as *u8, "VIZSLA-OPS-LOG scanned=7 new=0 dup_infile=0 dup_instore=7 segment=none" as *u8) == 1 { r = 1 } 235 } 236 pass = pass + og_row("idempotent-relog" as *u8, r) 237 238 // rows 4-8: the hand-counted maintenance dashboard 239 let rc4: i64 = og_runv(ob, og_args("due" as *u8, fcat, fass, pfx, tdy), "/tmp/vzo_out4.txt" as *u8) 240 r = 0 241 if rc4 == 0 { 242 if og_has("/tmp/vzo_out4.txt" as *u8, "VIZSLA-OPS-MAINT asset=car1 task=oil-change last=2026-01-15 days=146 interval=180 due_in=34 state=OK action=none" as *u8) == 1 { r = 1 } 243 } 244 pass = pass + og_row("latest-wins-ok" as *u8, r) 245 246 r = og_has("/tmp/vzo_out4.txt" as *u8, "VIZSLA-OPS-MAINT asset=car1 task=tire-rotation last=2025-12-20 days=172 interval=180 due_in=8 state=DUE action=schedule" as *u8) 247 pass = pass + og_row("due-soon" as *u8, r) 248 249 r = og_has("/tmp/vzo_out4.txt" as *u8, "VIZSLA-OPS-MAINT asset=hvac1 task=filter-change last=2026-02-25 days=105 interval=90 due_in=-15 state=OVERDUE action=do-now" as *u8) 250 pass = pass + og_row("overdue" as *u8, r) 251 252 r = og_has("/tmp/vzo_out4.txt" as *u8, "VIZSLA-OPS-MAINT asset=car1 task=registration-renewal last=never days=-1 interval=365 due_in=0 state=NEVER action=schedule-first" as *u8) 253 pass = pass + og_row("never-first" as *u8, r) 254 255 r = og_has("/tmp/vzo_out4.txt" as *u8, "VIZSLA-OPS-MAINT-VERDICT assets=2 tasks=4 ok=1 due=1 overdue=1 never=1" as *u8) 256 pass = pass + og_row("verdict-counts" as *u8, r) 257 258 // row 9: DATA-DRIVEN soon_days threshold (5-day file, same binary) 259 let rc9: i64 = og_runv(ob, og_args("due" as *u8, "/tmp/vzo_cat5.txt" as *u8, fass, pfx, tdy), "/tmp/vzo_out9.txt" as *u8) 260 r = 0 261 if rc9 == 0 { 262 if og_has("/tmp/vzo_out9.txt" as *u8, "VIZSLA-OPS-MAINT asset=car1 task=tire-rotation last=2025-12-20 days=172 interval=180 due_in=8 state=OK action=none" as *u8) == 1 { 263 if og_has("/tmp/vzo_out9.txt" as *u8, "VIZSLA-OPS-MAINT-VERDICT assets=2 tasks=4 ok=2 due=0 overdue=1 never=1" as *u8) == 1 { r = 1 } 264 } 265 } 266 pass = pass + og_row("data-driven-soon" as *u8, r) 267 268 // row 10: due determinism 269 og_runv(ob, og_args("due" as *u8, fcat, fass, pfx, tdy), "/tmp/vzo_out10.txt" as *u8) 270 r = og_fileeq("/tmp/vzo_out4.txt" as *u8, "/tmp/vzo_out10.txt" as *u8) 271 pass = pass + og_row("due-determinism" as *u8, r) 272 273 // rows 11-12: project dashboard 274 let rc11: i64 = og_runv(ob, og_args("status" as *u8, "/tmp/vzo_prj.txt" as *u8, pfx, 0 as *u8, 0 as *u8), "/tmp/vzo_out11.txt" as *u8) 275 r = 0 276 if rc11 == 0 { 277 if og_has("/tmp/vzo_out11.txt" as *u8, "VIZSLA-OPS-PROJ id=deck member=ada steps_done=2 steps=3 next=3:railings state=ACTIVE" as *u8) == 1 { r = 1 } 278 } 279 pass = pass + og_row("project-active" as *u8, r) 280 281 r = 0 282 if og_has("/tmp/vzo_out11.txt" as *u8, "VIZSLA-OPS-PROJ id=tax member=bea steps_done=1 steps=1 next=none state=COMPLETE" as *u8) == 1 { 283 if og_has("/tmp/vzo_out11.txt" as *u8, "VIZSLA-OPS-PROJ-VERDICT projects=2 active=1 complete=1" as *u8) == 1 { r = 1 } 284 } 285 pass = pass + og_row("project-complete" as *u8, r) 286 287 // row 13: status determinism 288 og_runv(ob, og_args("status" as *u8, "/tmp/vzo_prj.txt" as *u8, pfx, 0 as *u8, 0 as *u8), "/tmp/vzo_out13.txt" as *u8) 289 r = og_fileeq("/tmp/vzo_out11.txt" as *u8, "/tmp/vzo_out13.txt" as *u8) 290 pass = pass + og_row("status-determinism" as *u8, r) 291 292 let permil: i64 = (pass * 1000) / 13 293 let logfd: i64 = sys_openat_append("knowledge/status/vizsla_gate.log" as *u8, 0x1a4) 294 var fdi: i64 = 0 295 while fdi < 2 { 296 var fd: i64 = 1 297 if fdi == 1 { fd = logfd } 298 if fd > 0 { 299 let line: *u8 = sys_mmap(256) 300 var o: i64 = 0 301 o = og_cat(line, o, "VIZSLA-OPS-GATE epoch=" as *u8) 302 o = og_catn(line, o, sys_now_realtime_sec()) 303 o = og_cat(line, o, " rows=13 pass=" as *u8) 304 o = og_catn(line, o, pass) 305 o = og_cat(line, o, " permil=" as *u8) 306 o = og_catn(line, o, permil) 307 if pass == 13 { 308 o = og_cat(line, o, " verdict=GREEN\n" as *u8) 309 } else { 310 o = og_cat(line, o, " verdict=RED\n" as *u8) 311 } 312 sys_write(fd, line, o) 313 } 314 fdi = fdi + 1 315 } 316 if logfd > 0 { sys_close(logfd) } 317 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 318 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 319 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 320 let ctr__dry: *i64 = gv_ctr() 321 ctr__dry[0] = pass 322 ctr__dry[1] = 13 323 let rc__dry: i64 = gv_verdict("VIZSLA-OPS-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8) 324 sys_exit(rc__dry) 325 return rc__dry 326}