code wiki / _hdl_build / nx_queue_health.nx
nx_queue_health.nx source
↩ module page · 100 lines · 3878 B
1// nx_queue_health.nx -- QUEUE-HEALTH gate (Auditor, X-Q-004): the assignment
2// queue audited every beat so nobody scans it by hand:
3// counts by status (TODO/GEN/NOVEL/WIP/DONE/RED)
4// DEP-DRIFT: rows whose deps name ids that do not EXIST in the queue
5// (typos/renames -> a row that can never unblock, silently)
6// RED rows: failed assignments needing an owner decision
7// Emits QHEALTH row to knowledge/status/queue_health.log; exits nonzero ONLY
8// on structural defects (dep-drift) -- counts are reporting, not failure.
9// license_tier: ORIGINAL
10import "nx_syscalls.nx"
11import "nx_assign_core.nx"
12
13func qh_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 }
14func qh_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;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{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
15
16// count dep tokens of row r that do NOT resolve to a queue id
17func qh_baddeps(cx: *i64, r: i64) -> i64 {
18 let dd: *u8 = an_deps_at(cx, r)
19 if dd[0] == (45 as u8) { if dd[1] == (0 as u8) { return 0 } }
20 let tok: *u8 = sys_mmap(64)
21 var bad: i64 = 0
22 var i: i64 = 0
23 var k: i64 = 0
24 var go: i64 = 1
25 while go == 1 {
26 let ch: i64 = dd[i] as i64
27 var fin: i64 = 0
28 if ch == 0 { fin = 1 }
29 if ch == 44 { fin = 1 }
30 if fin == 1 {
31 if k > 0 {
32 tok[k] = 0 as u8
33 if an_find(cx, tok) < 0 { bad = bad + 1 }
34 k = 0
35 }
36 if ch == 0 { go = 0 }
37 } else {
38 if k < 63 { tok[k] = ch as u8; k = k + 1 }
39 }
40 i = i + 1
41 }
42 return bad
43}
44
45func main(argc: i64, argv: *i64) -> i64 {
46 var qp: *u8 = "knowledge/registry/assignment_queue.tsv" as *u8
47 if argc >= 2 { qp = argv[1] as *u8 }
48 let cx: *i64 = an_newcx()
49 let rows: i64 = an_load(qp, cx)
50 if rows <= 0 { qh_w(1, "QHEALTH verdict=RED reason=queue-missing\n" as *u8); sys_exit(101) }
51 let st: *i64 = cx[4] as *i64
52 var todo: i64 = 0
53 var gen: i64 = 0
54 var novel: i64 = 0
55 var wip: i64 = 0
56 var done: i64 = 0
57 var redr: i64 = 0
58 var drift: i64 = 0
59 var r: i64 = 0
60 while r < rows {
61 if st[r] == 84 { todo = todo + 1 }
62 if st[r] == 71 { gen = gen + 1 }
63 if st[r] == 78 { novel = novel + 1 }
64 if st[r] == 87 { wip = wip + 1 }
65 if st[r] == 68 { done = done + 1 }
66 if st[r] == 82 { redr = redr + 1 }
67 let bd: i64 = qh_baddeps(cx, r)
68 if bd > 0 {
69 drift = drift + 1
70 qh_w(1, "QHEALTH-DRIFT id=" as *u8)
71 qh_w(1, an_id_at(cx, r))
72 qh_w(1, " unresolved-deps=" as *u8)
73 qh_wn(1, bd)
74 qh_w(1, "\n" as *u8)
75 }
76 r = r + 1
77 }
78 let lf: i64 = sys_openat_append("knowledge/status/queue_health.log" as *u8, 0x1a4)
79 var p: i64 = 0
80 while p < 2 {
81 var fd: i64 = 1
82 if p == 1 { fd = lf }
83 if fd >= 0 {
84 qh_w(fd, "QHEALTH rows=" as *u8); qh_wn(fd, rows)
85 qh_w(fd, " todo=" as *u8); qh_wn(fd, todo)
86 qh_w(fd, " gen=" as *u8); qh_wn(fd, gen)
87 qh_w(fd, " novel=" as *u8); qh_wn(fd, novel)
88 qh_w(fd, " wip=" as *u8); qh_wn(fd, wip)
89 qh_w(fd, " done=" as *u8); qh_wn(fd, done)
90 qh_w(fd, " red=" as *u8); qh_wn(fd, redr)
91 qh_w(fd, " dep-drift=" as *u8); qh_wn(fd, drift)
92 qh_w(fd, " epoch=" as *u8); qh_wn(fd, sys_now_realtime_sec())
93 if drift == 0 { qh_w(fd, " verdict=GREEN\n" as *u8) } else { qh_w(fd, " verdict=RED\n" as *u8) }
94 }
95 p = p + 1
96 }
97 if lf >= 0 { sys_close(lf) }
98 sys_exit(drift)
99 return 0
100}