code wiki / _hdl_build / nx_wiki_answer_gate.nx

nx_wiki_answer_gate.nx source

↩ module page · 84 lines · 5728 B

1// nx_wiki_answer_gate.nx -- KAT RELEVANCE + TEETH for the instant-answer organ (IMS Thrust B rung 1). 2// The engineer's re-runnable instrument: import nx_wiki_answer, call answer() in-process over the COMMITTED 3// live wiki index (knowledge/index/wiki.idx + .manifest, registered in knowledge/index/onsite_sites.tsv), 4// and assert -- for a fixed query -> correct-source oracle -- that: 5// * the verdict is WA_OK, 6// * the source slug is EXACTLY the expected page slug (the slug-garble bug regression check), 7// * the answer snippet is NON-EMPTY (we actually surfaced a passage, not just a verdict), 8// and that the NONSENSE query "xyzzy qwffz" returns WA_NO_ANSWER (TEETH: no fabrication, the threshold gate 9// refuses rather than inventing an answer). 10// 11// KAT oracle (query -> expected slug): 12// "zero trust access" -> access_wall 13// "NIST STEM maturity" -> nist_stem 14// "capitalism lab game" -> econsim 15// "genesis genealogy lineage" -> genesis_genealogy 16// "rollback versions" -> devlog (holds the versioning/rollback prose) 17// "chacha beats openssl" -> simd_backend (the measured ~3% Zen1 exceed -- batch #2) 18// "sovereign desktop operating system microkernel" -> nishi_os (the OS substrate page -- batch #2) 19// "xyzzy qwffz" -> WA_NO_ANSWER (teeth) 20// 21// GREEN iff all 8 rows pass. Durable verdict appends to knowledge/status/wiki_answer_gate.log. 22// REUSE not reinvent: the whole search stack (registry lookup, BM25F, snippet extract, threshold) IS 23// nx_wiki_answer; this gate only feeds it the oracle and checks the verdict/slug/snippet it returns. 24// license_tier: ORIGINAL 25import "nx_wiki_answer.nx" 26 27func wg_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 28func wg_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 } 29func wg_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 } 30func wg_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 } 31func wg_streq(a: *u8, b: *u8) -> i64 { var i: i64=0; while a[i]!=(0 as u8){ if a[i]!=b[i] { return 0 } i=i+1 } if b[i]!=(0 as u8) { return 0 } return 1 } 32func wg_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 33 34// one KAT row: run answer(query), require WA_OK + slug==expect + non-empty snippet. Returns 1 on pass. 35func wg_check_ok(query: *u8, expect: *u8) -> i64 { 36 let a: *WaAnswer = wa_new() 37 answer(query, a) 38 wg_puts(" Q='" as *u8); wg_puts(query); wg_puts("' -> verdict=" as *u8); wg_puts(wa_verdict_name(a.verdict)) 39 wg_puts(" slug='" as *u8); wg_puts(a.slug); wg_puts("' (want '" as *u8); wg_puts(expect); wg_puts("') snipB=" as *u8); wg_num(wg_slen(a.snippet)) 40 var ok: i64 = 1 41 if a.verdict != WA_OK { ok = 0 } 42 if wg_streq(a.slug, expect) == 0 { ok = 0 } 43 if wg_slen(a.snippet) <= 0 { ok = 0 } 44 if ok == 1 { wg_puts(" PASS\n" as *u8); return 1 } 45 wg_puts(" FAIL\n" as *u8); return 0 46} 47 48// teeth row: a nonsense query MUST return WA_NO_ANSWER with empty slug/snippet (no fabrication). Returns 1 on pass. 49func wg_check_no_answer(query: *u8) -> i64 { 50 let a: *WaAnswer = wa_new() 51 answer(query, a) 52 wg_puts(" Q='" as *u8); wg_puts(query); wg_puts("' -> verdict=" as *u8); wg_puts(wa_verdict_name(a.verdict)) 53 wg_puts(" slugB=" as *u8); wg_num(wg_slen(a.slug)); wg_puts(" snipB=" as *u8); wg_num(wg_slen(a.snippet)) 54 if a.verdict == WA_NO_ANSWER { if wg_slen(a.slug) == 0 { if wg_slen(a.snippet) == 0 { 55 wg_puts(" PASS (refused, no fabrication)\n" as *u8); return 1 56 } } } 57 wg_puts(" FAIL (FABRICATED!)\n" as *u8); return 0 58} 59 60func main() -> i64 { 61 wg_puts("=== WIKI ANSWER GATE (instant-answer KAT relevance + slug correctness + NO_ANSWER teeth) ===\n" as *u8) 62 var pass: i64 = 0 63 let rows: i64 = 8 64 65 pass = pass + wg_check_ok("zero trust access" as *u8, "access_wall" as *u8) 66 pass = pass + wg_check_ok("NIST STEM maturity" as *u8, "nist_stem" as *u8) 67 pass = pass + wg_check_ok("capitalism lab game" as *u8, "econsim" as *u8) 68 pass = pass + wg_check_ok("genesis genealogy lineage" as *u8, "genesis_genealogy" as *u8) 69 pass = pass + wg_check_ok("rollback versions" as *u8, "devlog" as *u8) 70 // batch #2 real-tree pages now covered by the re-indexed corpus (19 docs): 71 pass = pass + wg_check_ok("chacha beats openssl" as *u8, "simd_backend" as *u8) 72 pass = pass + wg_check_ok("sovereign desktop operating system microkernel" as *u8, "nishi_os" as *u8) 73 pass = pass + wg_check_no_answer("xyzzy qwffz" as *u8) 74 75 wg_puts("----\nWIKI-ANSWER-GATE rows=" as *u8); wg_num(rows); wg_puts(" pass=" as *u8); wg_num(pass); wg_puts("\n" as *u8) 76 let lg: i64 = sys_openat_append("knowledge/status/wiki_answer_gate.log" as *u8, 0x1a4) 77 if lg >= 0 { 78 wg_w(lg, "WIKI-ANSWER-GATE rows=" as *u8); wg_wn(lg, rows); wg_w(lg, " pass=" as *u8); wg_wn(lg, pass) 79 if pass == rows { wg_w(lg, " verdict=GREEN\n" as *u8) } else { wg_w(lg, " verdict=RED\n" as *u8) } 80 sys_close(lg) 81 } 82 if pass == rows { wg_puts("WIKI-ANSWER-GATE GREEN\n" as *u8); sys_exit(0); return 0 } 83 wg_puts("WIKI-ANSWER-GATE RED\n" as *u8); sys_exit(1); return 1 84}