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}