code wiki / _hdl_build / nx_onsite_search_gate.nx

nx_onsite_search_gate.nx source

↩ module page · 204 lines · 10716 B

1// nx_onsite_search_gate.nx -- the engineer's re-runnable instrument for the REUSABLE onsite search client 2// (manifest model). Builds TWO isolated site corpora (alpha = andelinwest-like practice docs; beta = 3// gallery-like image-meta docs), each its OWN durable inverted index + MANIFEST (url<TAB>title<TAB>text), 4// registers both in a sites TSV, then forks+execs the REAL /tmp/nx_onsite_search.sov.elf over a KAT + 5// neg-control oracle: 6// - BM25 lands the right doc #1 on its own term (3 rows: probate->Estate, custody->Family, llc->Business) 7// - per-site ISOLATION holds BOTH directions (alpha can't see a beta-only term; beta can't see alpha-only) 8// - beta works on its own term (portrait->beta doc) 9// - an UNKNOWN site fails clean (exit 1, "unknown site"), not a crash 10// GREEN iff all 7 rows pass. Durable verdict appends to knowledge/status/onsite_search_gate.log. 11// license_tier: ORIGINAL 12import "nx_search_inverted_persist.nx" 13import "nx_g_puts_lib.nx" 14 15func g_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 } 16func g_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 } 17func g_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 } 18func g_strlen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 19 20func g_write_file(path: *u8, data: *u8) -> i64 { 21 let fd: i64=sys_openat_wr(path, 0x1a4) 22 if fd<0 { return 0-1 } 23 sys_write(fd, data, g_strlen(data)) 24 sys_close(fd) 25 return 0 26} 27func g_read_small(path: *u8, buf: *u8, cap: i64) -> i64 { 28 let fd: i64=sys_openat_rd(path) 29 if fd<0 { return 0 } 30 var total: i64=0 31 var nrd: i64=sys_read(fd, buf, cap) 32 while nrd>0 { total=total+nrd; if total>=cap { nrd=0 } else { nrd=sys_read(fd, ((buf as i64)+total) as *u8, cap-total) } } 33 sys_close(fd) 34 return total 35} 36 37// build one site: index over texts (docid=line) + write manifest url<TAB>title<TAB>text. fork-isolated so the 38// index's big virtual reservation is reclaimed on child exit. 39func g_build_site(urls: *i64, titles: *i64, texts: *i64, nd: i64, idx_path: *u8, manifest_path: *u8) -> i64 { 40 let pid: i64=sys_fork() 41 if pid==0 { 42 let idx: *NxInvIndex=nx_inv_new(nd+8) 43 var i: i64=0 44 while i<nd { nx_inv_index_row(idx, texts[i] as *u8, g_strlen(texts[i] as *u8), i); i=i+1 } 45 idx.n_rows=nd 46 nx_inv_finalize_offsets(idx) 47 i=0 48 while i<nd { nx_inv_emit_row(idx, texts[i] as *u8, g_strlen(texts[i] as *u8), i); i=i+1 } 49 nx_inv_save(idx, idx_path) 50 let dfd: i64=sys_openat_wr(manifest_path, 0x1a4) 51 if dfd>=0 { 52 i=0 53 while i<nd { 54 let u: *u8=urls[i] as *u8; let ti: *u8=titles[i] as *u8; let x: *u8=texts[i] as *u8 55 sys_write(dfd, u, g_strlen(u)); sys_write(dfd, "\t" as *u8, 1) 56 sys_write(dfd, ti, g_strlen(ti)); sys_write(dfd, "\t" as *u8, 1) 57 sys_write(dfd, x, g_strlen(x)); sys_write(dfd, "\n" as *u8, 1) 58 i=i+1 59 } 60 sys_close(dfd) 61 } 62 sys_exit(0) 63 } 64 let st: *i64=sys_mmap(16) as *i64 65 sys_wait4(pid, st, 0) 66 return 0 67} 68 69func g_run(sites: *u8, site: *u8, term: *u8, out_path: *u8) -> i64 { 70 let pid: i64=sys_fork() 71 if pid==0 { 72 let out: i64=sys_openat_wr(out_path, 0x1a4) 73 if out>=0 { sys_dup3(out, 1, 0) } 74 let argv: *i64=sys_mmap(8*6) as *i64 75 argv[0]="/tmp/nx_onsite_search.sov.elf" as *u8 as i64 76 argv[1]=sites as i64; argv[2]=site as i64; argv[3]=term as i64; argv[4]=0 77 let envp: *i64=sys_mmap(16) as *i64; envp[0]="PATH=/usr/bin:/bin" as *u8 as i64; envp[1]=0 78 sys_execve("/tmp/nx_onsite_search.sov.elf" as *u8, argv, envp) 79 sys_exit(127) 80 } 81 let st: *i64=sys_mmap(16) as *i64 82 sys_wait4(pid, st, 0) 83 if (st[0]&0x7f)!=0 { return 128+(st[0]&0x7f) } 84 return (st[0]>>8)&0xff 85} 86 87func g_find(hay: *u8, n: i64, needle: *u8) -> i64 { 88 let nl: i64=g_strlen(needle) 89 if nl==0 { return 0-1 } 90 var i: i64=0 91 while i+nl<=n { 92 var j: i64=0; var hit: i64=1 93 while j<nl { if hay[i+j]!=needle[j] { hit=0; j=nl } else { j=j+1 } } 94 if hit==1 { return i } 95 i=i+1 96 } 97 return 0-1 98} 99func g_contains(hay: *u8, n: i64, needle: *u8) -> i64 { if g_find(hay,n,needle)>=0 { return 1 } return 0 } 100func g_rank_of(buf: *u8, n: i64, expected: *u8) -> i64 { 101 let at: i64=g_find(buf, n, expected) 102 if at<0 { return 0 } 103 var ls: i64=at 104 while ls>0 { if buf[ls-1]==(10 as u8) { ls=0-ls } else { ls=ls-1 } } 105 if ls<0 { ls=0-ls } 106 let hash_at: i64=g_find(((buf as i64)+ls) as *u8, at-ls+1, "#" as *u8) 107 if hash_at<0 { return 0 } 108 var p: i64=ls+hash_at+1 109 var rank: i64=0 110 while p<n { let c: i64=buf[p] as i64; if c>=48 { if c<=57 { rank=rank*10+(c-48); p=p+1 } else { p=n } } else { p=n } } 111 return rank 112} 113 114func main() -> i64 { 115 g_puts("=== ONSITE SEARCH GATE (reusable per-site client, manifest model: BM25 KAT + isolation + unknown-site) ===\n" as *u8) 116 117 // alpha site: andelinwest-like practice-area docs (url<TAB>title<TAB>text) 118 let aurls: *i64=sys_mmap(8*3) as *i64 119 aurls[0]="/practice/family-law" as *u8 as i64 120 aurls[1]="/practice/estate-planning" as *u8 as i64 121 aurls[2]="/practice/business-law" as *u8 as i64 122 let atitles: *i64=sys_mmap(8*3) as *i64 123 atitles[0]="Family Law" as *u8 as i64 124 atitles[1]="Estate Planning" as *u8 as i64 125 atitles[2]="Business Law" as *u8 as i64 126 let atexts: *i64=sys_mmap(8*3) as *i64 127 atexts[0]="family law custody divorce child support alimony parenting time mediation" as *u8 as i64 128 atexts[1]="estate planning wills trusts probate inheritance executor administration guardianship" as *u8 as i64 129 atexts[2]="business law llc corporation formation contracts operating agreement partnership" as *u8 as i64 130 g_build_site(aurls, atitles, atexts, 3, "/tmp/os_alpha.idx" as *u8, "/tmp/os_alpha.manifest" as *u8) 131 132 // beta site: gallery-like image-metadata docs 133 let burls: *i64=sys_mmap(8*2) as *i64 134 burls[0]="/img/sunset" as *u8 as i64 135 burls[1]="/img/portrait" as *u8 as i64 136 let btitles: *i64=sys_mmap(8*2) as *i64 137 btitles[0]="Sunset" as *u8 as i64 138 btitles[1]="Portrait" as *u8 as i64 139 let btexts: *i64=sys_mmap(8*2) as *i64 140 btexts[0]="sunset landscape mountains golden hour photography wide angle scenic" as *u8 as i64 141 btexts[1]="studio portrait woman softbox lighting bokeh fifty millimeter headshot" as *u8 as i64 142 g_build_site(burls, btitles, btexts, 2, "/tmp/os_beta.idx" as *u8, "/tmp/os_beta.manifest" as *u8) 143 144 g_write_file("/tmp/os_sites.tsv" as *u8, 145 "alpha\t/tmp/os_alpha.idx\t/tmp/os_alpha.manifest\thttps://andelinwest.com\nbeta\t/tmp/os_beta.idx\t/tmp/os_beta.manifest\thttps://nishifamily.com/gallery\n" as *u8) 146 let sites: *u8="/tmp/os_sites.tsv" as *u8 147 let outp: *u8="/tmp/os_gate_out.txt" as *u8 148 let obuf: *u8=sys_mmap(65536) 149 150 var pass: i64=0 151 let rows: i64=7 152 153 let rc1: i64=g_run(sites, "alpha" as *u8, "probate" as *u8, outp) 154 let n1: i64=g_read_small(outp, obuf, 65536) 155 let rk1: i64=g_rank_of(obuf, n1, "/practice/estate-planning" as *u8) 156 g_puts(" row1 alpha 'probate' -> rank " as *u8); g_num(rk1) 157 if rk1==1 { pass=pass+1; g_puts(" PASS (Estate #1)\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } 158 159 let rc2: i64=g_run(sites, "alpha" as *u8, "custody" as *u8, outp) 160 let n2: i64=g_read_small(outp, obuf, 65536) 161 let rk2: i64=g_rank_of(obuf, n2, "/practice/family-law" as *u8) 162 g_puts(" row2 alpha 'custody' -> rank " as *u8); g_num(rk2) 163 if rk2==1 { pass=pass+1; g_puts(" PASS (Family #1)\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } 164 165 let rc3: i64=g_run(sites, "alpha" as *u8, "llc" as *u8, outp) 166 let n3: i64=g_read_small(outp, obuf, 65536) 167 let rk3: i64=g_rank_of(obuf, n3, "/practice/business-law" as *u8) 168 g_puts(" row3 alpha 'llc' -> rank " as *u8); g_num(rk3) 169 if rk3==1 { pass=pass+1; g_puts(" PASS (Business #1)\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } 170 171 let rc4: i64=g_run(sites, "alpha" as *u8, "portrait" as *u8, outp) 172 let n4: i64=g_read_small(outp, obuf, 65536) 173 let iso4: i64=g_contains(obuf, n4, "matches=0" as *u8) 174 g_puts(" row4 alpha 'portrait' -> isolation matches=0? " as *u8); g_num(iso4) 175 if iso4==1 { pass=pass+1; g_puts(" PASS (alpha blind to beta)\n" as *u8) } else { g_puts(" FAIL (LEAK!)\n" as *u8) } 176 177 let rc5: i64=g_run(sites, "beta" as *u8, "probate" as *u8, outp) 178 let n5: i64=g_read_small(outp, obuf, 65536) 179 let iso5: i64=g_contains(obuf, n5, "matches=0" as *u8) 180 g_puts(" row5 beta 'probate' -> isolation matches=0? " as *u8); g_num(iso5) 181 if iso5==1 { pass=pass+1; g_puts(" PASS (beta blind to alpha)\n" as *u8) } else { g_puts(" FAIL (LEAK!)\n" as *u8) } 182 183 let rc6: i64=g_run(sites, "beta" as *u8, "portrait" as *u8, outp) 184 let n6: i64=g_read_small(outp, obuf, 65536) 185 let rk6: i64=g_rank_of(obuf, n6, "/img/portrait" as *u8) 186 g_puts(" row6 beta 'portrait' -> rank " as *u8); g_num(rk6) 187 if rk6==1 { pass=pass+1; g_puts(" PASS (Portrait #1)\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } 188 189 let rc7: i64=g_run(sites, "ghost" as *u8, "probate" as *u8, outp) 190 let n7: i64=g_read_small(outp, obuf, 65536) 191 let unk7: i64=g_contains(obuf, n7, "unknown site" as *u8) 192 g_puts(" row7 ghost (unknown) -> exit " as *u8); g_num(rc7); g_puts(" msg? " as *u8); g_num(unk7) 193 if rc7==1 { if unk7==1 { pass=pass+1; g_puts(" PASS (clean unknown-site fail)\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } } else { g_puts(" FAIL\n" as *u8) } 194 195 g_puts("----\nONSITE-GATE rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass); g_puts("\n" as *u8) 196 let lg: i64=sys_openat_append("knowledge/status/onsite_search_gate.log" as *u8, 0x1a4) 197 if lg>=0 { 198 g_w(lg, "ONSITE-GATE rows=" as *u8); g_wn(lg, rows); g_w(lg, " pass=" as *u8); g_wn(lg, pass) 199 if pass==rows { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) } 200 sys_close(lg) 201 } 202 if pass==rows { g_puts("ONSITE-GATE GREEN\n" as *u8); sys_exit(0); return 0 } 203 g_puts("ONSITE-GATE RED\n" as *u8); sys_exit(1); return 1 204}