code wiki / _hdl_build / nx_meet_emit_gate.nx
nx_meet_emit_gate.nx source
↩ module page · 117 lines · 8626 B
1import "nx_gate_gn.nx"
2// nx_meet_emit_gate.nx -- liar-kill gate for R1 (+P1 nav, +R1b escaping). Sovereign fork/exec: two swapped-side
3// fixtures -> emit each to web_assets/site_<slug>/index.html, then assert: sovereignty floor, token-driven +
4// responsive, a real HEADER NAV (Home/Jobs/Apply/Hire/About -> clean URLs), the two-sided structure, DATA-DRIVEN
5// + HTML-ESCAPED content (brand/side '&' -> '&' present, raw ABSENT), and REUSABLE-VENN-WITH-TEETH (the
6// contractors/clients page shows those sides and does NOT leak Candidates/Recruiters). expect_exit: 0
7import "nx_syscalls.nx"
8import "nx_gate_verdict.nx"
9
10func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
11func gslen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
12func gfind(hay: *u8, hl: i64, needle: *u8) -> i64 {
13 let nl: i64 = gslen(needle); if nl == 0 { return 0-1 }
14 var i: i64 = 0
15 while i + nl <= hl { var k: i64=0; var hit: i64=1; while k<nl { if hay[i+k]!=needle[k]{hit=0;k=nl}else{k=k+1} } if hit==1 {return i} i=i+1 }
16 return 0-1
17}
18func ghas(hay: *u8, hl: i64, needle: *u8) -> i64 { if gfind(hay, hl, needle) >= 0 { return 1 } return 0 }
19func gwrite(path: *u8, s: *u8) -> i64 {
20 let fd: i64 = sys_openat_wr(path, 0x1a4)
21 if fd < 0 { return 0 - 1 }
22 var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 }
23 sys_write(fd, s, n); sys_close(fd); return n
24}
25func spawn(path: *u8, a0: *u8, a1: *u8, redir: *u8) -> i64 {
26 let pid: i64 = sys_fork()
27 if pid == 0 {
28 let fd: i64 = sys_openat_wr(redir, 420)
29 if fd >= 0 { sys_dup3(fd, 1, 0); sys_dup3(fd, 2, 0) }
30 let argv: *i64 = sys_mmap(64) as *i64
31 var n: i64 = 0
32 argv[0] = path as i64; n = 1
33 if (a0 as i64) != 0 { argv[n] = a0 as i64; n = n + 1 }
34 if (a1 as i64) != 0 { argv[n] = a1 as i64; n = n + 1 }
35 argv[n] = 0
36 let envp: *i64 = sys_mmap(16) as *i64
37 envp[0] = "PATH=/usr/bin:/bin\x00" as *u8 as i64; envp[1] = 0
38 sys_execve(path, argv, envp)
39 sys_exit(127)
40 }
41 let st: *i64 = sys_mmap(16) as *i64
42 sys_wait4(pid, st, 0)
43 return (st[0] >> 8) & 0xff
44}
45
46func main() -> i64 {
47 gp("=== nx_meet_emit_gate: R1 home -- sovereign + nav + escaped + reusable venn ===\n" as *u8)
48 let RUNNER: *u8 = "_offc/nx_sov_build_run.elf\x00" as *u8
49 let EMIT: *u8 = "/tmp/nx_meet_emit.sov.elf\x00" as *u8
50 let SCRATCH: *u8 = "knowledge/status/meet_emit_gate_scratch.log\x00" as *u8
51
52 spawn(RUNNER, "nx_meet_emit\x00" as *u8, 0 as *u8, SCRATCH)
53 gwrite("web_assets/meet_gatedemo.meet\x00" as *u8, "meet|brand|Community Meet -- McKinney & DFW\nmeet|region|McKinney & the Dallas metro\nmeet|zip|75071\nmeet|sideA|Candidates\nmeet|sideB|Recruiters & Employers\nmeet|sideA_body|Get seen by real recruiters.\nmeet|sideB_body|Meet pre-verified local candidates.\nmeet|hero_headline|Quality meets quality.\nmeet|cta_label|Request an invite\n" as *u8)
54 gwrite("web_assets/meet_gatevenn.meet\x00" as *u8, "meet|brand|Trade Meet -- North Texas\nmeet|region|North Texas\nmeet|zip|75071\nmeet|sideA|Contractors\nmeet|sideB|Clients\nmeet|sideA_body|Get hired by real clients.\nmeet|sideB_body|Meet vetted local contractors.\nmeet|hero_headline|Quality meets quality.\nmeet|cta_label|Request an invite\n" as *u8)
55
56 spawn(EMIT, "gatedemo\x00" as *u8, 0 as *u8, SCRATCH)
57 spawn(EMIT, "gatevenn\x00" as *u8, 0 as *u8, SCRATCH)
58
59 let lp: *i64 = sys_mmap(16) as *i64; lp[0] = 0
60 let h: *u8 = sys_read_file("web_assets/site_gatedemo/index.html\x00" as *u8, lp)
61 if (h as i64) == 0 { gp("MEET-EMIT-GATE verdict=RED reason=demo-output-missing\n" as *u8); sys_exit(1); return 1 }
62 let n: i64 = lp[0]
63 let lp2: *i64 = sys_mmap(16) as *i64; lp2[0] = 0
64 let v: *u8 = sys_read_file("web_assets/site_gatevenn/index.html\x00" as *u8, lp2)
65 if (v as i64) == 0 { gp("MEET-EMIT-GATE verdict=RED reason=venn-output-missing\n" as *u8); sys_exit(1); return 1 }
66 let vn: i64 = lp2[0]
67 gp(" demo bytes=" as *u8); gn(n); gp(" venn bytes=" as *u8); gn(vn); gp("\n" as *u8)
68
69 var pass: i64 = 0; var fail: i64 = 0
70 // sovereignty floor
71 if gfind(h, n, "<script" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL has-script\n" as *u8) }
72 if gfind(h, n, "eval(" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL has-eval\n" as *u8) }
73 if gfind(h, n, "javascript:" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL has-jsurl\n" as *u8) }
74 if gfind(h, n, "onclick" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL has-inline-handler\n" as *u8) }
75 if gfind(h, n, "src=" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL has-external-src\n" as *u8) }
76 // token-driven + responsive
77 if ghas(h, n, ":root{" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-root-tokens\n" as *u8) }
78 if ghas(h, n, "var(--nx-color-primary)" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL not-token-driven\n" as *u8) }
79 if ghas(h, n, "width=device-width" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL not-responsive\n" as *u8) }
80 // P1: real header nav -> clean URLs
81 if ghas(h, n, "class=\"nav\"" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-nav\n" as *u8) }
82 if ghas(h, n, ">Home<" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-nav-home\n" as *u8) }
83 if ghas(h, n, ">Jobs<" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-nav-jobs\n" as *u8) }
84 if ghas(h, n, ">Apply<" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-nav-apply\n" as *u8) }
85 if ghas(h, n, ">Hire<" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-nav-hire\n" as *u8) }
86 if ghas(h, n, ">About<" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-nav-about\n" as *u8) }
87 if ghas(h, n, "href=\"jobs.html\"" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-clean-jobs-href\n" as *u8) }
88 if ghas(h, n, "href=\"apply.html\"" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-clean-apply-href\n" as *u8) }
89 // two-sided structure
90 if ghas(h, n, "<header" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-header\n" as *u8) }
91 if ghas(h, n, "class=\"hero\"" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-hero\n" as *u8) }
92 if ghas(h, n, "Step 1" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-steps\n" as *u8) }
93 if ghas(h, n, "class=\"trust\"" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL no-trust\n" as *u8) }
94 // DATA-DRIVEN + ESCAPED (R1b)
95 if ghas(h, n, "Community Meet -- McKinney & DFW" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL brand-not-escaped\n" as *u8) }
96 if gfind(h, n, "McKinney & DFW" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL raw-amp-leaked\n" as *u8) }
97 if ghas(h, n, "For Candidates" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL demo-sideA-missing\n" as *u8) }
98 if ghas(h, n, "For Recruiters & Employers" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL sideB-not-escaped\n" as *u8) }
99 if gfind(h, n, "Recruiters & Employers" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL raw-sideB-leaked\n" as *u8) }
100 if ghas(h, n, "Quality meets quality." as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL demo-hero-missing\n" as *u8) }
101 // REUSABLE VENN + teeth
102 if ghas(v, vn, "For Contractors" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL venn-sideA-missing\n" as *u8) }
103 if ghas(v, vn, "For Clients" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL venn-sideB-missing\n" as *u8) }
104 if gfind(v, vn, "Candidates" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL venn-leaks-candidates\n" as *u8) }
105 if gfind(v, vn, "Recruiters" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL venn-leaks-recruiters\n" as *u8) }
106
107 gp("MEET-EMIT-GATE pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
108 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
109 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
110 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
111 let ctr__dry: *i64 = gv_ctr()
112 ctr__dry[0] = pass
113 ctr__dry[1] = pass + fail
114 let rc__dry: i64 = gv_verdict("MEET-EMIT-GATE" as *u8, ctr__dry, "sovereign 0-JS home; nav + clean URLs + escaped data + reusable venn)" as *u8)
115 sys_exit(rc__dry)
116 return rc__dry
117}