code wiki / _hdl_build / nx_wflow_capture_gate.nx

nx_wflow_capture_gate.nx source

↩ module page · 102 lines · 4343 B

1// nx_wflow_capture_gate.nx -- R8b STDOUT-CAPTURE gate: exec-organ channel `connector>varname` pipes the 2// child organ's stdout (bounded 480B, newlines to spaces, trailing space trim, LOUD over-cap) into the run 3// variable plane -- a step's OUTPUT becomes later steps' INPUT (the full Zapier dataflow shape). Proves: 4// captured value lands as WFVAR and substitutes into the next step's arg; capture only on exit 0; plain 5// connector (no >) captures nothing (back-compat); load refuses empty connector or empty var. TWO forks. 6// license_tier: ORIGINAL expect_exit: 0 7import "nx_wflow_engine.nx" 8 9func pg_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 pg_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-CAPTURE GATE (R8b: organ stdout -> run variable -> next step arg) ===\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/wfcap_" 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/wfcap_" 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 pg_row(conf, "argecho" as *u8, "./_offc/nx_tool_argecho.elf" as *u8, "GREEN" as *u8) 47 48 let flows: *i64 = sys_mmap(8 * 4) as *i64 49 flows[0] = "fc1|cap|-" as *u8 as i64 50 flows[1] = "fc2|nocap|-" as *u8 as i64 51 let steps: *i64 = sys_mmap(8 * 4) as *i64 52 steps[0] = "fc1|1|exec-organ|argecho>echoed|{word}~two|1" as *u8 as i64 53 steps[1] = "fc1|2|notify|-|Got {echoed}|1" as *u8 as i64 54 steps[2] = "fc2|1|exec-organ|argecho|solo|1" as *u8 as i64 55 let cx: *i64 = sys_mmap(32) as *i64 56 cx[0] = steps as i64 57 cx[1] = 3 58 cx[2] = led as i64 59 cx[3] = conf as i64 60 61 // T0 load: capture spec valid; empty connector or empty var refused 62 let l0: i64 = wf_load(steps, 3) 63 let bad1: *i64 = sys_mmap(16) as *i64 64 bad1[0] = "f9|1|exec-organ|>v|x|1" as *u8 as i64 65 let lb1: i64 = wf_load(bad1, 1) 66 let bad2: *i64 = sys_mmap(16) as *i64 67 bad2[0] = "f9|1|exec-organ|argecho>|x|1" as *u8 as i64 68 let lb2: i64 = wf_load(bad2, 1) 69 p(" T0 load=" as *u8); pn(l0); p(" emptyConn=" as *u8); pn(lb1); p(" emptyVar=" as *u8); pn(lb2); p("\n" as *u8) 70 if l0 != 3 { ok = 0 } 71 if lb1 != (0 - 1) { ok = 0 } 72 if lb2 != (0 - 1) { ok = 0 } 73 74 // T1 THE DATAFLOW CLOSE: organ stdout captured into {echoed}, substituted into the NEXT step's arg 75 let r1: i64 = wf_fire(cx, flows, 2, "cap~word=alpha~id=X1" as *u8) 76 let d1: i64 = pg_n(led, " rid=X1.fc1 " as *u8, "status=DONE" as *u8) 77 let cv: i64 = pg_n(led, " rid=X1.fc1 " as *u8, "k=echoed v=NX_TOOL_ARGECHO_OK alpha two" as *u8) 78 let s2: i64 = pg_n(led, " rid=X1.fc1 " as *u8, " step=2 status=OK" as *u8) 79 p(" T1 capture started=" as *u8); pn(r1); p(" done=" as *u8); pn(d1); p(" capturedVar=" as *u8); pn(cv); p(" nextStepUsedIt=" as *u8); pn(s2); p("\n" as *u8) 80 if r1 != 1 { ok = 0 } 81 if d1 != 1 { ok = 0 } 82 if cv != 1 { ok = 0 } 83 if s2 != 1 { ok = 0 } 84 85 // T2 back-compat: plain connector captures nothing 86 wf_fire(cx, flows, 2, "nocap~id=X2" as *u8) 87 let d2: i64 = pg_n(led, " rid=X2.fc2 " as *u8, "status=DONE" as *u8) 88 let nv: i64 = pg_n(led, " rid=X2.fc2 " as *u8, "k=echoed" as *u8) 89 p(" T2 nocap done=" as *u8); pn(d2); p(" strayVar=" as *u8); pn(nv); p("\n" as *u8) 90 if d2 != 1 { ok = 0 } 91 if nv != 0 { ok = 0 } 92 93 // T3 negctl 94 let ban: i64 = pg_n(led, "WFVAR" as *u8, "v=BANANA" as *u8) 95 p(" T3 negctl nonsense=" as *u8); pn(ban); p("\n" as *u8) 96 if ban != 0 { ok = 0 } 97 98 p("NX-WFLOW-CAPTURE-GATE ledger=" as *u8); p(led); p(" forks=2 " as *u8) 99 if ok == 1 { p("verdict=GREEN\n" as *u8); return 0 } 100 p("verdict=RED\n" as *u8) 101 return 1 102}