code wiki / _hdl_build / nx_wflow_obs_gate.nx
nx_wflow_obs_gate.nx source
↩ module page · 105 lines · 4652 B
1// nx_wflow_obs_gate.nx -- R6 RUN OBSERVABILITY gate: the board + 0-JS HTML run page are derived ENTIRELY
2// by replaying the event-sourced run ledger (nothing self-reported). Builds a mixed ledger through REAL
3// engine calls (one DONE run, one FAILED run, one PARKED-on-approval run, one synthetic in-flight RUNNING),
4// then asserts the derived states, the totals, and the real page bytes (title + states present, zero
5// <script, DOCTYPE-led). Neg-controls: empty ledger reports 0 runs (no fabrication); nonsense state absent.
6// ZERO forks. license_tier: ORIGINAL expect_exit: 0
7import "nx_wflow_engine.nx"
8
9func og_file_has(path: *u8, needle: *u8) -> i64 {
10 let szp: *i64 = sys_mmap(8) as *i64
11 let b: *u8 = wf_readall(path, szp)
12 if (b as i64) == 0 { return 0 }
13 if szp[0] == 0 { return 0 }
14 return wf_lines_with2(b, szp[0], needle, needle)
15}
16
17func main() -> i64 {
18 p("=== NX-WFLOW-OBS GATE (R6: run board + 0-JS HTML by ledger replay, nothing self-reported) ===\n" as *u8)
19 var ok: i64 = 1
20 let now: i64 = wf_now()
21 let led: *u8 = sys_mmap(128)
22 var lo: i64 = 0
23 lo = wf_cat(led, lo, "/tmp/wfobs_" as *u8)
24 lo = wf_catn(led, lo, now)
25 lo = wf_cat(led, lo, ".log" as *u8)
26 led[lo] = 0 as u8
27 let page: *u8 = sys_mmap(128)
28 var po: i64 = 0
29 po = wf_cat(page, po, "/tmp/wfobs_" as *u8)
30 po = wf_catn(page, po, now)
31 po = wf_cat(page, po, ".html" as *u8)
32 page[po] = 0 as u8
33
34 let flows: *i64 = sys_mmap(8 * 4) as *i64
35 flows[0] = "f1|deal|-" as *u8 as i64
36 flows[1] = "f3|ops|-" as *u8 as i64
37 flows[2] = "fa|expense|-" as *u8 as i64
38 let steps: *i64 = sys_mmap(8 * 8) as *i64
39 steps[0] = "f1|1|create-task|-|Prep|1" as *u8 as i64
40 steps[1] = "f1|2|notify|-|Advanced|1" as *u8 as i64
41 steps[2] = "f3|1|probe-fail|-|9|1" as *u8 as i64
42 steps[3] = "fa|1|approve|operator|Need signoff|1" as *u8 as i64
43 let cx: *i64 = sys_mmap(32) as *i64
44 cx[0] = steps as i64
45 cx[1] = 4
46 cx[2] = led as i64
47 cx[3] = 0
48
49 // build the mixed ledger through the REAL engine: DONE + FAILED + PARKED + synthetic RUNNING
50 wf_fire(cx, flows, 3, "deal~id=O1" as *u8)
51 wf_fire(cx, flows, 3, "ops~id=O2" as *u8)
52 wf_fire(cx, flows, 3, "expense~id=O3" as *u8)
53 wf_emit(led, "O4.f1" as *u8, "f1" as *u8, 0, "START" as *u8, 0)
54
55 // T1 board: 4 distinct runs, one of each derived state
56 let cnt: i64 = wf_obs_board(led)
57 p(" T1 board runs=" as *u8); pn(cnt); p("\n" as *u8)
58 if cnt != 4 { ok = 0 }
59 let szp: *i64 = sys_mmap(8) as *i64
60 let buf: *u8 = wf_readall(led, szp)
61 let tok: *u8 = sys_mmap(256)
62 wf_obs_tok(tok, "O1.f1" as *u8)
63 if wf_run_state(buf, szp[0], tok) != 3 { ok = 0 }
64 wf_obs_tok(tok, "O2.f3" as *u8)
65 if wf_run_state(buf, szp[0], tok) != 2 { ok = 0 }
66 wf_obs_tok(tok, "O3.fa" as *u8)
67 if wf_run_state(buf, szp[0], tok) != 1 { ok = 0 }
68 wf_obs_tok(tok, "O4.f1" as *u8)
69 if wf_run_state(buf, szp[0], tok) != 0 { ok = 0 }
70 p(" T1b states done/failed/parked/running all derived correctly=" as *u8); pn(ok); p("\n" as *u8)
71
72 // T2 the page: real bytes, DOCTYPE-led, all states named, run ids present, ZERO script tags
73 let pc: i64 = wf_obs_html(led, page)
74 let hasTitle: i64 = og_file_has(page, "Nishi Workflow Runs" as *u8)
75 let hasO2: i64 = og_file_has(page, "O2.f3" as *u8)
76 let hasParked: i64 = og_file_has(page, "PARKED" as *u8)
77 let hasScript: i64 = og_file_has(page, "<script" as *u8)
78 let hasDoc: i64 = og_file_has(page, "DOCTYPE html" as *u8)
79 p(" T2 page runs=" as *u8); pn(pc); p(" title=" as *u8); pn(hasTitle); p(" o2=" as *u8); pn(hasO2)
80 p(" parked=" as *u8); pn(hasParked); p(" script=" as *u8); pn(hasScript); p(" doctype=" as *u8); pn(hasDoc); p("\n" as *u8)
81 if pc != 4 { ok = 0 }
82 if hasTitle < 1 { ok = 0 }
83 if hasO2 < 1 { ok = 0 }
84 if hasParked < 1 { ok = 0 }
85 if hasScript != 0 { ok = 0 }
86 if hasDoc < 1 { ok = 0 }
87
88 // T3 neg-controls: empty ledger -> 0 runs (no fabrication); nonsense state never appears
89 let led2: *u8 = sys_mmap(128)
90 var l2: i64 = 0
91 l2 = wf_cat(led2, l2, "/tmp/wfobs_empty_" as *u8)
92 l2 = wf_catn(led2, l2, now)
93 l2 = wf_cat(led2, l2, ".log" as *u8)
94 led2[l2] = 0 as u8
95 let c0: i64 = wf_obs_board(led2)
96 let ban: i64 = og_file_has(page, "BANANA" as *u8)
97 p(" T3 negctl emptyRuns=" as *u8); pn(c0); p(" nonsense=" as *u8); pn(ban); p("\n" as *u8)
98 if c0 != 0 { ok = 0 }
99 if ban != 0 { ok = 0 }
100
101 p("NX-WFLOW-OBS-GATE page=" as *u8); p(page); p(" forks=0 " as *u8)
102 if ok == 1 { p("verdict=GREEN\n" as *u8); return 0 }
103 p("verdict=RED\n" as *u8)
104 return 1
105}