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}