nx_docgen_gate.nx source
↩ module page · 77 lines · 3854 B
1// nx_docgen_gate.nx -- INDEPENDENT gate for document assembly (imports the SAME shipped
2// nx_docgen_lib = atlas validation edge). Proves: clause round-trip, assembly, merge
3// substitution (no unmerged braces), CID determinism, content-addressing (diff data ->
4// diff CID), and BOTH fail-closed paths (unknown clause + unfilled field). SELF-PUBLISHES
5// knowledge/status/office_docgen_gate.log. license_tier: ORIGINAL
6
7import "nx_docgen_lib.nx"
8
9func main() -> i64 {
10 var pass: i64 = 0
11 let p: *u8 = "/tmp/nx_docgen_gate-" as *u8
12 dg_clause_put(p, "scope" as *u8, "SCOPE {client} re {matter}." as *u8)
13 dg_clause_put(p, "fee" as *u8, "FEE {fee}." as *u8)
14 dg_clause_put(p, "datecl" as *u8, "DATED {date}." as *u8)
15 dg_tmpl_put(p, "eng" as *u8, "scope,fee" as *u8)
16 dg_tmpl_put(p, "bad" as *u8, "scope,ghost" as *u8)
17 dg_tmpl_put(p, "needsdate" as *u8, "scope,datecl" as *u8)
18 // T1 clause round-trip (stored + retrievable)
19 let po: *i64 = sys_mmap(16) as *i64
20 let lo: *i64 = sys_mmap(16) as *i64
21 if reg_get(p, "clause:" as *u8, "fee" as *u8, po, lo) == 1 { if lo[0] > 0 { pass = pass + 1 } }
22 // merge record: client,matter,fee -- deliberately NO date
23 let k: *i64 = sys_mmap(8 * 3) as *i64
24 let v: *i64 = sys_mmap(8 * 3) as *i64
25 k[0] = ("client" as *u8) as i64; v[0] = ("Acme" as *u8) as i64
26 k[1] = ("matter" as *u8) as i64; v[1] = ("M1" as *u8) as i64
27 k[2] = ("fee" as *u8) as i64; v[2] = ("$300" as *u8) as i64
28 let mrec: *u8 = sys_mmap(2048)
29 let mlen: i64 = canon_encode(k, v, 3, mrec)
30 // T2 assemble -> len>0
31 let doc: *u8 = sys_mmap(4096)
32 let n: i64 = dg_assemble(p, "eng" as *u8, mrec, mlen, doc)
33 if n > 0 { pass = pass + 1 }
34 // T3 no unmerged braces (every {field} substituted)
35 if n > 0 { if dg_unmerged(doc, n) == 0 { pass = pass + 1 } }
36 // T4 determinism: same inputs -> same CID
37 let c1: *u8 = sys_mmap(128)
38 cid_of(doc, n, c1)
39 let doc2: *u8 = sys_mmap(4096)
40 let n2: i64 = dg_assemble(p, "eng" as *u8, mrec, mlen, doc2)
41 let c2: *u8 = sys_mmap(128)
42 cid_of(doc2, n2, c2)
43 if mt_streq(c1, c2) == 1 { pass = pass + 1 }
44 // T5 content-addressed: different data -> different CID
45 let k2: *i64 = sys_mmap(8 * 3) as *i64
46 let v2: *i64 = sys_mmap(8 * 3) as *i64
47 k2[0] = ("client" as *u8) as i64; v2[0] = ("Beta Inc" as *u8) as i64
48 k2[1] = ("matter" as *u8) as i64; v2[1] = ("M1" as *u8) as i64
49 k2[2] = ("fee" as *u8) as i64; v2[2] = ("$300" as *u8) as i64
50 let mrec2: *u8 = sys_mmap(2048)
51 let mlen2: i64 = canon_encode(k2, v2, 3, mrec2)
52 let docB: *u8 = sys_mmap(4096)
53 let nB: i64 = dg_assemble(p, "eng" as *u8, mrec2, mlen2, docB)
54 let cB: *u8 = sys_mmap(128)
55 cid_of(docB, nB, cB)
56 if mt_streq(c1, cB) == 0 { pass = pass + 1 }
57 // T6 FAIL-CLOSED: unknown clause in template -> -1
58 let dbad: *u8 = sys_mmap(4096)
59 if dg_assemble(p, "bad" as *u8, mrec, mlen, dbad) < 0 { pass = pass + 1 }
60 // T7 FAIL-CLOSED: unfilled merge field ({date} absent) -> -1
61 let dmiss: *u8 = sys_mmap(4096)
62 if dg_assemble(p, "needsdate" as *u8, mrec, mlen, dmiss) < 0 { pass = pass + 1 }
63
64 let out: *u8 = sys_mmap(512)
65 var o: i64 = 0
66 o = mt_catcopy(out, o, "OFFICE-DOCGEN-GATE tests=7 pass=" as *u8)
67 o = mt_catn(out, o, pass)
68 o = mt_catcopy(out, o, " clause-roundtrip+assemble+merge-nounbraces+cid-determinism+content-addressed+unknown-clause-failclosed+missing-field-failclosed VERDICT=" as *u8)
69 if pass == 7 { o = mt_catcopy(out, o, "GREEN" as *u8) }
70 if pass != 7 { o = mt_catcopy(out, o, "RED" as *u8) }
71 out[o] = 10 as u8
72 o = o + 1
73 ss_writefile("knowledge/status/office_docgen_gate.log" as *u8, out, o)
74 sys_write(1, out, o)
75 if pass == 7 { return __syscall(93, 0, 0, 0, 0, 0, 0) }
76 return __syscall(93, 100 + pass, 0, 0, 0, 0, 0)
77}