code wiki / _hdl_build / nx_site_archetype_gate.nx
nx_site_archetype_gate.nx source
↩ module page · 135 lines · 7904 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_site_archetype_gate.nx -- referee for R5 (nx_site_archetype). Populates a corpus (ti_run over the seed
4// templates), composes the showcase (sa_run), and PROVES: the gallery links every corpus archetype; each composed
5// page is s-class + ADA + responsive BY CONSTRUCTION (skip-link, lang, <main, viewport, --nx- tokens); layouts are
6// VARIED across archetypes (distinct section ids, not one template); + a negative control (no non-corpus archetype
7// is emitted). GREEN iff 7/7. Wrapper pre-creates /tmp/tplcorpus_r5 + /tmp/factory_gate.
8// license_tier: ORIGINAL expect_exit: 0
9import "nx_gate.nx"
10import "nx_site_archetype.nx"
11
12func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
13" as *u8); return ok }
14func g_has(hay: *u8, hn: i64, needle: *u8) -> i64 {
15 if (hay as i64)==0 { return 0 }
16 let nl: i64 = g_slen(needle)
17 if nl==0 { return 1 }
18 var i: i64=0
19 while i+nl<=hn { var j: i64=0; var ok: i64=1; while j<nl { if (hay[i+j] as i64)!=(needle[j] as i64) { ok=0; j=nl } else { j=j+1 } } if ok==1 { return 1 } i=i+1 }
20 return 0
21}
22// the genuine semantic ADA floor (design-system-agnostic; kit1 --nx- tokens are NOT an a11y criterion,
23// and the alternate design systems ship their own palettes while still meeting these markers).
24func g_ada(hay: *u8, hn: i64) -> i64 {
25 if g_has(hay, hn, "class=\"skip-link\"" as *u8)==0 { return 0 }
26 if g_has(hay, hn, "lang=\"en\"" as *u8)==0 { return 0 }
27 if g_has(hay, hn, "<main id=\"main\"" as *u8)==0 { return 0 }
28 if g_has(hay, hn, "name=\"viewport\"" as *u8)==0 { return 0 }
29 return 1
30}
31func g_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 }
32// first offset of needle in hay[0..hn), or -1
33func g_find(hay: *u8, hn: i64, needle: *u8) -> i64 {
34 if (hay as i64)==0 { return 0-1 }
35 let nl: i64 = g_slen(needle)
36 if nl==0 { return 0 }
37 var i: i64=0
38 while i+nl<=hn { var j: i64=0; var ok: i64=1; while j<nl { if (hay[i+j] as i64)!=(needle[j] as i64) { ok=0; j=nl } else { j=j+1 } } if ok==1 { return i } i=i+1 }
39 return 0-1
40}
41
42func main() -> i64 {
43 // 1) populate the corpus from the seed templates
44 let counts: *i64 = sys_mmap(64) as *i64
45 ti_run("web_assets/_tpl_seed" as *u8, "/tmp/tplcorpus_r5/" as *u8, 5000, 67108864, counts)
46 // 2) compose the showcase from the corpus
47 let n: i64 = sa_run("web_assets/_tpl_seed" as *u8, "/tmp/tplcorpus_r5/" as *u8, "/tmp/factory_gate" as *u8, "nishifamily.com" as *u8)
48 // 3) read back the emitted pages
49 let szp: *i64 = sys_mmap(16) as *i64
50 let idx: *u8 = sys_read_file("/tmp/factory_gate/index.html" as *u8, szp); let iln: i64 = szp[0]
51 let land: *u8 = sys_read_file("/tmp/factory_gate/landing.html" as *u8, szp); let lln: i64 = szp[0]
52 let ecom: *u8 = sys_read_file("/tmp/factory_gate/ecommerce.html" as *u8, szp); let eln: i64 = szp[0]
53 let res: *u8 = sys_read_file("/tmp/factory_gate/resume.html" as *u8, szp); let rln: i64 = szp[0]
54 let soc: *u8 = sys_read_file("/tmp/factory_gate/social.html" as *u8, szp)
55
56 // T1: gallery lists every corpus archetype (3) with resolvable /factory links
57 var t1: i64=0
58 if n==3 { if (idx as i64)!=0 {
59 if g_has(idx, iln, "href=\"/factory/landing.html\"" as *u8)==1 {
60 if g_has(idx, iln, "href=\"/factory/ecommerce.html\"" as *u8)==1 {
61 if g_has(idx, iln, "href=\"/factory/resume.html\"" as *u8)==1 { t1=1 } } } } }
62 // T2: composed landing page is s-class + ADA + responsive BY CONSTRUCTION
63 var t2: i64=0; if g_ada(land, lln)==1 { t2=1 }
64 // T3: landing carries its archetype sections (hero + pricing + faq)
65 var t3: i64=0
66 if g_has(land, lln, "class=\"hero\"" as *u8)==1 { if g_has(land, lln, "id=\"pricing\"" as *u8)==1 { if g_has(land, lln, "id=\"faq\"" as *u8)==1 { t3=1 } } }
67 // T4: ecommerce is a DIFFERENT layout (has products grid, NO pricing/faq section)
68 var t4: i64=0
69 if g_has(ecom, eln, "id=\"products\"" as *u8)==1 { if g_has(ecom, eln, "id=\"pricing\"" as *u8)==0 { t4=1 } }
70 // T5: resume is a DIFFERENT layout (portfolio grid + Experience tag, NO products)
71 var t5: i64=0
72 if g_has(res, rln, "id=\"work\"" as *u8)==1 { if g_has(res, rln, "Experience" as *u8)==1 { if g_has(res, rln, "id=\"products\"" as *u8)==0 { t5=1 } } }
73 // T6 (NEG CONTROL): only corpus archetypes are emitted -> no social.html (no social template in the seed)
74 var t6: i64=0; if (soc as i64)==0 { t6=1 }
75 // N7: EVERY composed page is ADA by construction (fleet-wide, not just one)
76 var n7: i64=0; if g_ada(land, lln)==1 { if g_ada(ecom, eln)==1 { if g_ada(res, rln)==1 { n7=1 } } }
77 // T8: PER-PATTERN variation pages emitted (seq-driven) -- reconstruct the landing pattern's v-name from
78 // the SOURCE template exactly as the organ does, read the emitted variation, assert exists + ADA shell.
79 let lsrc: *u8 = sys_read_file("web_assets/_tpl_seed/landing.html" as *u8, szp); let lsn: i64 = szp[0]
80 let vseq: *u8 = sys_mmap(256)
81 let vkey: *u8 = sys_mmap(64)
82 let vnam: *u8 = sys_mmap(64)
83 let vpath: *u8 = sys_mmap(256)
84 let la: i64 = ti_classify(lsrc, lsn)
85 ti_seq(lsrc, lsn, vseq)
86 ti_mkkey(la, vseq, vkey)
87 sa_vname(la, vkey, vnam)
88 var vo2: i64 = 0
89 var vpo: i64 = 0
90 vpo = 0
91 let vpre: *u8 = "/tmp/factory_gate/" as *u8
92 while vpre[vpo] != (0 as u8) { vpath[vpo] = vpre[vpo]; vpo = vpo + 1 }
93 var vni: i64 = 0
94 while vnam[vni] != (0 as u8) { vpath[vpo] = vnam[vni]; vpo = vpo + 1; vni = vni + 1 }
95 let vsuf: *u8 = ".html" as *u8
96 var vsi: i64 = 0
97 while vsuf[vsi] != (0 as u8) { vpath[vpo] = vsuf[vsi]; vpo = vpo + 1; vsi = vsi + 1 }
98 vpath[vpo] = 0 as u8
99 let vhtml: *u8 = sys_read_file(vpath, szp); let vhn: i64 = szp[0]
100 var t8: i64=0; if (vhtml as i64)!=0 { if g_ada(vhtml, vhn)==1 { if SA_NVAR>=3 { t8=1 } } }
101 // T9: the variation's SECTION ORDER follows the consumed seq (landing: feat < price < faq offsets)
102 var t9: i64=0
103 let o_f: i64 = g_find(vhtml, vhn, "id=\"features\"" as *u8)
104 let o_p: i64 = g_find(vhtml, vhn, "id=\"price\"" as *u8)
105 let o_q: i64 = g_find(vhtml, vhn, "id=\"faq\"" as *u8)
106 if o_f>=0 { if o_p>o_f { if o_q>o_p { t9=1 } } }
107
108 var passes: i64=0
109 if t1==1 { passes=passes+1 } if t2==1 { passes=passes+1 } if t3==1 { passes=passes+1 } if t4==1 { passes=passes+1 }
110 if t5==1 { passes=passes+1 } if t6==1 { passes=passes+1 } if n7==1 { passes=passes+1 }
111 if t8==1 { passes=passes+1 } if t9==1 { passes=passes+1 }
112 var green: i64=0; if passes==9 { green=1 }
113
114 gw("=== nx_site_archetype_gate -- R5 corpus->composed-site (award/ADA/responsive) ===\n" as *u8)
115 g_row("T1-gallery-lists-corpus-arch " as *u8, t1)
116 g_row("T2-landing-sclass+ada+responsive" as *u8, t2)
117 g_row("T3-landing-archetype-sections " as *u8, t3)
118 g_row("T4-ecommerce-distinct-layout " as *u8, t4)
119 g_row("T5-resume-distinct-layout " as *u8, t5)
120 g_row("T6-only-corpus-arch-emit(neg) " as *u8, t6)
121 g_row("N7-fleet-ada-by-construction " as *u8, n7)
122 g_row("T8-per-pattern-variation-emit " as *u8, t8)
123 g_row("T9-seq-order-fidelity " as *u8, t9)
124 gw("verdict=" as *u8); if green==1 { gw("GREEN" as *u8) } else { gw("RED" as *u8) }
125 gw(" passes=" as *u8); gn(passes); gw("/9 archetypes=" as *u8); gn(n); gw(" variations=" as *u8); gn(SA_NVAR); gw("\n" as *u8)
126
127 let lg: i64 = sys_openat_append("knowledge/status/site_archetype.log" as *u8, 0x1a4)
128 if lg >= 0 {
129 if green==1 { let m: *u8 = "SITE-ARCHETYPE rows=9 pass=9 verdict=GREEN\n" as *u8; sys_write(lg, m, 43) }
130 else { let m2: *u8 = "SITE-ARCHETYPE verdict=RED\n" as *u8; sys_write(lg, m2, 27) }
131 sys_close(lg)
132 }
133 if green==1 { return 0 }
134 return 1
135}