code wiki / _hdl_build / nx_kkslider_stats_gate.nx
nx_kkslider_stats_gate.nx source
↩ module page · 109 lines · 6072 B
1// nx_kkslider_stats_gate.nx -- prove the slider-semantics ruler on fixtures with KNOWN answers
2// (2026-08-19). Assembles a pairs-dir at runtime under /tmp/kksliderstats_gate/ (fixture law: a
3// source-scanning detector must never find its trap in prose; idempotent: rebuilt from scratch every
4// run): two synthetic KK cards whose shapeValueBody arrays are EXACT msgpack float32 (0.25 vs 0.75 at
5// idx0, both 0.5 at idx1) with metas tagging only the first card "tall" -- so mean_tag/mean_rest/delta
6// have hand-computable values -- plus an AIS-marker card that MUST be counted skipped_dialect, and a
7// meta whose tags include the uploader-decoy shape ("username" must never read as a tag).
8// license_tier: ORIGINAL No hw writes (Rule 26).
9import "nx_syscalls.nx"
10import "nx_gate_verdict.nx"
11import "nx_tool_run.nx"
12
13const KG_OUT: i64 = 262144
14const KG_BUF: i64 = 4096
15const KG_NBODY: i64 = 44
16
17func kg2_s(b: *u8, at: i64, s: *u8) -> i64 { var i: i64 = 0; var p: i64 = at; while s[i] != (0 as u8) { b[p] = s[i]; p = p + 1; i = i + 1 } return p }
18func kg2_w(path: *u8, b: *u8, n: i64) -> i64 {
19 let fd: i64 = sys_openat_wr(path, MODE_0644)
20 if fd < 0 { return 0 - 1 }
21 sys_write(fd, b, n)
22 sys_close(fd)
23 return 0
24}
25// write a NUL-terminated literal, length DERIVED (a hand-counted length beside a string literal is a
26// second copy of that literal shape and the two drift silently -- rule 11, measured in this estate)
27func kg2_ws(path: *u8, s: *u8) -> i64 {
28 var n: i64 = 0
29 while s[n] != (0 as u8) { n = n + 1 }
30 return kg2_w(path, s, n)
31}
32// minimal png head + IEND + marker + a shapeValueBody msgpack array16 of 44 float32s, all = base
33// except idx0 = v0. float32 patterns: 0.25=0x3E800000 0.5=0x3F000000 0.75=0x3F400000
34func kg2_card(b: *u8, marker: *u8, v0hi: i64, v0lo: i64) -> i64 {
35 var i: i64 = 0
36 while i < KG_BUF { b[i] = 0 as u8; i = i + 1 }
37 b[0]=0x89 as u8; b[1]=0x50 as u8; b[2]=0x4e as u8; b[3]=0x47 as u8
38 b[11]=13 as u8
39 b[12]=0x49 as u8; b[13]=0x48 as u8; b[14]=0x44 as u8; b[15]=0x52 as u8
40 b[18]=0 as u8; b[19]=64 as u8
41 b[22]=0 as u8; b[23]=32 as u8
42 var p: i64 = kg2_s(b, 40, "IEND" as *u8)
43 p = 48
44 p = kg2_s(b, p, "x-lstinfo " as *u8)
45 p = kg2_s(b, p, marker)
46 p = kg2_s(b, p, " 0.0.0 Custom " as *u8)
47 p = kg2_s(b, p, "shapeValueBody" as *u8)
48 // msgpack array16 header: 0xdc + BE16 count
49 b[p] = 0xdc as u8; p = p + 1
50 b[p] = 0 as u8; p = p + 1
51 b[p] = KG_NBODY as u8; p = p + 1
52 var k: i64 = 0
53 while k < KG_NBODY {
54 b[p] = 0xca as u8
55 if k == 0 { b[p+1] = v0hi as u8; b[p+2] = v0lo as u8 } else { b[p+1] = 0x3f as u8; b[p+2] = 0 as u8 }
56 b[p+3] = 0 as u8
57 b[p+4] = 0 as u8
58 p = p + 5
59 k = k + 1
60 }
61 return p
62}
63
64func main(argc: i64, argv: *i64) -> i64 {
65 let ctr: *i64 = gv_ctr()
66 gv_head("nx_kkslider_stats_gate -- exact means on known fixtures, dialect skip counted, decoy tag unread" as *u8)
67 var elf: *u8 = "./nx_kkslider_stats.elf" as *u8
68 if argc >= 2 { elf = argv[1] as *u8 }
69 gv_puts(" subject: " as *u8); gv_puts(elf); gv_puts("\n" as *u8)
70 let probe: i64 = sys_openat_rd(elf)
71 if gv_need("stats-elf-present" as *u8, (probe >= 0) as i64, ctr) == 0 {
72 return gv_verdict("kksliderstats" as *u8, ctr, "subject binary absent; pass its path as argv[1]" as *u8)
73 }
74 sys_close(probe)
75 sys_mkdir("/tmp/kksliderstats_gate" as *u8, MODE_0755)
76 let b: *u8 = sys_mmap(KG_BUF)
77 // card A: idx0 = 0.25 (0x3E80) -> 250 permil, tagged "tall"
78 var n: i64 = kg2_card(b, "KoiKatuChara" as *u8, 0x3e, 0x80)
79 kg2_w("/tmp/kksliderstats_gate/a.png" as *u8, b, n)
80 kg2_ws("/tmp/kksliderstats_gate/a.meta.json" as *u8, "{\"data\":{\"uploader\":{\"username\":\"decoyshape\"},\"tags\":[{\"name\":\"tall\",\"count\":1}]}}" as *u8)
81 // card B: idx0 = 0.75 (0x3F40) -> 750 permil, untagged
82 n = kg2_card(b, "KoiKatuChara" as *u8, 0x3f, 0x40)
83 kg2_w("/tmp/kksliderstats_gate/b.png" as *u8, b, n)
84 kg2_ws("/tmp/kksliderstats_gate/b.meta.json" as *u8, "{\"data\":{\"tags\":[]}}" as *u8)
85 // card C: AIS dialect -- must be skipped, never decoded with KK keys
86 n = kg2_card(b, "AIS_Chara" as *u8, 0x3f, 0)
87 kg2_w("/tmp/kksliderstats_gate/c.png" as *u8, b, n)
88 kg2_ws("/tmp/kksliderstats_gate/c.meta.json" as *u8, "{\"data\":{\"tags\":[{\"name\":\"tall\",\"count\":1}]}}" as *u8)
89 // run the subject
90 let out: *u8 = sys_mmap(KG_OUT)
91 let olen: *i64 = sys_mmap(16) as *i64
92 let av: *i64 = sys_mmap(32) as *i64
93 av[0] = elf as i64
94 av[1] = "/tmp/kksliderstats_gate" as *u8 as i64
95 av[2] = 0
96 olen[0] = 0
97 let rc: i64 = tr_run_capture(elf, av, out, KG_OUT - 1, olen)
98 gv_puts(" rc=" as *u8); gv_num(rc); gv_puts(" bytes=" as *u8); gv_num(olen[0]); gv_puts("\n" as *u8)
99 gv_check("T1 honesty header exact: 3 pairs seen, 2 KK decoded, 1 skipped_dialect, 0 partial -- the AIS card is counted out loud, never silently zeroed into the distribution" as *u8,
100 tr_contains(out, olen[0], "pairs_seen=3 kk_decoded=2 skipped_dialect=1 decode_partial=0" as *u8), ctr)
101 gv_check("T2 mean EXACT on the tagged side: tall idx0 mean_tag=250 from the single 0.25 float (integer mantissa arithmetic end to end)" as *u8,
102 tr_contains(out, olen[0], "tag=tall idx=0 n_tag=1 mean_tag=250 n_rest=1 mean_rest=750 delta=-500" as *u8), ctr)
103 gv_check("T3 an untagged index does not separate: idx1 both sides 500, delta=0 -- the ruler discriminates the planted signal, it does not paint every index" as *u8,
104 tr_contains(out, olen[0], "tag=tall idx=1 n_tag=1 mean_tag=500 n_rest=1 mean_rest=500 delta=0" as *u8), ctr)
105 gv_check("T4 neg-control-decoy: the uploader username never becomes a tag (no tag=decoyshape row)" as *u8,
106 (1 - tr_contains(out, olen[0], "tag=decoyshape" as *u8)), ctr)
107 gv_check("T5 subject exits 0 on a decodable corpus" as *u8, (rc == 0) as i64, ctr)
108 return gv_verdict("kksliderstats" as *u8, ctr, "fixtures carry hand-computable answers; each tooth states its own strength" as *u8)
109}