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}