nx_pm_dashboard_gate.nx source
↩ module page · 59 lines · 2790 B
1// nx_pm_dashboard_gate.nx -- KAT for the PM ROI rollup, incl. the LIAR-KILLER invariant:
2// a fabricated (UNMEASURED) or sourceless number is EXCLUDED from every grounded total.
3// exit 0 = pass, N = assertion N failed.
4import "nx_syscalls.nx"
5import "nx_pm_dashboard.nx"
6
7func g_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { d[o] = s[i]; o = o + 1; i = i + 1 } return o }
8func g_tab(d: *u8, o: i64) -> i64 { d[o] = 9 as u8; return o + 1 }
9func g_nl(d: *u8, o: i64) -> i64 { d[o] = 10 as u8; return o + 1 }
10// one full row: layer cat cap metric value unit basis source (source empty if src==0)
11func g_row(d: *u8, o: i64, cat: *u8, cap: *u8, val: *u8, basis: *u8, src: *u8, has_src: i64) -> i64 {
12 o = g_cat(d, o, "EXEC" as *u8); o = g_tab(d, o)
13 o = g_cat(d, o, cat); o = g_tab(d, o)
14 o = g_cat(d, o, cap); o = g_tab(d, o)
15 o = g_cat(d, o, "metric" as *u8); o = g_tab(d, o)
16 o = g_cat(d, o, val); o = g_tab(d, o)
17 o = g_cat(d, o, "unit" as *u8); o = g_tab(d, o)
18 o = g_cat(d, o, basis); o = g_tab(d, o)
19 if has_src == 1 { o = g_cat(d, o, src) }
20 o = g_nl(d, o)
21 return o
22}
23
24func main() -> i64 {
25 let d: *u8 = sys_mmap(1024)
26 var o: i64 = 0
27 o = g_cat(d, o, "# comment line must be ignored\n" as *u8)
28 o = g_row(d, o, "MONEY" as *u8, "capA" as *u8, "100" as *u8, "MEASURED" as *u8, "src" as *u8, 1)
29 o = g_row(d, o, "MONEY" as *u8, "capB" as *u8, "200" as *u8, "ESTIMATED" as *u8, "src" as *u8, 1)
30 o = g_row(d, o, "MONEY" as *u8, "capC" as *u8, "999" as *u8, "UNMEASURED" as *u8, "src" as *u8, 1)
31 o = g_row(d, o, "MONEY" as *u8, "capD" as *u8, "888" as *u8, "ESTIMATED" as *u8, "x" as *u8, 0)
32 o = g_row(d, o, "TIME" as *u8, "capE" as *u8, "50" as *u8, "MEASURED" as *u8, "src" as *u8, 1)
33
34 let out: *i64 = sys_mmap(16 * 8) as *i64
35 pd_rollup(d, o, out)
36
37 // 1: measured money = 100 only (the fabricated 999 + sourceless 888 do NOT enter it)
38 if out[0] != 100 { return 1 }
39 // 2: estimated money = 200 (capB, cited)
40 if out[1] != 200 { return 2 }
41 // 3: UNMEASURED money is tracked separately, never summed into grounded
42 if out[2] != 999 { return 3 }
43 // 4: sourceless money excluded into its own bucket
44 if out[3] != 888 { return 4 }
45 // 5: measured time = 50
46 if out[4] != 50 { return 5 }
47 // 6: grounded lines = 3 (capA, capB, capE) -- capC + capD excluded
48 if out[9] != 3 { return 6 }
49 // 7: unmeasured lines = 1 (capC)
50 if out[10] != 1 { return 7 }
51 // 8: sourceless lines = 1 (capD)
52 if out[11] != 1 { return 8 }
53 // 9: total lines = 5 (comment ignored)
54 if out[8] != 5 { return 9 }
55 // 10: THE LIAR-KILLER -- grounded money (measured+estimated) = 300, NOT 300+999+888
56 if out[0] + out[1] != 300 { return 10 }
57
58 return 0
59}