nx_memindex_budget_gate.nx source
↩ module page · 173 lines · 8227 B
1// nx_memindex_budget_gate.nx -- liar-killed GATE for the memindex TOTAL-size budget (the
2// remaining memindex-cap-treadmill rail feature). Forks the REAL built elf
3// (_build/nx_memindex_emit.sov.elf) against byte-exact fixtures and proves:
4// - budget split keeps the NEWEST entries in the md block, moves the OLDEST into the
5// overflow file's COINDEX-OVFL block (presence AND absence checks = neg-controls)
6// - NO-LOSS: every slug lands in exactly one of the two blocks
7// - both files fully re-derive -> IDEMPOTENT (second identical run byte-identical)
8// - FAIL-CLOSED: overflow file without markers is untouched AND nothing is evicted
9// (the md gets the FULL block -- no entry ever silently vanishes)
10// - the newest entry is NEVER evicted (budget=1 still keeps it live)
11// - 2-arg form = unbudgeted back-compat (full block, no overflow writes)
12// Fixture line sizes are chosen so budget=24 keeps exactly {e5,e6}: e6=14B + e5=8B = 22 <= 24,
13// +e4(8B)=30 > 24. usage: nx_memindex_budget_gate [emit_elf] Exit 0 only on 9/9.
14// license_tier: ORIGINAL expect_exit: 0
15import "nx_syscalls.nx"
16import "nx_crashresume_census_core.nx"
17
18// module statics at TOP (flag/data statics before any reader -- forward-ref gotcha)
19static g_av: i64 = 0
20
21func g_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
22func g_putn(v: i64) -> i64 { nxi_out(v); return 0 }
23func g_bool(name: *u8, got: i64, want: i64, passp: *i64) -> i64 {
24 g_puts("T " as *u8); g_puts(name); g_puts(" got=" as *u8); g_putn(got)
25 if got == want { g_puts(" PASS\n" as *u8); passp[0] = passp[0] + 1 } else { g_puts(" FAIL\n" as *u8) }
26 return 0
27}
28func g_write(path: *u8, s: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 420); if fd < 0 { return 0 - 1 } sys_write(fd, s, ccz_slen(s)); sys_close(fd); return 0 }
29func g_has(hay: *u8, hn: i64, needle: *u8) -> i64 {
30 let nn: i64 = ccz_slen(needle)
31 if nn == 0 { return 0 }
32 var i: i64 = 0
33 while i + nn <= hn {
34 var k: i64 = 0
35 var ok: i64 = 1
36 while k < nn { if hay[i+k] != needle[k] { ok = 0; k = nn } k = k + 1 }
37 if ok == 1 { return 1 }
38 i = i + 1
39 }
40 return 0
41}
42func g_same(p: *u8, q: *u8, qn: i64) -> i64 {
43 let b: *u8 = sys_mmap(262144)
44 let n: i64 = ccz_read(p, b, 262143)
45 if n != qn { return 0 }
46 var i: i64 = 0
47 while i < n { if b[i] != q[i] { return 0 } i = i + 1 }
48 return 1
49}
50// file at p contains needle?
51func g_fhas(p: *u8, needle: *u8) -> i64 {
52 let b: *u8 = sys_mmap(262144)
53 let n: i64 = ccz_read(p, b, 262143)
54 if n <= 0 { return 0 }
55 return g_has(b, n, needle)
56}
57// fork+exec the argv prepared in g_av (module static -- keeps this helper to ZERO data args,
58// sidestepping the multi-arg helper miscompile class), wait, return exit code.
59func g_run() -> i64 {
60 let av: *i64 = g_av as *i64
61 let pid: i64 = sys_fork()
62 if pid < 0 { return 127 }
63 if pid == 0 {
64 sys_execve(av[0] as *u8, av, 0 as *i64)
65 sys_exit(127)
66 }
67 let st: *i64 = sys_mmap(16) as *i64
68 sys_wait4(pid, st, 0)
69 return wait_exit_code(st[0])
70}
71
72func fixtures(md: *u8, ov: *u8) -> i64 {
73 g_write(md, "# top MDTOP\n<!-- COINDEX:BEGIN -->\nstale-md\n<!-- COINDEX:END -->\n# bottom MDBOT\n" as *u8)
74 g_write(ov, "# ov OVTOP\n<!-- COINDEX-OVFL:BEGIN -->\nstale-ovfl\n<!-- COINDEX-OVFL:END -->\n# ovbot OVBOT\n" as *u8)
75 return 0
76}
77
78func main(argc: i64, argv: *i64) -> i64 {
79 var elf: *u8 = "_build/nx_memindex_emit.sov.elf" as *u8
80 if argc >= 2 { elf = argv[1] as *u8 }
81 let pass: *i64 = sys_mmap(16) as *i64
82 pass[0] = 0
83 let avb: *i64 = sys_mmap(128) as *i64
84 g_av = avb as i64
85
86 let jr: *u8 = "/tmp/mib.journal" as *u8
87 let mdp: *u8 = "/tmp/mib.md" as *u8
88 let ovp: *u8 = "/tmp/mib.ovfl" as *u8
89 g_write(jr, "e1 one-oldest\ne2 two\ne3 three\ne4 four\ne5 five\ne6 six-newest\n" as *u8)
90
91 // ---- Phase A: big budget -> NO eviction, ovfl block derives EMPTY (stale gone) ----
92 fixtures(mdp, ovp)
93 avb[0] = elf as i64; avb[1] = jr as i64; avb[2] = mdp as i64; avb[3] = ovp as i64; avb[4] = "4096" as *u8 as i64; avb[5] = 0
94 let rcA: i64 = g_run()
95 g_bool("emit-exit0" as *u8, rcA, 0, pass)
96 var ok2: i64 = 0
97 if g_fhas(mdp, "e1 one-oldest" as *u8) == 1 { if g_fhas(mdp, "e6 six-newest" as *u8) == 1 { if g_fhas(mdp, "stale-md" as *u8) == 0 { if g_fhas(ovp, "stale-ovfl" as *u8) == 0 { if g_fhas(ovp, "OVTOP" as *u8) == 1 { if g_fhas(ovp, "OVBOT" as *u8) == 1 { ok2 = 1 } } } } } }
98 g_bool("nobudget-all-live+ovfl-derived-empty" as *u8, ok2, 1, pass)
99
100 // ---- Phase B: budget 24 -> newest {e5,e6} LIVE, oldest {e1..e4} evicted ----
101 fixtures(mdp, ovp)
102 avb[4] = "24" as *u8 as i64
103 g_run()
104 var ok3a: i64 = 0
105 if g_fhas(mdp, "e5 five" as *u8) == 1 { if g_fhas(mdp, "e6 six-newest" as *u8) == 1 { if g_fhas(mdp, "e1 one-oldest" as *u8) == 0 { if g_fhas(mdp, "e4 four" as *u8) == 0 { ok3a = 1 } } } }
106 g_bool("evict-md-newest-only" as *u8, ok3a, 1, pass)
107 var ok3b: i64 = 0
108 if g_fhas(ovp, "e1 one-oldest" as *u8) == 1 { if g_fhas(ovp, "e4 four" as *u8) == 1 { if g_fhas(ovp, "e6 six-newest" as *u8) == 0 { ok3b = 1 } } }
109 g_bool("evict-ovfl-oldest-only" as *u8, ok3b, 1, pass)
110 var lost: i64 = 0
111 var si: i64 = 0
112 let slugs: *i64 = sys_mmap(64) as *i64
113 slugs[0] = "e1 one-oldest" as *u8 as i64
114 slugs[1] = "e2 two" as *u8 as i64
115 slugs[2] = "e3 three" as *u8 as i64
116 slugs[3] = "e4 four" as *u8 as i64
117 slugs[4] = "e5 five" as *u8 as i64
118 slugs[5] = "e6 six-newest" as *u8 as i64
119 while si < 6 {
120 let nd: *u8 = slugs[si] as *u8
121 var found: i64 = 0
122 if g_fhas(mdp, nd) == 1 { found = 1 }
123 if g_fhas(ovp, nd) == 1 { found = found + 1 }
124 if found != 1 { lost = lost + 1 }
125 si = si + 1
126 }
127 g_bool("no-loss-each-slug-exactly-once" as *u8, lost, 0, pass)
128
129 // ---- Phase C: idempotent -- identical re-run leaves BOTH files byte-identical ----
130 let snapm: *u8 = sys_mmap(262144)
131 let snm: i64 = ccz_read(mdp, snapm, 262143)
132 let snapo: *u8 = sys_mmap(262144)
133 let sno: i64 = ccz_read(ovp, snapo, 262143)
134 g_run()
135 var ok5: i64 = 0
136 if g_same(mdp, snapm, snm) == 1 { if g_same(ovp, snapo, sno) == 1 { ok5 = 1 } }
137 g_bool("idempotent-both-files" as *u8, ok5, 1, pass)
138
139 // ---- Phase D: FAIL-CLOSED -- markerless overflow untouched AND nothing evicted ----
140 let md2: *u8 = "/tmp/mib2.md" as *u8
141 let ovnm: *u8 = "/tmp/mib.ovnm" as *u8
142 g_write(md2, "# top MDTOP\n<!-- COINDEX:BEGIN -->\nstale-md\n<!-- COINDEX:END -->\n# bottom MDBOT\n" as *u8)
143 g_write(ovnm, "# no markers here NM\n- body\n" as *u8)
144 let snapn: *u8 = sys_mmap(4096)
145 let snn: i64 = ccz_read(ovnm, snapn, 4095)
146 avb[2] = md2 as i64; avb[3] = ovnm as i64
147 g_run()
148 var ok6: i64 = 0
149 if g_same(ovnm, snapn, snn) == 1 { if g_fhas(md2, "e1 one-oldest" as *u8) == 1 { if g_fhas(md2, "e6 six-newest" as *u8) == 1 { ok6 = 1 } } }
150 g_bool("failclosed-noevict-fullblock-stays" as *u8, ok6, 1, pass)
151
152 // ---- Phase E: newest NEVER evicted even at budget=1 ----
153 fixtures(mdp, ovp)
154 avb[2] = mdp as i64; avb[3] = ovp as i64; avb[4] = "1" as *u8 as i64
155 g_run()
156 var ok7: i64 = 0
157 if g_fhas(mdp, "e6 six-newest" as *u8) == 1 { if g_fhas(mdp, "e5 five" as *u8) == 0 { if g_fhas(ovp, "e5 five" as *u8) == 1 { if g_fhas(ovp, "e1 one-oldest" as *u8) == 1 { ok7 = 1 } } } }
158 g_bool("newest-never-evicted" as *u8, ok7, 1, pass)
159
160 // ---- Phase F: 2-arg back-compat -- full block, no overflow involvement ----
161 let md3: *u8 = "/tmp/mib3.md" as *u8
162 g_write(md3, "# top MDTOP\n<!-- COINDEX:BEGIN -->\nstale-md\n<!-- COINDEX:END -->\n# bottom MDBOT\n" as *u8)
163 avb[2] = md3 as i64; avb[3] = 0; avb[4] = 0
164 let rcF: i64 = g_run()
165 var ok8: i64 = 0
166 if rcF == 0 { if g_fhas(md3, "e1 one-oldest" as *u8) == 1 { if g_fhas(md3, "e6 six-newest" as *u8) == 1 { ok8 = 1 } } }
167 g_bool("backcompat-2arg-full-block" as *u8, ok8, 1, pass)
168
169 g_puts("MIB-GATE pass=" as *u8); g_putn(pass[0]); g_puts("/9 verdict=" as *u8)
170 if pass[0] == 9 { g_puts("GREEN\n" as *u8); return 0 }
171 g_puts("RED\n" as *u8)
172 return 1
173}