code wiki / _hdl_build / nx_wflow_version_gate.nx
nx_wflow_version_gate.nx source
↩ module page · 108 lines · 5030 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"
8import "nx_gate_verdict.nx"
9
10func vg_n(led: *u8, ridtok: *u8, st: *u8) -> i64 {
11 let szp: *i64 = sys_mmap(8) as *i64
12 let b: *u8 = wf_readall(led, szp)
13 if (b as i64) == 0 { return 0 - 1 }
14 return wf_lines_with2(b, szp[0], ridtok, st)
15}
16
17func main() -> i64 {
18 p("=== NX-WFLOW-VERSION GATE (R12: @version directive, WFVER run stamps, drift recorded on resume) ===\n" as *u8)
19 var ok: i64 = 1
20 let now: i64 = wf_now()
21 let led: *u8 = sys_mmap(128)
22 var lo: i64 = 0
23 lo = wf_cat(led, lo, "/tmp/wfver_" as *u8)
24 lo = wf_catn(led, lo, now)
25 lo = wf_cat(led, lo, ".log" as *u8)
26 led[lo] = 0 as u8
27 let fp: *u8 = sys_mmap(128)
28 var fo: i64 = 0
29 fo = wf_cat(fp, fo, "/tmp/wfver_" as *u8)
30 fo = wf_catn(fp, fo, now)
31 fo = wf_cat(fp, fo, ".flows" as *u8)
32 fp[fo] = 0 as u8
33 let sp: *u8 = sys_mmap(128)
34 var so: i64 = 0
35 so = wf_cat(sp, so, "/tmp/wfver_" as *u8)
36 so = wf_catn(sp, so, now)
37 so = wf_cat(sp, so, ".steps" as *u8)
38 sp[so] = 0 as u8
39 wf_append(fp, "@version 3\n" as *u8)
40 wf_append(fp, "fv1|order|-\n" as *u8)
41 wf_append(sp, "fv1|1|notify|-|hello {name}|1\n" as *u8)
42 wf_append(sp, "fv1|2|notify|-|bye|1\n" as *u8)
43
44 // T1 directive parsed; loader SKIPS the @ line (1 real flow row)
45 let v: i64 = wf_defs_version(fp)
46 let arr: *i64 = sys_mmap(8 * 16) as *i64
47 let nf: i64 = wf_lines_load(fp, arr, 16)
48 p(" T1 version=" as *u8); pn(v); p(" flowRows=" as *u8); pn(nf); p("\n" as *u8)
49 if v != 3 { ok = 0 }
50 if nf != 1 { ok = 0 }
51
52 // T2 fired run stamps WFVER ver=3
53 let r1: i64 = wf_fire_files(fp, sp, led, "-" as *u8, "order~name=Rose~id=V1" as *u8)
54 let d1: i64 = vg_n(led, " rid=V1.fv1 " as *u8, "status=DONE" as *u8)
55 let sv: i64 = vg_n(led, " rid=V1.fv1 " as *u8, " ver=3" as *u8)
56 p(" T2 fire started=" as *u8); pn(r1); p(" done=" as *u8); pn(d1); p(" verStamp=" as *u8); pn(sv); p("\n" as *u8)
57 if r1 != 1 { ok = 0 }
58 if d1 != 1 { ok = 0 }
59 if sv != 1 { ok = 0 }
60
61 // T3 DRIFT: synthetic in-flight run stamped ver=2 -> resume under ver=3 defs records WFVERDRIFT + completes
62 wf_emit(led, "V9.fv1" as *u8, "fv1" as *u8, 0, "START" as *u8, 0)
63 wf_emit_ver(led, "V9.fv1" as *u8, 2)
64 wf_emit_var(led, "V9.fv1" as *u8, "name" as *u8, "Ann" as *u8)
65 let rs: i64 = wf_resume_files(fp, sp, led, "-" as *u8)
66 let dr: i64 = vg_n(led, " rid=V9.fv1 " as *u8, "WFVERDRIFT" as *u8)
67 let d9: i64 = vg_n(led, " rid=V9.fv1 " as *u8, "status=DONE" as *u8)
68 p(" T3 drift resumed=" as *u8); pn(rs); p(" driftRecorded=" as *u8); pn(dr); p(" done=" as *u8); pn(d9); p("\n" as *u8)
69 if rs != 1 { ok = 0 }
70 if dr != 1 { ok = 0 }
71 if d9 != 1 { ok = 0 }
72
73 // T4 unversioned defs = no WFVER stamp (back-compat)
74 let fp2: *u8 = sys_mmap(128)
75 var f2o: i64 = 0
76 f2o = wf_cat(fp2, f2o, "/tmp/wfver_nv_" as *u8)
77 f2o = wf_catn(fp2, f2o, now)
78 fp2[f2o] = 0 as u8
79 wf_append(fp2, "fv1|order|-\n" as *u8)
80 let led2: *u8 = sys_mmap(128)
81 var l2o: i64 = 0
82 l2o = wf_cat(led2, l2o, "/tmp/wfver_led2_" as *u8)
83 l2o = wf_catn(led2, l2o, now)
84 led2[l2o] = 0 as u8
85 wf_fire_files(fp2, sp, led2, "-" as *u8, "order~name=Bo~id=V2" as *u8)
86 let nv: i64 = vg_n(led2, " rid=V2.fv1 " as *u8, "WFVER" as *u8)
87 let d2: i64 = vg_n(led2, " rid=V2.fv1 " as *u8, "status=DONE" as *u8)
88 p(" T4 unversioned wfver=" as *u8); pn(nv); p(" done=" as *u8); pn(d2); p("\n" as *u8)
89 if nv != 0 { ok = 0 }
90 if d2 != 1 { ok = 0 }
91
92 // T5 negctl: same-version resume never fabricates drift
93 let rs2: i64 = wf_resume_files(fp, sp, led, "-" as *u8)
94 let dr2: i64 = vg_n(led, " rid=V1.fv1 " as *u8, "WFVERDRIFT" as *u8)
95 p(" T5 negctl resumed=" as *u8); pn(rs2); p(" v1drift=" as *u8); pn(dr2); p("\n" as *u8)
96 if dr2 != 0 { ok = 0 }
97
98 p("NX-WFLOW-VERSION-GATE ledger=" as *u8); p(led); p(" forks=0 " as *u8)
99 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
100 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
101 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
102 let ctr__dry: *i64 = gv_ctr()
103 ctr__dry[0] = ok
104 ctr__dry[1] = 1
105 let rc__dry: i64 = gv_verdict("WFLOW-VERSION-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
106 sys_exit(rc__dry)
107 return rc__dry
108}