code wiki / _hdl_build / nx_tpl_ingest_gate.nx
nx_tpl_ingest_gate.nx source
↩ module page · 110 lines · 6360 B
1// nx_tpl_ingest_gate.nx -- referee for R4 (nx_tpl_ingest). Proves the pattern-corpus extractor consumes
2// template STRUCTURE (not files) into a content-addressed, deduped corpus, classifies archetypes, extracts
3// the ordered section-sequence, and is BUDGET-GUARDED (fail-fast) + resumable. Positive tests + negative
4// controls (structural dedup collapse, budget-trap fires, junk skipped). GREEN iff 7/7.
5// Fixtures: web_assets/_tpl_seed/{landing,landing2(near-dup),shop(ecom),resume,junk}.html
6// The build wrapper cleans + creates /tmp/tplcorpus_gate and /tmp/tplcorpus_gate2 before the run.
7// license_tier: ORIGINAL expect_exit: 0
8import "nx_gate.nx"
9import "nx_tpl_ingest.nx"
10import "nx_gate_verdict.nx"
11
12func gg_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
13func gg_find(hay: *u8, needle: *u8) -> i64 {
14 let hn: i64 = gg_slen(hay); let nl: i64 = gg_slen(needle)
15 if nl==0 { return 0 }
16 var i: i64=0
17 while i+nl<=hn { var j: i64=0; var ok: i64=1; while j<nl { if hay[i+j]!=needle[j] { ok=0; j=nl } else { j=j+1 } } if ok==1 { return i } i=i+1 }
18 return 0-1
19}
20func gg_row(name: *u8, ok: i64) -> i64 { gw(" " as *u8); gw(name); if ok==1 { gw(" PASS\n" as *u8) } else { gw(" FAIL\n" as *u8) } return 0 }
21
22func main() -> i64 {
23 let szp: *i64 = sys_mmap(16) as *i64
24 let land: *u8 = sys_read_file("web_assets/_tpl_seed/landing.html" as *u8, szp); let ln: i64 = szp[0]
25 let land2: *u8 = sys_read_file("web_assets/_tpl_seed/landing2.html" as *u8, szp); let l2: i64 = szp[0]
26 let shop: *u8 = sys_read_file("web_assets/_tpl_seed/shop.html" as *u8, szp); let shn: i64 = szp[0]
27 let res: *u8 = sys_read_file("web_assets/_tpl_seed/resume.html" as *u8, szp); let rsn: i64 = szp[0]
28
29 // classify + section-sequence + dedup key for each fixture (pure functions)
30 let sa: *u8 = sys_mmap(256); let sb: *u8 = sys_mmap(256); let sc: *u8 = sys_mmap(256); let sd: *u8 = sys_mmap(256)
31 ti_seq(land, ln, sa); ti_seq(shop, shn, sb); ti_seq(res, rsn, sc); ti_seq(land2, l2, sd)
32 let ca: i64 = ti_classify(land, ln)
33 let cb: i64 = ti_classify(shop, shn)
34 let cc: i64 = ti_classify(res, rsn)
35 let cd: i64 = ti_classify(land2, l2)
36 let ka: *u8 = sys_mmap(64); let kb: *u8 = sys_mmap(64); let kc: *u8 = sys_mmap(64); let kd: *u8 = sys_mmap(64)
37 ti_mkkey(ca, sa, ka); ti_mkkey(cb, sb, kb); ti_mkkey(cc, sc, kc); ti_mkkey(cd, sd, kd)
38
39 // T1: structural dedup key -- near-dup (landing2) collapses to landing; the 3 archetypes stay distinct
40 var t1: i64=0
41 if ti_streq(ka, kd)==1 { if ti_streq(ka, kb)==0 { if ti_streq(ka, kc)==0 { if ti_streq(kb, kc)==0 { t1=1 } } } }
42 // T2: archetype classification correct (1=landing 2=ecommerce 5=resume)
43 var t2: i64=0
44 if ca==1 { if cb==2 { if cc==5 { t2=1 } } }
45 // T3: section-sequence is ORDERED (hero before footer) and carries the cta flow-signal
46 var t3: i64=0
47 let hoff: i64 = gg_find(sa, "hero" as *u8)
48 let foff: i64 = gg_find(sa, "ft" as *u8)
49 let coff: i64 = gg_find(sa, "cta" as *u8)
50 if hoff>=0 { if foff>hoff { if coff>=0 { t3=1 } } }
51
52 // T4: STORE write -- ingest the seed dir into a fresh corpus; near-dup collapses, junk skipped, segment committed
53 let c1: *i64 = sys_mmap(64) as *i64
54 ti_run("web_assets/_tpl_seed" as *u8, "/tmp/tplcorpus_gate/" as *u8, 5000, 67108864, c1)
55 var t4: i64=0
56 if c1[0]==3 { if c1[1]==1 { if c1[5]==0 { if c1[3]>=1 { t4=1 } } } }
57 let junkskip: i64 = c1[2]
58
59 // T5: RE-RUN is idempotent/resumable -- everything already present -> 0 new, 4 dups (cross-run dedup)
60 let c2: *i64 = sys_mmap(64) as *i64
61 ti_run("web_assets/_tpl_seed" as *u8, "/tmp/tplcorpus_gate/" as *u8, 5000, 67108864, c2)
62 var t5: i64=0
63 if c2[0]==0 { if c2[1]==4 { t5=1 } }
64
65 // T6 (NEG CONTROL): budget ceiling of 1 template -> fail-fast TRAP fires, nothing runs unbounded
66 let c3: *i64 = sys_mmap(64) as *i64
67 ti_run("web_assets/_tpl_seed" as *u8, "/tmp/tplcorpus_gate2/" as *u8, 1, 67108864, c3)
68 var t6: i64=0
69 if c3[5]==1 { if c3[0]<=1 { if c3[4]==1 { t6=1 } } }
70
71 // N7 (NEG CONTROL): the non-template junk file was skipped, never stored as a bogus pattern
72 var n7: i64=0; if junkskip>=1 { n7=1 }
73
74 var passes: i64=0
75 if t1==1 { passes=passes+1 } if t2==1 { passes=passes+1 } if t3==1 { passes=passes+1 } if t4==1 { passes=passes+1 }
76 if t5==1 { passes=passes+1 } if t6==1 { passes=passes+1 } if n7==1 { passes=passes+1 }
77 var green: i64=0; if passes==7 { green=1 }
78
79 gw("=== nx_tpl_ingest_gate -- R4 template pattern-corpus extractor ===\n" as *u8)
80 gg_row("T1-structural-dedup-collapse " as *u8, t1)
81 gg_row("T2-archetype-classification " as *u8, t2)
82 gg_row("T3-ordered-section-sequence " as *u8, t3)
83 gg_row("T4-store-ingest+dedup+commit " as *u8, t4)
84 gg_row("T5-idempotent-resumable-rerun " as *u8, t5)
85 gg_row("T6-budget-trap-firefast(neg) " as *u8, t6)
86 gg_row("N7-junk-file-skipped(neg) " as *u8, n7)
87 gw("verdict=" as *u8); if green==1 { gw("GREEN" as *u8) } else { gw("RED" as *u8) }
88 gw(" passes=" as *u8); gn(passes); gw("/7 stored=" as *u8); gn(c1[0]); gw(" dups=" as *u8); gn(c1[1])
89 gw(" skipped=" as *u8); gn(c1[2]); gw(" segs=" as *u8); gn(c1[3]); gw("\n" as *u8)
90 // seq samples (evidence, not a claim)
91 gw(" seq(landing)=" as *u8); gw(sa); gw("\n" as *u8)
92 gw(" seq(shop)=" as *u8); gw(sb); gw("\n" as *u8)
93 gw(" seq(resume)=" as *u8); gw(sc); gw("\n" as *u8)
94
95 let lg: i64 = sys_openat_append("knowledge/status/tpl_ingest.log" as *u8, 0x1a4)
96 if lg >= 0 {
97 if green==1 { let m: *u8 = "TPL-INGEST rows=7 pass=7 verdict=GREEN\n" as *u8; sys_write(lg, m, 39) }
98 else { let m2: *u8 = "TPL-INGEST verdict=RED\n" as *u8; sys_write(lg, m2, 23) }
99 sys_close(lg)
100 }
101 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
102 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
103 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
104 let ctr__dry: *i64 = gv_ctr()
105 ctr__dry[0] = green
106 ctr__dry[1] = 1
107 let rc__dry: i64 = gv_verdict("TPL-INGEST-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
108 sys_exit(rc__dry)
109 return rc__dry
110}