code wiki / _hdl_build / nx_wflow_data_gate.nx
nx_wflow_data_gate.nx source
↩ module page · 127 lines · 5833 B
1// nx_wflow_data_gate.nx -- R8 DATA-PASSING gate: run-scoped variables on the event-sourced ledger.
2// Trigger-event fields auto-bind as vars (WFVAR records) -> {key} placeholders substitute into ANY step
3// arg at execution -> set-var writes DERIVED vars (its own arg substitutes first) -> LAST write wins ->
4// unknown or unclosed placeholder = LOUD step failure, run FAILED (the send_merge law) -> vars reach a
5// FORKED organ argv (argecho receives the event's values). ONE fork. license_tier: ORIGINAL expect_exit: 0
6import "nx_wflow_engine.nx"
7import "nx_gate_verdict.nx"
8
9func dg_n(led: *u8, ridtok: *u8, st: *u8) -> i64 {
10 let szp: *i64 = sys_mmap(8) as *i64
11 let b: *u8 = wf_readall(led, szp)
12 if (b as i64) == 0 { return 0 - 1 }
13 return wf_lines_with2(b, szp[0], ridtok, st)
14}
15func dg_row(conf: *u8, name: *u8, elf: *u8, flag: *u8) -> i64 {
16 let ln: *u8 = sys_mmap(600)
17 var o: i64 = 0
18 o = wf_cat(ln, o, name)
19 ln[o] = 9 as u8
20 o = o + 1
21 o = wf_cat(ln, o, elf)
22 ln[o] = 9 as u8
23 o = o + 1
24 o = wf_cat(ln, o, flag)
25 ln[o] = 10 as u8
26 ln[o+1] = 0 as u8
27 return wf_append(conf, ln)
28}
29
30func main() -> i64 {
31 p("=== NX-WFLOW-DATA GATE (R8: event data -> variables -> any step arg, incl forked organ argv) ===\n" as *u8)
32 var ok: i64 = 1
33 let now: i64 = wf_now()
34 let led: *u8 = sys_mmap(128)
35 var lo: i64 = 0
36 lo = wf_cat(led, lo, "/tmp/wfdata_" as *u8)
37 lo = wf_catn(led, lo, now)
38 lo = wf_cat(led, lo, ".log" as *u8)
39 led[lo] = 0 as u8
40 let conf: *u8 = sys_mmap(128)
41 var co: i64 = 0
42 co = wf_cat(conf, co, "/tmp/wfdata_" as *u8)
43 co = wf_catn(conf, co, now)
44 co = wf_cat(conf, co, ".conf" as *u8)
45 conf[co] = 0 as u8
46 dg_row(conf, "argecho" as *u8, "./_offc/nx_tool_argecho.elf" as *u8, "GREEN" as *u8)
47
48 let flows: *i64 = sys_mmap(8 * 8) as *i64
49 flows[0] = "fd1|deal-won|-" as *u8 as i64
50 flows[1] = "fd2|bad-sub|-" as *u8 as i64
51 flows[2] = "fd3|override|-" as *u8 as i64
52 flows[3] = "fd4|unclosed|-" as *u8 as i64
53 let steps: *i64 = sys_mmap(8 * 12) as *i64
54 steps[0] = "fd1|1|set-var|-|greet=Congrats {name}|1" as *u8 as i64
55 steps[1] = "fd1|2|notify|-|{greet} on {deal}|1" as *u8 as i64
56 steps[2] = "fd1|3|exec-organ|argecho|{name}~{deal}|1" as *u8 as i64
57 steps[3] = "fd2|1|notify|-|hello {missing}|1" as *u8 as i64
58 steps[4] = "fd3|1|set-var|-|name=Override|1" as *u8 as i64
59 steps[5] = "fd3|2|set-var|-|msg={name}|1" as *u8 as i64
60 steps[6] = "fd4|1|notify|-|broken {oops|1" as *u8 as i64
61 let cx: *i64 = sys_mmap(32) as *i64
62 cx[0] = steps as i64
63 cx[1] = 7
64 cx[2] = led as i64
65 cx[3] = conf as i64
66
67 // T0 load: 7 rows ok; set-var without key=value refused
68 let l0: i64 = wf_load(steps, 7)
69 let bad: *i64 = sys_mmap(16) as *i64
70 bad[0] = "f9|1|set-var|-|novalue|1" as *u8 as i64
71 let lb: i64 = wf_load(bad, 1)
72 p(" T0 load=" as *u8); pn(l0); p(" badSetvar=" as *u8); pn(lb); p("\n" as *u8)
73 if l0 != 7 { ok = 0 }
74 if lb != (0 - 1) { ok = 0 }
75
76 // T1 the dataflow: event fields bind -> derived set-var substitutes -> notify uses both -> vars reach argecho argv
77 let r1: i64 = wf_fire(cx, flows, 4, "deal-won~name=Rose~deal=Riverside~id=V1" as *u8)
78 let d1: i64 = dg_n(led, " rid=V1.fd1 " as *u8, "status=DONE" as *u8)
79 let o1: i64 = dg_n(led, " rid=V1.fd1 " as *u8, "status=OK" as *u8)
80 let vb: i64 = dg_n(led, " rid=V1.fd1 " as *u8, "k=name v=Rose" as *u8)
81 let vg: i64 = dg_n(led, " rid=V1.fd1 " as *u8, "v=Congrats Rose" as *u8)
82 p(" T1 flow started=" as *u8); pn(r1); p(" done=" as *u8); pn(d1); p(" okSteps=" as *u8); pn(o1)
83 p(" eventBound=" as *u8); pn(vb); p(" derivedVar=" as *u8); pn(vg); p("\n" as *u8)
84 if r1 != 1 { ok = 0 }
85 if d1 != 1 { ok = 0 }
86 if o1 != 3 { ok = 0 }
87 if vb != 1 { ok = 0 }
88 if vg != 1 { ok = 0 }
89
90 // T2 unknown variable -> LOUD step failure, run FAILED, nothing fabricated
91 wf_fire(cx, flows, 4, "bad-sub~id=V2" as *u8)
92 let f2: i64 = dg_n(led, " rid=V2.fd2 " as *u8, "status=FAILED" as *u8)
93 let d2: i64 = dg_n(led, " rid=V2.fd2 " as *u8, "status=DONE" as *u8)
94 p(" T2 unknownVar failed=" as *u8); pn(f2); p(" done=" as *u8); pn(d2); p("\n" as *u8)
95 if f2 != 1 { ok = 0 }
96 if d2 != 0 { ok = 0 }
97
98 // T3 LAST WRITE WINS: set-var name=Override beats the event's name=Rose for later steps
99 wf_fire(cx, flows, 4, "override~name=Rose~id=V3" as *u8)
100 let d3: i64 = dg_n(led, " rid=V3.fd3 " as *u8, "status=DONE" as *u8)
101 let vo: i64 = dg_n(led, " rid=V3.fd3 " as *u8, "k=msg v=Override" as *u8)
102 p(" T3 override done=" as *u8); pn(d3); p(" msgIsOverride=" as *u8); pn(vo); p("\n" as *u8)
103 if d3 != 1 { ok = 0 }
104 if vo != 1 { ok = 0 }
105
106 // T4 unclosed placeholder -> LOUD failure
107 wf_fire(cx, flows, 4, "unclosed~id=V4" as *u8)
108 let f4: i64 = dg_n(led, " rid=V4.fd4 " as *u8, "status=FAILED" as *u8)
109 p(" T4 unclosed failed=" as *u8); pn(f4); p("\n" as *u8)
110 if f4 != 1 { ok = 0 }
111
112 // T5 negctl: nonsense value never appears
113 let ban: i64 = dg_n(led, "WFVAR" as *u8, "v=BANANA" as *u8)
114 p(" T5 negctl nonsense=" as *u8); pn(ban); p("\n" as *u8)
115 if ban != 0 { ok = 0 }
116
117 p("NX-WFLOW-DATA-GATE ledger=" as *u8); p(led); p(" forks=1 " as *u8)
118 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
119 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
120 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
121 let ctr__dry: *i64 = gv_ctr()
122 ctr__dry[0] = ok
123 ctr__dry[1] = 1
124 let rc__dry: i64 = gv_verdict("WFLOW-DATA-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
125 sys_exit(rc__dry)
126 return rc__dry
127}