code wiki / _hdl_build / nx_site_build_gate.nx

nx_site_build_gate.nx source

↩ module page · 97 lines · 6364 B

1import "nx_gate_gn.nx" 2import "nx_gate_base.nx" 3// 2026-08-12: nx_gate.nx import DROPPED (below, was line 8): it duplicated gw/gn against nx_gate_gn, 4// and the stricter compiler refuses the collision instead of silently picking one. g_slen/gw/gn all 5// come from the gn/base pair now. 6// nx_site_build_gate.nx -- referee for the R1 WHOLE-SITE emitter (nx_site_build). Reads the emitted 7// andelinwest site fixture (web_assets/sites/andelinwest/, produced by running nx_site_build first) and PROVES 8// the whole-site invariants the factory census named: a SHARED cross-page nav on every page, INTERNAL links that 9// resolve to pages that EXIST, a self-emitted sitemap.xml listing every page, and robots.txt. Positive tests + 10// a negative control (no fabricated links). GREEN iff 8/8. license_tier: ORIGINAL expect_exit: 0 11 12// substring search: 1 if needle occurs in hay[0..hn). needle is NUL-terminated. 13func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 14" as *u8); return ok } 15func g_has(hay: *u8, hn: i64, needle: *u8) -> i64 { 16 if (hay as i64)==0 { return 0 } 17 let nl: i64 = g_slen(needle) 18 if nl==0 { return 1 } 19 var i: i64=0 20 while i+nl<=hn { 21 var j: i64=0; var ok: i64=1 22 while j<nl { if (hay[i+j] as i64)!=(needle[j] as i64) { ok=0; j=nl } else { j=j+1 } } 23 if ok==1 { return 1 } 24 i=i+1 25 } 26 return 0 27} 28func g_navok(hay: *u8, hn: i64) -> i64 { 29 if g_has(hay, hn, "<nav class=\"top\">" as *u8)==0 { return 0 } 30 if g_has(hay, hn, "href=\"/practice/family-law.html\"" as *u8)==0 { return 0 } 31 if g_has(hay, hn, "href=\"/practice/personal-injury.html\"" as *u8)==0 { return 0 } 32 return 1 33} 34func 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 } 35 36func main() -> i64 { 37 let szp: *i64 = sys_mmap(16) as *i64 38 let idx: *u8 = sys_read_file("web_assets/sites/andelinwest/index.html" as *u8, szp); let iln: i64 = szp[0] 39 let f0: *u8 = sys_read_file("web_assets/sites/andelinwest/practice/family-law.html" as *u8, szp); let l0: i64 = szp[0] 40 let f1: *u8 = sys_read_file("web_assets/sites/andelinwest/practice/estate-planning.html" as *u8, szp); let l1: i64 = szp[0] 41 let f2: *u8 = sys_read_file("web_assets/sites/andelinwest/practice/business-law.html" as *u8, szp); let l2: i64 = szp[0] 42 let f3: *u8 = sys_read_file("web_assets/sites/andelinwest/practice/personal-injury.html" as *u8, szp); let l3: i64 = szp[0] 43 let sm: *u8 = sys_read_file("web_assets/sites/andelinwest/sitemap.xml" as *u8, szp); let sl: i64 = szp[0] 44 let rb: *u8 = sys_read_file("web_assets/sites/andelinwest/robots.txt" as *u8, szp); let rl: i64 = szp[0] 45 46 // T1: index exists + shared cross-page nav (Home + all practice hrefs) 47 var t1: i64=0; if (idx as i64)!=0 { if g_navok(idx, iln)==1 { if g_has(idx, iln, "href=\"/\">Home</a>" as *u8)==1 { t1=1 } } } 48 // T2: index has INTERNAL card links to practice pages (the sk_card_link primitive) 49 var t2: i64=0; if g_has(idx, iln, "<a class=\"card\" href=\"/practice/" as *u8)==1 { t2=1 } 50 // T3: index ships s-class shell markers (skip-link + lang + onsite search + conversion CTA) 51 var t3: i64=0; if g_has(idx, iln, "class=\"skip-link\"" as *u8)==1 { if g_has(idx, iln, "lang=\"en\"" as *u8)==1 { if g_has(idx, iln, "role=\"search\"" as *u8)==1 { if g_has(idx, iln, "btn btn-primary" as *u8)==1 { t3=1 } } } } 52 // T4: ALL 4 practice pages exist and carry the SAME shared nav (cross-page navigation) 53 var np: i64=0 54 if (f0 as i64)!=0 { if g_navok(f0,l0)==1 { np=np+1 } } 55 if (f1 as i64)!=0 { if g_navok(f1,l1)==1 { np=np+1 } } 56 if (f2 as i64)!=0 { if g_navok(f2,l2)==1 { np=np+1 } } 57 if (f3 as i64)!=0 { if g_navok(f3,l3)==1 { np=np+1 } } 58 var t4: i64=0; if np==4 { t4=1 } 59 // T5: practice pages cross-link to SIBLINGS (family-law -> estate-planning) and back home 60 var t5: i64=0; if g_has(f0, l0, "href=\"/practice/estate-planning.html\"" as *u8)==1 { if g_has(f0, l0, "href=\"/\">Back to home</a>" as *u8)==1 { t5=1 } } 61 // T6: sitemap.xml lists home + every practice page (5 urls) 62 var t6: i64=0 63 if g_has(sm, sl, "<loc>https://andelinwest.com/</loc>" as *u8)==1 { 64 if g_has(sm, sl, "/practice/family-law.html</loc>" as *u8)==1 { 65 if g_has(sm, sl, "/practice/business-law.html</loc>" as *u8)==1 { 66 if g_has(sm, sl, "/practice/personal-injury.html</loc>" as *u8)==1 { t6=1 } } } } 67 // T7: robots.txt references the sitemap 68 var t7: i64=0; if g_has(rb, rl, "Sitemap: https://andelinwest.com/sitemap.xml" as *u8)==1 { t7=1 } 69 // N1 (NEG CONTROL): nav is DERIVED from real cards -> a slug that is NOT a card must NOT appear (no fabricated links) 70 var n1: i64=0; if g_has(idx, iln, "/practice/tax-law.html" as *u8)==0 { n1=1 } 71 72 var passes: i64=0 73 if t1==1 { passes=passes+1 } if t2==1 { passes=passes+1 } if t3==1 { passes=passes+1 } if t4==1 { passes=passes+1 } 74 if t5==1 { passes=passes+1 } if t6==1 { passes=passes+1 } if t7==1 { passes=passes+1 } if n1==1 { passes=passes+1 } 75 var green: i64=0; if passes==8 { green=1 } 76 77 gw("=== nx_site_build_gate -- R1 whole-site invariants (andelinwest fixture) ===\n" as *u8) 78 g_row("T1-shared-cross-page-nav " as *u8, t1) 79 g_row("T2-internal-card-links " as *u8, t2) 80 g_row("T3-s-class-shell-markers " as *u8, t3) 81 g_row("T4-all-4-practice-pages+nav " as *u8, t4) 82 g_row("T5-sibling-crosslink+home " as *u8, t5) 83 g_row("T6-sitemap.xml-lists-all " as *u8, t6) 84 g_row("T7-robots.txt-sitemap " as *u8, t7) 85 g_row("N1-no-fabricated-links(neg) " as *u8, n1) 86 gw("verdict=" as *u8); if green==1 { gw("GREEN" as *u8) } else { gw("RED" as *u8) } 87 gw(" passes=" as *u8); gn(passes); gw("/8 practice_pages_with_nav=" as *u8); gn(np); gw("\n" as *u8) 88 // persist the verdict (census-readable; the referee line, not a claim) 89 let lg: i64 = sys_openat_append("knowledge/status/site_build.log" as *u8, 0x1a4) 90 if lg >= 0 { 91 if green==1 { let m: *u8 = "SITE-BUILD rows=8 pass=8 verdict=GREEN\n" as *u8; sys_write(lg, m, 39) } 92 else { let m2: *u8 = "SITE-BUILD verdict=RED\n" as *u8; sys_write(lg, m2, 23) } 93 sys_close(lg) 94 } 95 if green==1 { return 0 } 96 return 1 97}