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}