code wiki / _hdl_build / nx_vizsla_ops_gate.nx
nx_vizsla_ops_gate.nx source
↩ module page · 318 lines · 13672 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"
38
39func og_slen(s: *u8) -> i64 {
40 var n: i64 = 0
41 while s[n] != (0 as u8) { n = n + 1 }
42 return n
43}
44
45func og_p(s: *u8) -> i64 {
46 sys_write(1, s, og_slen(s))
47 return 0
48}
49
50func og_cat(dst: *u8, off: i64, s: *u8) -> i64 {
51 var i: i64 = 0
52 while s[i] != (0 as u8) { dst[off + i] = s[i]; i = i + 1 }
53 return off + i
54}
55
56func og_catn(dst: *u8, off: i64, v: i64) -> i64 {
57 var o: i64 = off
58 var m: i64 = v
59 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m }
60 let t: *u8 = sys_mmap(28)
61 var k: i64 = 0
62 if m == 0 { t[0] = 48 as u8; k = 1 }
63 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
64 var i: i64 = 0
65 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 }
66 return o + k
67}
68
69func og_write(path: *u8, content: *u8) -> i64 {
70 let fd: i64 = sys_openat_wr(path, 0x1a4)
71 if fd < 0 { return 0 - 1 }
72 sys_write(fd, content, og_slen(content))
73 sys_close(fd)
74 return 0
75}
76
77func og_readall(path: *u8, szout: *i64) -> *u8 {
78 let fd: i64 = sys_openat_rd(path)
79 if fd < 0 { szout[0] = 0 - 1; return 0 as *u8 }
80 let sz: i64 = sys_lseek(fd, 0, 2)
81 sys_lseek(fd, 0, 0)
82 let buf: *u8 = sys_mmap(sz + 64)
83 var got: i64 = 0
84 var n: i64 = 1
85 while n > 0 {
86 n = sys_read(fd, (buf as i64 + got) as *u8, 65536)
87 if n > 0 { got = got + n }
88 }
89 sys_close(fd)
90 szout[0] = got
91 return buf
92}
93
94// run elf with argv tail from a null-terminated ptr-array (any arity);
95// stdout+stderr -> outpath; returns WEXITSTATUS or 128+sig
96func og_runv(elf: *u8, args: *i64, outpath: *u8) -> i64 {
97 let pid: i64 = sys_fork()
98 if pid == 0 {
99 if (outpath as i64) != 0 {
100 let ofd: i64 = sys_openat_wr(outpath, 0x1a4)
101 if ofd >= 0 { sys_dup3(ofd, 1, 0); sys_dup3(ofd, 2, 0) }
102 }
103 let argv: *i64 = sys_mmap(128) as *i64
104 argv[0] = elf as i64
105 var i: i64 = 0
106 var go: i64 = 1
107 while go == 1 {
108 if args[i] == 0 { go = 0 } else {
109 argv[i + 1] = args[i]
110 i = i + 1
111 }
112 }
113 argv[i + 1] = 0
114 let envp: *i64 = sys_mmap(16) as *i64
115 envp[0] = 0
116 sys_execve(elf, argv, envp)
117 sys_exit(127)
118 }
119 let st: *i64 = sys_mmap(16) as *i64
120 sys_wait4(pid, st, 0)
121 let sig: i64 = st[0] & 0x7f
122 if sig != 0 { return 128 + sig }
123 return (st[0] >> 8) & 0xff
124}
125
126func og_has(path: *u8, needle: *u8) -> i64 {
127 let szp: *i64 = sys_mmap(16) as *i64
128 let b: *u8 = og_readall(path, szp)
129 let sz: i64 = szp[0]
130 let n: i64 = og_slen(needle)
131 if sz < n { return 0 }
132 var i: i64 = 0
133 while i + n <= sz {
134 var ok: i64 = 1
135 var j: i64 = 0
136 while j < n {
137 if b[i + j] != needle[j] { ok = 0; j = n } else { j = j + 1 }
138 }
139 if ok == 1 { return 1 }
140 i = i + 1
141 }
142 return 0
143}
144
145func og_fileeq(p1: *u8, p2: *u8) -> i64 {
146 let s1: *i64 = sys_mmap(16) as *i64
147 let s2: *i64 = sys_mmap(16) as *i64
148 let b1: *u8 = og_readall(p1, s1)
149 let b2: *u8 = og_readall(p2, s2)
150 if s1[0] != s2[0] { return 0 }
151 if s1[0] <= 0 { return 0 }
152 var i: i64 = 0
153 while i < s1[0] {
154 if b1[i] != b2[i] { return 0 }
155 i = i + 1
156 }
157 return 1
158}
159
160func og_row(name: *u8, pass: i64) -> i64 {
161 og_p("ROW " as *u8)
162 og_p(name)
163 if pass == 1 { og_p(" PASS\n" as *u8) } else { og_p(" FAIL\n" as *u8) }
164 return pass
165}
166
167// build a null-terminated arg array from up to 5 ptrs (0-terminated early)
168func og_args(a1: *u8, a2: *u8, a3: *u8, a4: *u8, a5: *u8) -> *i64 {
169 let a: *i64 = sys_mmap(64) as *i64
170 a[0] = a1 as i64
171 a[1] = a2 as i64
172 a[2] = a3 as i64
173 a[3] = a4 as i64
174 a[4] = a5 as i64
175 a[5] = 0
176 return a
177}
178
179func main(argc: i64, argv: *i64) -> i64 {
180 og_p("=== VIZSLA OPS GATE: projects+maintenance fabric KATs (hand-counted days) ===\n" as *u8)
181 var ob: *u8 = "/tmp/nx_vizsla_ops.sov.elf" as *u8
182 if argc > 1 { ob = argv[1] as *u8 }
183 let pr: i64 = sys_openat_rd(ob)
184 if pr >= 0 { sys_close(pr) }
185 else {
186 og_p(" instrument missing -> rebuilding via durable runner\n" as *u8)
187 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)
188 }
189
190 // epoch-unique virgin store prefix
191 let pfx: *u8 = sys_mmap(128)
192 var po: i64 = 0
193 po = og_cat(pfx, po, "/tmp/vzoG" as *u8)
194 po = og_catn(pfx, po, sys_now_us())
195 po = og_cat(pfx, po, "-" as *u8)
196 pfx[po] = 0 as u8
197
198 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
199 og_write("/tmp/vzo_cat.txt" as *u8, cat)
200 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
201 og_write("/tmp/vzo_cat5.txt" as *u8, cat5)
202 let ass: *u8 = "HAVE car1 vehicle-gas family-truck\nHAVE hvac1 home-hvac main-system\n" as *u8
203 og_write("/tmp/vzo_ass.txt" as *u8, ass)
204 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
205 og_write("/tmp/vzo_log.txt" as *u8, lg)
206 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
207 og_write("/tmp/vzo_prj.txt" as *u8, prj)
208
209 let fcat: *u8 = "/tmp/vzo_cat.txt" as *u8
210 let fass: *u8 = "/tmp/vzo_ass.txt" as *u8
211 let tdy: *u8 = "2026-06-10" as *u8
212 var pass: i64 = 0
213 var r: i64 = 0
214
215 // row 1: loud-fail on missing catalog
216 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)
217 r = 0
218 if rc1 == 1 { r = 1 }
219 pass = pass + og_row("loud-fail-missing-catalog" as *u8, r)
220
221 // row 2: ledger load (4 DONE + 3 STEPDONE)
222 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)
223 r = 0
224 if rc2 == 0 {
225 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 }
226 }
227 pass = pass + og_row("log-load" as *u8, r)
228
229 // row 3: idempotent re-log (law 10)
230 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)
231 r = 0
232 if rc3 == 0 {
233 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 }
234 }
235 pass = pass + og_row("idempotent-relog" as *u8, r)
236
237 // rows 4-8: the hand-counted maintenance dashboard
238 let rc4: i64 = og_runv(ob, og_args("due" as *u8, fcat, fass, pfx, tdy), "/tmp/vzo_out4.txt" as *u8)
239 r = 0
240 if rc4 == 0 {
241 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 }
242 }
243 pass = pass + og_row("latest-wins-ok" as *u8, r)
244
245 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)
246 pass = pass + og_row("due-soon" as *u8, r)
247
248 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)
249 pass = pass + og_row("overdue" as *u8, r)
250
251 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)
252 pass = pass + og_row("never-first" as *u8, r)
253
254 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)
255 pass = pass + og_row("verdict-counts" as *u8, r)
256
257 // row 9: DATA-DRIVEN soon_days threshold (5-day file, same binary)
258 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)
259 r = 0
260 if rc9 == 0 {
261 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 {
262 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 }
263 }
264 }
265 pass = pass + og_row("data-driven-soon" as *u8, r)
266
267 // row 10: due determinism
268 og_runv(ob, og_args("due" as *u8, fcat, fass, pfx, tdy), "/tmp/vzo_out10.txt" as *u8)
269 r = og_fileeq("/tmp/vzo_out4.txt" as *u8, "/tmp/vzo_out10.txt" as *u8)
270 pass = pass + og_row("due-determinism" as *u8, r)
271
272 // rows 11-12: project dashboard
273 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)
274 r = 0
275 if rc11 == 0 {
276 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 }
277 }
278 pass = pass + og_row("project-active" as *u8, r)
279
280 r = 0
281 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 {
282 if og_has("/tmp/vzo_out11.txt" as *u8, "VIZSLA-OPS-PROJ-VERDICT projects=2 active=1 complete=1" as *u8) == 1 { r = 1 }
283 }
284 pass = pass + og_row("project-complete" as *u8, r)
285
286 // row 13: status determinism
287 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)
288 r = og_fileeq("/tmp/vzo_out11.txt" as *u8, "/tmp/vzo_out13.txt" as *u8)
289 pass = pass + og_row("status-determinism" as *u8, r)
290
291 let permil: i64 = (pass * 1000) / 13
292 let logfd: i64 = sys_openat_append("knowledge/status/vizsla_gate.log" as *u8, 0x1a4)
293 var fdi: i64 = 0
294 while fdi < 2 {
295 var fd: i64 = 1
296 if fdi == 1 { fd = logfd }
297 if fd > 0 {
298 let line: *u8 = sys_mmap(256)
299 var o: i64 = 0
300 o = og_cat(line, o, "VIZSLA-OPS-GATE epoch=" as *u8)
301 o = og_catn(line, o, sys_now_realtime_sec())
302 o = og_cat(line, o, " rows=13 pass=" as *u8)
303 o = og_catn(line, o, pass)
304 o = og_cat(line, o, " permil=" as *u8)
305 o = og_catn(line, o, permil)
306 if pass == 13 {
307 o = og_cat(line, o, " verdict=GREEN\n" as *u8)
308 } else {
309 o = og_cat(line, o, " verdict=RED\n" as *u8)
310 }
311 sys_write(fd, line, o)
312 }
313 fdi = fdi + 1
314 }
315 if logfd > 0 { sys_close(logfd) }
316 if pass == 13 { return 0 }
317 return 1
318}