code wiki / _hdl_build / nx_workflowmine.nx
nx_workflowmine.nx source
↩ module page · 393 lines · 16864 B
1// nx_workflowmine.nx -- WORKFLOWS-CLASS MINER over the plan-/planrun- planes (miner-sota F1011, 2026-07-23).
2// The census (nx_minecov MC08) measured workflows at ZERO readers: plans EXECUTE via nx_plan_run and
3// nobody ever mines them, so a standing beat can rot silently. This derives, per tracked workflow:
4// DECLARED steps (plan- plane) vs RUN steps (planrun- plane), every step's rc, the FIRST failing
5// step id, and a health verdict that keeps three states DISTINCT:
6// NEVER-RUN (no results -- an honest unknown, NOT a failure) | FAILING (some rc != 0) |
7// PARTIAL (ran fewer steps than declared -- stopped early, or the plan grew) | HEALTHY.
8// Conflating never-run with failing is the exact dishonesty this organ exists to avoid.
9// Sources are declared as DATA (knowledge/status/workflow_plans.conf, hot-read); loader "-" reads them
10// as FILES (deterministic gate fixtures), else forks the ALLOWLIST-RESOLVED loader (nx_store_put load).
11// Composes nx_sovjson_lib (sj_*). Read-only. No hw writes (Rule 26).
12// mine <plansconf> [loader] -> JSON per-workflow + totals (healthy/failing/never_run/health_permil)
13// selftest <scratch-prefix> -> gate T1..T8
14// conf cols: id TAB plan_src TAB run_src TAB note planrun row: seq TAB rc=<n> TAB snippet
15// license_tier: ORIGINAL
16import "nx_sovjson_lib.nx"
17import "nx_syscalls.nx"
18import "nx_gate_verdict.nx"
19import "nx_tool_run.nx"
20const WM_MAGIC_4088: i64 = 4088
21
22const WM_CAP: i64 = 1048576
23const WM_CONF: i64 = 65536
24const WM_OUT: i64 = 65536
25const WM_PATH: i64 = 512
26const WM_ROWS: i64 = 64
27const WM_ALLOW: i64 = 131072
28const WM_PERMIL: i64 = 1000
29const WM_NAME_MAX: i64 = 120
30const WM_MODE_644: i64 = 420
31
32func wm_read(path: *u8, buf: *u8, cap: i64) -> i64 {
33 let fd: i64 = sys_openat_rd(path)
34 if fd < 0 { return -1 }
35 var n: i64 = 0
36 var go: i64 = 1
37 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 } }
38 sys_close(fd)
39 return n
40}
41func wm_find(q: *u8, n: i64, lit: *u8) -> i64 {
42 let ll: i64 = sj_vlen(lit)
43 if ll == 0 { return 0 }
44 var i: i64 = 0
45 while i + ll <= n {
46 var k: i64 = 0
47 var ok: i64 = 1
48 while k < ll { if q[i+k] != lit[k] { ok = 0; k = ll } else { k = k + 1 } }
49 if ok == 1 { return 1 }
50 i = i + 1
51 }
52 return 0
53}
54// DELEGATES to the shared base (rule-15 extraction 2026-07-23)
55func wm_allow_path(name: *u8, outp: *u8) -> i64 { return sj_allow_path(name, outp) }
56func wm_key(d: *u8, o: i64, name: *u8) -> i64 {
57 d[o] = 34 as u8
58 var p: i64 = o + 1
59 p = sj_cat(d, p, name)
60 d[p] = 34 as u8
61 p = p + 1
62 d[p] = 58 as u8
63 p = p + 1
64 return p
65}
66// load one source into buf. lok<0 => file mode. returns bytes, -1 absent/empty.
67func wm_load(src: *u8, lp: *u8, lok: i64, buf: *u8) -> i64 {
68 if lok == 0 {
69 let n: i64 = wm_read(src, buf, WM_CAP - 8)
70 if n <= 0 { return -1 }
71 return n
72 }
73 let av: *i64 = sys_mmap(64) as *i64
74 av[0] = lp as i64
75 av[1] = src as i64
76 av[2] = "load" as *u8 as i64
77 av[3] = 0
78 let cl: *i64 = sys_mmap(16) as *i64
79 let ex: i64 = tr_run_capture(lp, av, buf, WM_CAP - 8, cl)
80 if ex != 0 { return -1 }
81 if cl[0] <= 0 { return -1 }
82 return cl[0]
83}
84func wm_rows(q: *u8, n: i64) -> i64 {
85 var c: i64 = 0
86 var i: i64 = 0
87 while i < n {
88 let le: i64 = sj_le(q, i, n)
89 if le > i { if q[i] != (35 as u8) { c = c + 1 } }
90 i = le + 1
91 }
92 return c
93}
94// walk a planrun dump: rcx[0]=steps rcx[1]=failed rcx[2]=first-failing-seq rcx[3]=malformed
95func wm_scan_run(q: *u8, n: i64, rcx: *i64) -> i64 {
96 rcx[0] = 0
97 rcx[1] = 0
98 rcx[2] = 0 - 1
99 rcx[3] = 0
100 let sp: *i64 = sys_mmap(16) as *i64
101 var i: i64 = 0
102 while i < n {
103 let le: i64 = sj_le(q, i, n)
104 if le > i { if q[i] != (35 as u8) {
105 if sj_col(q, i, le, 1, sp) == 0 { rcx[3] = rcx[3] + 1 } else {
106 var s: i64 = sp[0]
107 var okrc: i64 = 0
108 if s + 3 <= sp[1] { if q[s] == (114 as u8) { if q[s+1] == (99 as u8) { if q[s+2] == (61 as u8) { okrc = 1 } } } }
109 if okrc == 0 { rcx[3] = rcx[3] + 1 } else {
110 rcx[0] = rcx[0] + 1
111 var v: i64 = 0
112 var neg: i64 = 0
113 var k: i64 = s + 3
114 if k < sp[1] { if q[k] == (45 as u8) { neg = 1; k = k + 1 } }
115 while k < sp[1] { let c: i64 = q[k] as i64; if c >= 48 { if c <= 57 { v = v * 10 + (c - 48) } } k = k + 1 }
116 if neg == 1 { v = 0 - v }
117 if v != 0 {
118 rcx[1] = rcx[1] + 1
119 if rcx[2] < 0 { if sj_col(q, i, le, 0, sp) == 1 { rcx[2] = sj_atoi_span(q, sp[0], sp[1]) } }
120 }
121 }
122 }
123 } }
124 i = le + 1
125 }
126 return 0
127}
128func wm_mine_json(conf: *u8, loader: *u8, d: *u8) -> i64 {
129 let cb: *u8 = sys_mmap(WM_CONF)
130 let cn: i64 = wm_read(conf, cb, WM_CONF - 8)
131 if cn <= 0 { return -1 }
132 let lp: *u8 = sys_mmap(WM_PATH)
133 var lok: i64 = 0
134 if sj_lit_eq(loader, 0, sj_vlen(loader), "-" as *u8) == 0 { lok = wm_allow_path(loader, lp) }
135 let sp: *i64 = sys_mmap(16) as *i64
136 let srcb: *u8 = sys_mmap(WM_PATH)
137 let runb: *u8 = sys_mmap(WM_PATH)
138 let pbuf: *u8 = sys_mmap(WM_CAP)
139 let rbuf: *u8 = sys_mmap(WM_CAP)
140 let rcx: *i64 = sys_mmap(64) as *i64
141 var p: i64 = 0
142 d[p] = 123 as u8; p = p + 1
143 p = wm_key(d, p, "v" as *u8); p = sj_catn(d, p, 1); d[p] = 44 as u8; p = p + 1
144 p = wm_key(d, p, "tool" as *u8)
145 d[p] = 34 as u8; p = p + 1
146 p = sj_cat(d, p, "nx_workflowmine" as *u8)
147 d[p] = 34 as u8; p = p + 1
148 d[p] = 44 as u8; p = p + 1
149 p = wm_key(d, p, "averb" as *u8)
150 d[p] = 34 as u8; p = p + 1
151 p = sj_cat(d, p, "mine" as *u8)
152 d[p] = 34 as u8; p = p + 1
153 d[p] = 44 as u8; p = p + 1
154 p = wm_key(d, p, "conf" as *u8)
155 d[p] = 34 as u8; p = p + 1
156 p = sj_cat_esc(d, p, conf, 0, sj_vlen(conf), WM_NAME_MAX)
157 d[p] = 34 as u8; p = p + 1
158 d[p] = 44 as u8; p = p + 1
159 p = wm_key(d, p, "loader_resolved" as *u8); p = sj_catn(d, p, lok); d[p] = 44 as u8; p = p + 1
160 p = wm_key(d, p, "workflows" as *u8)
161 d[p] = 91 as u8; p = p + 1
162 var nwf: i64 = 0
163 var healthy: i64 = 0
164 var failing: i64 = 0
165 var never: i64 = 0
166 var partial: i64 = 0
167 var shown: i64 = 0
168 var capped: i64 = 0
169 var efirst: i64 = 1
170 var i: i64 = 0
171 while i < cn {
172 let le: i64 = sj_le(cb, i, cn)
173 var ok: i64 = 0
174 if le > i { if cb[i] != (35 as u8) { if sj_col(cb, i, le, 2, sp) == 1 { ok = 1 } } }
175 if ok == 1 {
176 nwf = nwf + 1
177 sj_col(cb, i, le, 1, sp)
178 var k: i64 = 0
179 while sp[0]+k < sp[1] { if k < WM_PATH - 2 { srcb[k] = cb[sp[0]+k] } k = k + 1 }
180 srcb[k] = 0 as u8
181 sj_col(cb, i, le, 2, sp)
182 var k2: i64 = 0
183 while sp[0]+k2 < sp[1] { if k2 < WM_PATH - 2 { runb[k2] = cb[sp[0]+k2] } k2 = k2 + 1 }
184 runb[k2] = 0 as u8
185 let pn: i64 = wm_load(srcb, lp, lok, pbuf)
186 var declared: i64 = 0
187 if pn > 0 { declared = wm_rows(pbuf, pn) }
188 let rn: i64 = wm_load(runb, lp, lok, rbuf)
189 if rn > 0 { wm_scan_run(rbuf, rn, rcx) } else { rcx[0] = 0; rcx[1] = 0; rcx[2] = 0 - 1; rcx[3] = 0 }
190 // health: NEVER-RUN is an honest unknown, never counted as a failure
191 var health: i64 = 0
192 if rcx[0] == 0 { health = 0; never = never + 1 } else {
193 if rcx[1] > 0 { health = 1; failing = failing + 1 } else {
194 if rcx[0] < declared { health = 2; partial = partial + 1 } else { health = 3; healthy = healthy + 1 }
195 }
196 }
197 if shown >= WM_ROWS { capped = 1 } else {
198 if efirst == 0 { d[p] = 44 as u8; p = p + 1 }
199 efirst = 0
200 d[p] = 123 as u8; p = p + 1
201 p = wm_key(d, p, "id" as *u8)
202 sj_col(cb, i, le, 0, sp)
203 d[p] = 34 as u8; p = p + 1
204 p = sj_cat_esc(d, p, cb, sp[0], sp[1], WM_NAME_MAX)
205 d[p] = 34 as u8; p = p + 1
206 d[p] = 44 as u8; p = p + 1
207 p = wm_key(d, p, "health" as *u8)
208 d[p] = 34 as u8; p = p + 1
209 if health == 0 { p = sj_cat(d, p, "NEVER-RUN" as *u8) } else {
210 if health == 1 { p = sj_cat(d, p, "FAILING" as *u8) } else {
211 if health == 2 { p = sj_cat(d, p, "PARTIAL" as *u8) } else { p = sj_cat(d, p, "HEALTHY" as *u8) }
212 }
213 }
214 d[p] = 34 as u8; p = p + 1
215 d[p] = 44 as u8; p = p + 1
216 p = wm_key(d, p, "declared" as *u8); p = sj_catn(d, p, declared); d[p] = 44 as u8; p = p + 1
217 p = wm_key(d, p, "ran" as *u8); p = sj_catn(d, p, rcx[0]); d[p] = 44 as u8; p = p + 1
218 p = wm_key(d, p, "failed" as *u8); p = sj_catn(d, p, rcx[1]); d[p] = 44 as u8; p = p + 1
219 p = wm_key(d, p, "first_fail_step" as *u8); p = sj_catn(d, p, rcx[2]); d[p] = 44 as u8; p = p + 1
220 p = wm_key(d, p, "malformed" as *u8); p = sj_catn(d, p, rcx[3])
221 d[p] = 125 as u8; p = p + 1
222 shown = shown + 1
223 }
224 }
225 i = le + 1
226 }
227 d[p] = 93 as u8; p = p + 1
228 d[p] = 44 as u8; p = p + 1
229 p = wm_key(d, p, "count" as *u8); p = sj_catn(d, p, nwf); d[p] = 44 as u8; p = p + 1
230 p = wm_key(d, p, "healthy" as *u8); p = sj_catn(d, p, healthy); d[p] = 44 as u8; p = p + 1
231 p = wm_key(d, p, "partial" as *u8); p = sj_catn(d, p, partial); d[p] = 44 as u8; p = p + 1
232 p = wm_key(d, p, "failing" as *u8); p = sj_catn(d, p, failing); d[p] = 44 as u8; p = p + 1
233 p = wm_key(d, p, "never_run" as *u8); p = sj_catn(d, p, never); d[p] = 44 as u8; p = p + 1
234 var hp: i64 = 0 - 1
235 if nwf > 0 { hp = healthy * WM_PERMIL / nwf }
236 p = wm_key(d, p, "health_permil" as *u8); p = sj_catn(d, p, hp); d[p] = 44 as u8; p = p + 1
237 p = wm_key(d, p, "rows_capped" as *u8); p = sj_catn(d, p, capped)
238 d[p] = 125 as u8; p = p + 1
239 d[p] = 10 as u8; p = p + 1
240 return p
241}
242func wm_selftest(prefix: *u8) -> i64 {
243 let ctr: *i64 = gv_ctr()
244 gv_head("nx_workflowmine selftest -- workflow health teeth (never-run is NOT failing)" as *u8)
245 let base: *u8 = sys_mmap(WM_PATH)
246 var o: i64 = sj_cat(base, 0, prefix)
247 o = sj_catn(base, o, sys_now_realtime_sec())
248 base[o] = 0 as u8
249 let mk: *u8 = sys_mmap(WM_PATH)
250 let lb: *u8 = sys_mmap(WM_MAGIC_4088)
251 // WA healthy 2/2 ok ; WB failing (step 20 rc=-1) ; WC partial (2 declared, 1 ran ok) ; WD never-run
252 o = sj_cat(mk, 0, base)
253 o = sj_cat(mk, o, ".wa.plan" as *u8)
254 mk[o] = 0 as u8
255 var fd: i64 = sys_openat_wr(mk, WM_MODE_644)
256 var lo: i64 = sj_cat(lb, 0, "10\ttoolA\tverb\n20\ttoolB\tverb\n" as *u8)
257 sys_write(fd, lb, lo)
258 sys_close(fd)
259 o = sj_cat(mk, 0, base)
260 o = sj_cat(mk, o, ".wa.run" as *u8)
261 mk[o] = 0 as u8
262 fd = sys_openat_wr(mk, WM_MODE_644)
263 lo = sj_cat(lb, 0, "10\trc=0\tfine\n20\trc=0\tfine\n" as *u8)
264 sys_write(fd, lb, lo)
265 sys_close(fd)
266 o = sj_cat(mk, 0, base)
267 o = sj_cat(mk, o, ".wb.plan" as *u8)
268 mk[o] = 0 as u8
269 fd = sys_openat_wr(mk, WM_MODE_644)
270 lo = sj_cat(lb, 0, "10\ttoolA\tverb\n20\ttoolB\tverb\n" as *u8)
271 sys_write(fd, lb, lo)
272 sys_close(fd)
273 o = sj_cat(mk, 0, base)
274 o = sj_cat(mk, o, ".wb.run" as *u8)
275 mk[o] = 0 as u8
276 fd = sys_openat_wr(mk, WM_MODE_644)
277 lo = sj_cat(lb, 0, "10\trc=0\tfine\n20\trc=-1\tboom\nnotarow\n" as *u8)
278 sys_write(fd, lb, lo)
279 sys_close(fd)
280 o = sj_cat(mk, 0, base)
281 o = sj_cat(mk, o, ".wc.plan" as *u8)
282 mk[o] = 0 as u8
283 fd = sys_openat_wr(mk, WM_MODE_644)
284 lo = sj_cat(lb, 0, "10\ttoolA\tverb\n20\ttoolB\tverb\n" as *u8)
285 sys_write(fd, lb, lo)
286 sys_close(fd)
287 o = sj_cat(mk, 0, base)
288 o = sj_cat(mk, o, ".wc.run" as *u8)
289 mk[o] = 0 as u8
290 fd = sys_openat_wr(mk, WM_MODE_644)
291 lo = sj_cat(lb, 0, "10\trc=0\tfine\n" as *u8)
292 sys_write(fd, lb, lo)
293 sys_close(fd)
294 o = sj_cat(mk, 0, base)
295 o = sj_cat(mk, o, ".wd.plan" as *u8)
296 mk[o] = 0 as u8
297 fd = sys_openat_wr(mk, WM_MODE_644)
298 lo = sj_cat(lb, 0, "10\ttoolA\tverb\n" as *u8)
299 sys_write(fd, lb, lo)
300 sys_close(fd)
301 // conf
302 let cf: *u8 = sys_mmap(WM_PATH)
303 o = sj_cat(cf, 0, base)
304 o = sj_cat(cf, o, ".conf" as *u8)
305 cf[o] = 0 as u8
306 fd = sys_openat_wr(cf, WM_MODE_644)
307 lo = sj_cat(lb, 0, "# fixture\n" as *u8)
308 sys_write(fd, lb, lo)
309 lo = sj_cat(lb, 0, "WA\t" as *u8)
310 lo = sj_cat(lb, lo, base)
311 lo = sj_cat(lb, lo, ".wa.plan\t" as *u8)
312 lo = sj_cat(lb, lo, base)
313 lo = sj_cat(lb, lo, ".wa.run\thealthy\n" as *u8)
314 sys_write(fd, lb, lo)
315 lo = sj_cat(lb, 0, "WB\t" as *u8)
316 lo = sj_cat(lb, lo, base)
317 lo = sj_cat(lb, lo, ".wb.plan\t" as *u8)
318 lo = sj_cat(lb, lo, base)
319 lo = sj_cat(lb, lo, ".wb.run\tfailing\n" as *u8)
320 sys_write(fd, lb, lo)
321 lo = sj_cat(lb, 0, "WC\t" as *u8)
322 lo = sj_cat(lb, lo, base)
323 lo = sj_cat(lb, lo, ".wc.plan\t" as *u8)
324 lo = sj_cat(lb, lo, base)
325 lo = sj_cat(lb, lo, ".wc.run\tpartial\n" as *u8)
326 sys_write(fd, lb, lo)
327 lo = sj_cat(lb, 0, "WD\t" as *u8)
328 lo = sj_cat(lb, lo, base)
329 lo = sj_cat(lb, lo, ".wd.plan\t" as *u8)
330 lo = sj_cat(lb, lo, base)
331 lo = sj_cat(lb, lo, ".wd.absent\tnever run\n" as *u8)
332 sys_write(fd, lb, lo)
333 sys_close(fd)
334 let d: *u8 = sys_mmap(WM_OUT)
335 let miss: *u8 = sys_mmap(WM_PATH)
336 o = sj_cat(miss, 0, base)
337 o = sj_cat(miss, o, ".absentconf" as *u8)
338 miss[o] = 0 as u8
339 let r1: i64 = wm_mine_json(miss, "-" as *u8, d)
340 var ok1: i64 = 0
341 if r1 < 0 { ok1 = 1 }
342 gv_check("T1 missing plans conf refused fail closed" as *u8, ok1, ctr)
343 let dl: i64 = wm_mine_json(cf, "-" as *u8, d)
344 var ok2: i64 = 0
345 if dl > 0 { if wm_find(d, dl, "\"count\":4" as *u8) == 1 { ok2 = 1 } }
346 gv_check("T2 counts exactly the 4 declared workflows (comment skipped)" as *u8, ok2, ctr)
347 var ok3: i64 = 0
348 if wm_find(d, dl, "\"id\":\"WA\",\"health\":\"HEALTHY\",\"declared\":2,\"ran\":2,\"failed\":0,\"first_fail_step\":-1" as *u8) == 1 { ok3 = 1 }
349 gv_check("T3 all-zero rc plan reads HEALTHY with no fail step" as *u8, ok3, ctr)
350 var ok4: i64 = 0
351 if wm_find(d, dl, "\"id\":\"WB\",\"health\":\"FAILING\",\"declared\":2,\"ran\":2,\"failed\":1,\"first_fail_step\":20,\"malformed\":1" as *u8) == 1 { ok4 = 1 }
352 gv_check("T4 negative rc = FAILING and NAMES the first failing step (20); junk row counted" as *u8, ok4, ctr)
353 var ok5: i64 = 0
354 if wm_find(d, dl, "\"id\":\"WC\",\"health\":\"PARTIAL\",\"declared\":2,\"ran\":1,\"failed\":0" as *u8) == 1 { ok5 = 1 }
355 gv_check("T5 ran fewer steps than declared = PARTIAL, not healthy, not failing" as *u8, ok5, ctr)
356 var ok6: i64 = 0
357 if wm_find(d, dl, "\"id\":\"WD\",\"health\":\"NEVER-RUN\",\"declared\":1,\"ran\":0,\"failed\":0" as *u8) == 1 { ok6 = 1 }
358 gv_check("T6 absent results = NEVER-RUN (an honest unknown, never a failure)" as *u8, ok6, ctr)
359 var ok7: i64 = 0
360 if wm_find(d, dl, "\"healthy\":1,\"partial\":1,\"failing\":1,\"never_run\":1" as *u8) == 1 { ok7 = 1 }
361 gv_check("T7 the four states stay DISTINCT in the totals" as *u8, ok7, ctr)
362 var ok8: i64 = 0
363 if wm_find(d, dl, "\"health_permil\":250" as *u8) == 1 { ok8 = 1 }
364 gv_check("T8 health_permil exact 250 (1 healthy of 4)" as *u8, ok8, ctr)
365 let rc: i64 = gv_verdict("WORKFLOWMINE-GATE" as *u8, ctr, "workflow health: never-run distinguished from failing, partial from healthy, failing step named" as *u8)
366 return rc
367}
368
369func main(argc: i64, argv: *i64) -> i64 {
370 if argc < 3 { sj_puts("usage: nx_workflowmine {mine <plansconf> [loader|-] | selftest <scratch-prefix>}\n" as *u8); sys_exit(2); return 2 }
371 let verb: *u8 = argv[1] as *u8
372 let vl: i64 = sj_vlen(verb)
373 if sj_lit_eq(verb, 0, vl, "selftest" as *u8) == 1 {
374 let rc: i64 = wm_selftest(argv[2] as *u8)
375 sys_exit(rc)
376 return rc
377 }
378 if sj_lit_eq(verb, 0, vl, "mine" as *u8) == 1 {
379 let loader: *u8 = sys_mmap(128)
380 var lo: i64 = 0
381 if argc >= 4 { lo = sj_cat(loader, 0, argv[3] as *u8) } else { lo = sj_cat(loader, 0, "nx_store_put" as *u8) }
382 loader[lo] = 0 as u8
383 let d: *u8 = sys_mmap(WM_OUT)
384 let dl: i64 = wm_mine_json(argv[2] as *u8, loader, d)
385 if dl < 0 { sj_puts("REFUSED plans conf missing or empty\n" as *u8); sys_exit(3); return 3 }
386 sys_write(1, d, dl)
387 sys_exit(0)
388 return 0
389 }
390 sj_puts("unknown verb\n" as *u8)
391 sys_exit(2)
392 return 2
393}