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}