code wiki / _hdl_build / nx_site_handoff_gate.nx
nx_site_handoff_gate.nx source
↩ module page · 81 lines · 4661 B
1// nx_site_handoff_gate.nx -- referee for R-HANDOFF (nx_site_handoff). Reads the artifacts the wrapper produced:
2// (1) the emitted .site blueprint (from the factory .req, ecommerce archetype), (2) the docroot nx_site_build
3// REBUILT from that blueprint (proving the PRODUCTION editor stack -- siteedit/save/preview/publish -- can own
4// and customize the factory's output), (3) negative-control exit codes (unknown archetype refused, missing brief
5// refused). GREEN iff 6/6. license_tier: ORIGINAL expect_exit: 0
6import "nx_gate.nx"
7
8func hg_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
9func hg_has(hay: *u8, hn: i64, needle: *u8) -> i64 {
10 if (hay as i64)==0 { return 0 }
11 let nl: i64 = hg_slen(needle)
12 if nl==0 { return 1 }
13 var i: i64=0
14 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 }
15 return 0
16}
17func hg_count(hay: *u8, hn: i64, needle: *u8) -> i64 {
18 if (hay as i64)==0 { return 0 }
19 let nl: i64 = hg_slen(needle)
20 if nl==0 { return 0 }
21 var c: i64=0
22 var i: i64=0
23 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 { c=c+1; i=i+nl } else { i=i+1 } }
24 return c
25}
26func hg_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 }
27
28func main() -> i64 {
29 let szp: *i64 = sys_mmap(16) as *i64
30 let site: *u8 = sys_read_file("/tmp/handoff_ecom.site" as *u8, szp); let sn: i64 = szp[0]
31 let idx: *u8 = sys_read_file("/tmp/handoff_docroot/index.html" as *u8, szp); let iln: i64 = szp[0]
32 let sm: *u8 = sys_read_file("/tmp/handoff_docroot/sitemap.xml" as *u8, szp); let sml: i64 = szp[0]
33 let rc1: *u8 = sys_read_file("/tmp/handoff_rc_badarch" as *u8, szp)
34 let rc2: *u8 = sys_read_file("/tmp/handoff_rc_noreq" as *u8, szp)
35
36 // T1: the blueprint speaks the FULL .site grammar the prod editor validates
37 var t1: i64=0
38 if hg_has(site, sn, "title|" as *u8)==1 { if hg_has(site, sn, "header|Nishi|" as *u8)==1 {
39 if hg_has(site, sn, "hero|" as *u8)==1 { if hg_count(site, sn, "card|" as *u8)>=6 {
40 if hg_count(site, sn, "step|" as *u8)>=3 { if hg_count(site, sn, "sig|" as *u8)>=3 {
41 if hg_has(site, sn, "footer|" as *u8)==1 { t1=1 } } } } } } }
42 // T2: the .req brief's REAL copy landed in the blueprint (data-layer handoff, not defaults)
43 var t2: i64=0
44 if hg_has(site, sn, "Hand-thrown stoneware mug" as *u8)==1 { if hg_has(site, sn, "Linen throw blanket" as *u8)==1 { t2=1 } }
45 // T3: nx_site_build REBUILT a whole site from the handoff blueprint (the andelinwest customize loop)
46 var t3: i64=0
47 if (idx as i64)!=0 { if hg_has(idx, iln, "class=\"skip-link\"" as *u8)==1 { if hg_has(idx, iln, "<nav class=\"top\">" as *u8)==1 { if hg_has(idx, iln, "Hand-thrown stoneware mug" as *u8)==1 { t3=1 } } } }
48 // T4: the rebuilt site self-emitted a sitemap listing home + one page per card
49 var t4: i64=0
50 if hg_count(sm, sml, "<loc>" as *u8) >= 7 { t4=1 }
51 // T5 (NEG): unknown archetype refused (exit 2)
52 var t5: i64=0
53 if (rc1 as i64)!=0 { if (rc1[0] as i64)==50 { t5=1 } }
54 // T6 (NEG): missing brief refused (exit 3)
55 var t6: i64=0
56 if (rc2 as i64)!=0 { if (rc2[0] as i64)==51 { t6=1 } }
57
58 var passes: i64=0
59 if t1==1 { passes=passes+1 } if t2==1 { passes=passes+1 } if t3==1 { passes=passes+1 }
60 if t4==1 { passes=passes+1 } if t5==1 { passes=passes+1 } if t6==1 { passes=passes+1 }
61 var green: i64=0; if passes==6 { green=1 }
62
63 gw("=== nx_site_handoff_gate -- R-HANDOFF factory -> prod-customizable .site ===\n" as *u8)
64 hg_row("T1-blueprint-full-grammar " as *u8, t1)
65 hg_row("T2-req-copy-landed " as *u8, t2)
66 hg_row("T3-prod-emitter-rebuilds-site " as *u8, t3)
67 hg_row("T4-sitemap-lists-pages " as *u8, t4)
68 hg_row("T5-unknown-arch-refused(neg) " as *u8, t5)
69 hg_row("T6-missing-brief-refused(neg) " as *u8, t6)
70 gw("verdict=" as *u8); if green==1 { gw("GREEN" as *u8) } else { gw("RED" as *u8) }
71 gw(" passes=" as *u8); gn(passes); gw("/6\n" as *u8)
72
73 let lg: i64 = sys_openat_append("knowledge/status/site_handoff.log" as *u8, 0x1a4)
74 if lg >= 0 {
75 if green==1 { let m: *u8 = "SITE-HANDOFF rows=6 pass=6 verdict=GREEN\n" as *u8; sys_write(lg, m, 41) }
76 else { let m2: *u8 = "SITE-HANDOFF verdict=RED\n" as *u8; sys_write(lg, m2, 25) }
77 sys_close(lg)
78 }
79 if green==1 { return 0 }
80 return 1
81}