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 '&' -> '&amp;' 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 &amp; 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 &amp; 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}