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}