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}