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}