code wiki / _hdl_build / nx_ws_manifest_emit_gate.nx

nx_ws_manifest_emit_gate.nx source

↩ module page · 94 lines · 5757 B

1// nx_ws_manifest_emit_gate.nx -- HERMETIC gate for the WMS durability emitter. Builds a private 2// temp dir of fake project-*.md (+ decoy non-project files), a curated stub manifest, then drives 3// wme_emit and asserts the manifest auto-index is COMPLETE and CORRECT. The load-bearing test is 4// the LOSS-DETECTOR negative control (T5/T6): after a NEW workstream appears on disk, wme_is_stale 5// MUST flag it (1), and re-emitting MUST clear it (0) -- that is "never lose a workstream" proven 6// mechanically, not asserted. Sovereign: imports nx_syscalls + the lib only. license_tier: ORIGINAL 7import "nx_syscalls.nx" 8import "nx_ws_index_lib.nx" 9 10const G_DIR: *u8 = "/tmp/nx_wme_gate" 11const G_MAN: *u8 = "/tmp/nx_wme_gate/manifest.md" 12 13func gp(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 14func gn(v: i64) -> i64 { 15 let bb: *u8 = sys_mmap(28); var m: i64 = v 16 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m } 17 let t: *u8 = sys_mmap(28); var k: i64 = 0 18 if m == 0 { t[0] = 48 as u8; k = 1 } 19 while m > 0 { t[k] = ((48 + (m % 10)) as u8); m = m / 10; k = k + 1 } 20 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 21 sys_write(1, bb, k); return 0 22} 23func gstrlen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 24 25// write `content` (NUL-term) to a path under G_DIR named `fname`. 26func gwrite(fname: *u8, content: *u8) -> i64 { 27 let path: *u8 = sys_mmap(512) 28 let dir: *u8 = G_DIR // copy const to a local: nx_cc desyncs on indexing a const *u8 directly 29 var o: i64 = 0 30 var i: i64 = 0 31 while dir[i] != (0 as u8) { path[o] = dir[i]; o = o + 1; i = i + 1 } 32 path[o] = 47 as u8; o = o + 1 33 i = 0 34 while fname[i] != (0 as u8) { path[o] = fname[i]; o = o + 1; i = i + 1 } 35 path[o] = 0 as u8 36 let fd: i64 = sys_openat_wr(path, 420) 37 if fd < 0 { return 0 - 1 } 38 sys_write(fd, content, gstrlen(content)) 39 sys_close(fd) 40 return 0 41} 42 43// does the live manifest contain NUL-term `needle`? 44func gman_has(needle: *u8) -> i64 { 45 let fbuf: *u8 = sys_mmap(WME_FBUF) 46 let flen: i64 = wme_read(G_MAN, fbuf, WME_FBUF) 47 if flen <= 0 { return 0 } 48 if wme_find(fbuf, flen, needle) >= 0 { return 1 } 49 return 0 50} 51 52func main(argc: i64, argv: *i64) -> i64 { 53 gp("=== nx_ws_manifest_emit_gate (durability loss-detector) ===\n" as *u8) 54 sys_mkdir(G_DIR, 511) // 0777; ok if exists 55 56 // seed 3 workstreams + 2 decoys (must be EXCLUDED) + a curated manifest stub. 57 gwrite("project-alpha-2026-06-01.md" as *u8, "alpha body\n" as *u8) 58 gwrite("project-bravo-2026-06-02.md" as *u8, "bravo body\n" as *u8) 59 gwrite("project-charlie-2026-06-03.md" as *u8, "charlie body\n" as *u8) 60 gwrite("feedback-decoy-2026-06-01.md" as *u8, "not a workstream\n" as *u8) // wrong prefix 61 gwrite("project-notes.txt" as *u8, "wrong suffix\n" as *u8) // wrong suffix 62 gwrite("manifest.md" as *u8, "# CURATED FRONT DOOR\nCURATED-SENTINEL-XYZ keep me.\n" as *u8) 63 64 var pass: i64 = 0 65 var fail: i64 = 0 66 67 // T1: emit indexes exactly the 3 project files (decoys excluded). 68 let n1: i64 = wme_emit(G_DIR, G_MAN) 69 if n1 == 3 { pass = pass + 1; gp(" T1 emit-count==3 PASS\n" as *u8) } else { fail = fail + 1; gp(" T1 emit-count FAIL got=" as *u8); gn(n1); gp("\n" as *u8) } 70 71 // T2: every workstream present as a [[link]]. 72 if gman_has("[[project-alpha-2026-06-01]]" as *u8) == 1 { if gman_has("[[project-bravo-2026-06-02]]" as *u8) == 1 { if gman_has("[[project-charlie-2026-06-03]]" as *u8) == 1 { pass = pass + 1; gp(" T2 all-three-present PASS\n" as *u8) } else { fail = fail + 1; gp(" T2 charlie MISSING FAIL\n" as *u8) } } else { fail = fail + 1; gp(" T2 bravo MISSING FAIL\n" as *u8) } } else { fail = fail + 1; gp(" T2 alpha MISSING FAIL\n" as *u8) } 73 74 // T3: decoys excluded (wrong prefix + wrong suffix never appear). 75 if gman_has("[[feedback-decoy-2026-06-01]]" as *u8) == 0 { if gman_has("[[project-notes]]" as *u8) == 0 { pass = pass + 1; gp(" T3 decoys-excluded PASS\n" as *u8) } else { fail = fail + 1; gp(" T3 project-notes leaked FAIL\n" as *u8) } } else { fail = fail + 1; gp(" T3 feedback-decoy leaked FAIL\n" as *u8) } 76 77 // T4: curated prefix preserved verbatim (the front door is never clobbered). 78 if gman_has("CURATED-SENTINEL-XYZ" as *u8) == 1 { pass = pass + 1; gp(" T4 curated-preserved PASS\n" as *u8) } else { fail = fail + 1; gp(" T4 curated-CLOBBERED FAIL\n" as *u8) } 79 80 // T5 (NEG-CONTROL / loss-detector): fresh now -> not stale. 81 if wme_is_stale(G_DIR, G_MAN) == 0 { pass = pass + 1; gp(" T5 fresh->not-stale PASS\n" as *u8) } else { fail = fail + 1; gp(" T5 fresh-but-stale FAIL\n" as *u8) } 82 83 // T6 (THE LOAD-BEARING ONE): a NEW workstream appears -> stale MUST fire (1) = loss detected. 84 gwrite("project-delta-2026-06-04.md" as *u8, "delta body\n" as *u8) 85 if wme_is_stale(G_DIR, G_MAN) == 1 { pass = pass + 1; gp(" T6 new-file->stale-detected PASS\n" as *u8) } else { fail = fail + 1; gp(" T6 loss-NOT-detected FAIL (would silently lose work)\n" as *u8) } 86 87 // T7: re-emit picks up the new one (count 4) and clears stale -> the loop self-heals. 88 let n2: i64 = wme_emit(G_DIR, G_MAN) 89 if n2 == 4 { if wme_is_stale(G_DIR, G_MAN) == 0 { pass = pass + 1; gp(" T7 re-emit-heals(4,fresh) PASS\n" as *u8) } else { fail = fail + 1; gp(" T7 still-stale-after-emit FAIL\n" as *u8) } } else { fail = fail + 1; gp(" T7 re-emit-count FAIL got=" as *u8); gn(n2); gp("\n" as *u8) } 90 91 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 92 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 93 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1 94}