code wiki / _hdl_build / nx_wflow_version_gate.nx
nx_wflow_version_gate.nx source
↩ module page · 101 lines · 4550 B
1// nx_wflow_version_gate.nx -- R12 VERSIONING gate: `@version N` directive in the flows file (loader skips
2// @ directives), every fired run stamps a durable WFVER record, and resume RECORDS version drift
3// (WFVERDRIFT) when a run started under a different definitions version -- resume proceeds (additive
4// semantics) with the drift visible forever. Unversioned defs = no WFVER (back-compat). Draft-test-live =
5// the same loaders behind the CLI verify command (whole-set validation without firing). ZERO forks.
6// license_tier: ORIGINAL expect_exit: 0
7import "nx_wflow_engine.nx"
8
9func vg_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}
15
16func main() -> i64 {
17 p("=== NX-WFLOW-VERSION GATE (R12: @version directive, WFVER run stamps, drift recorded on resume) ===\n" as *u8)
18 var ok: i64 = 1
19 let now: i64 = wf_now()
20 let led: *u8 = sys_mmap(128)
21 var lo: i64 = 0
22 lo = wf_cat(led, lo, "/tmp/wfver_" as *u8)
23 lo = wf_catn(led, lo, now)
24 lo = wf_cat(led, lo, ".log" as *u8)
25 led[lo] = 0 as u8
26 let fp: *u8 = sys_mmap(128)
27 var fo: i64 = 0
28 fo = wf_cat(fp, fo, "/tmp/wfver_" as *u8)
29 fo = wf_catn(fp, fo, now)
30 fo = wf_cat(fp, fo, ".flows" as *u8)
31 fp[fo] = 0 as u8
32 let sp: *u8 = sys_mmap(128)
33 var so: i64 = 0
34 so = wf_cat(sp, so, "/tmp/wfver_" as *u8)
35 so = wf_catn(sp, so, now)
36 so = wf_cat(sp, so, ".steps" as *u8)
37 sp[so] = 0 as u8
38 wf_append(fp, "@version 3\n" as *u8)
39 wf_append(fp, "fv1|order|-\n" as *u8)
40 wf_append(sp, "fv1|1|notify|-|hello {name}|1\n" as *u8)
41 wf_append(sp, "fv1|2|notify|-|bye|1\n" as *u8)
42
43 // T1 directive parsed; loader SKIPS the @ line (1 real flow row)
44 let v: i64 = wf_defs_version(fp)
45 let arr: *i64 = sys_mmap(8 * 16) as *i64
46 let nf: i64 = wf_lines_load(fp, arr, 16)
47 p(" T1 version=" as *u8); pn(v); p(" flowRows=" as *u8); pn(nf); p("\n" as *u8)
48 if v != 3 { ok = 0 }
49 if nf != 1 { ok = 0 }
50
51 // T2 fired run stamps WFVER ver=3
52 let r1: i64 = wf_fire_files(fp, sp, led, "-" as *u8, "order~name=Rose~id=V1" as *u8)
53 let d1: i64 = vg_n(led, " rid=V1.fv1 " as *u8, "status=DONE" as *u8)
54 let sv: i64 = vg_n(led, " rid=V1.fv1 " as *u8, " ver=3" as *u8)
55 p(" T2 fire started=" as *u8); pn(r1); p(" done=" as *u8); pn(d1); p(" verStamp=" as *u8); pn(sv); p("\n" as *u8)
56 if r1 != 1 { ok = 0 }
57 if d1 != 1 { ok = 0 }
58 if sv != 1 { ok = 0 }
59
60 // T3 DRIFT: synthetic in-flight run stamped ver=2 -> resume under ver=3 defs records WFVERDRIFT + completes
61 wf_emit(led, "V9.fv1" as *u8, "fv1" as *u8, 0, "START" as *u8, 0)
62 wf_emit_ver(led, "V9.fv1" as *u8, 2)
63 wf_emit_var(led, "V9.fv1" as *u8, "name" as *u8, "Ann" as *u8)
64 let rs: i64 = wf_resume_files(fp, sp, led, "-" as *u8)
65 let dr: i64 = vg_n(led, " rid=V9.fv1 " as *u8, "WFVERDRIFT" as *u8)
66 let d9: i64 = vg_n(led, " rid=V9.fv1 " as *u8, "status=DONE" as *u8)
67 p(" T3 drift resumed=" as *u8); pn(rs); p(" driftRecorded=" as *u8); pn(dr); p(" done=" as *u8); pn(d9); p("\n" as *u8)
68 if rs != 1 { ok = 0 }
69 if dr != 1 { ok = 0 }
70 if d9 != 1 { ok = 0 }
71
72 // T4 unversioned defs = no WFVER stamp (back-compat)
73 let fp2: *u8 = sys_mmap(128)
74 var f2o: i64 = 0
75 f2o = wf_cat(fp2, f2o, "/tmp/wfver_nv_" as *u8)
76 f2o = wf_catn(fp2, f2o, now)
77 fp2[f2o] = 0 as u8
78 wf_append(fp2, "fv1|order|-\n" as *u8)
79 let led2: *u8 = sys_mmap(128)
80 var l2o: i64 = 0
81 l2o = wf_cat(led2, l2o, "/tmp/wfver_led2_" as *u8)
82 l2o = wf_catn(led2, l2o, now)
83 led2[l2o] = 0 as u8
84 wf_fire_files(fp2, sp, led2, "-" as *u8, "order~name=Bo~id=V2" as *u8)
85 let nv: i64 = vg_n(led2, " rid=V2.fv1 " as *u8, "WFVER" as *u8)
86 let d2: i64 = vg_n(led2, " rid=V2.fv1 " as *u8, "status=DONE" as *u8)
87 p(" T4 unversioned wfver=" as *u8); pn(nv); p(" done=" as *u8); pn(d2); p("\n" as *u8)
88 if nv != 0 { ok = 0 }
89 if d2 != 1 { ok = 0 }
90
91 // T5 negctl: same-version resume never fabricates drift
92 let rs2: i64 = wf_resume_files(fp, sp, led, "-" as *u8)
93 let dr2: i64 = vg_n(led, " rid=V1.fv1 " as *u8, "WFVERDRIFT" as *u8)
94 p(" T5 negctl resumed=" as *u8); pn(rs2); p(" v1drift=" as *u8); pn(dr2); p("\n" as *u8)
95 if dr2 != 0 { ok = 0 }
96
97 p("NX-WFLOW-VERSION-GATE ledger=" as *u8); p(led); p(" forks=0 " as *u8)
98 if ok == 1 { p("verdict=GREEN\n" as *u8); return 0 }
99 p("verdict=RED\n" as *u8)
100 return 1
101}