code wiki / _hdl_build / nx_vizsla_tenant_gate.nx
nx_vizsla_tenant_gate.nx source
↩ module page · 321 lines · 13782 B
1// nx_vizsla_tenant_gate.nx -- VIZSLA universal/multi-tenant gate: proves the SAME S-class relationship engine
2// serves MANY people on one Nishi system, each fully ISOLATED (operator 2026-06-22: "universal also available to
3// others ... the same thing giving me s class relationship management can help them achieve s class"). Two
4// tenants with DIFFERENT people + interactions; each gets their OWN correct brief; NEITHER can see the other's
5// data (cross-tenant bleed = RED). Plus a path-traversal security control. 100% sovereign: self-writes the
6// per-tenant fixtures, forks nx_vizsla_tenant (which composes the blessed relate engine), greps stdout.
7//
8// tenant ELDER (today 2026-06-22): emom inner last 06-20=FRESH bday 06-25=in 3d ; ejess close never=NEW followup;
9// THANKS emom gift 06-10=PENDING ; OBLIGATION OWE ejess dinner => followups=1 birthdays=1 thankyous=1 obligations=1
10// tenant DAVE: dwife inner last 06-21=FRESH bday 09-01=far ; dboss work never=NEW followup ;
11// OBLIGATION DUE dboss raise => followups=1 birthdays=0 thankyous=0 obligations=1
12//
13// Rows:
14// 1 load-elder tenant load -> RELATE-LOAD scanned=3 new=3 seg-8001
15// 2 load-dave tenant load -> RELATE-LOAD scanned=2 new=2 seg-8002
16// 3 elder-brief-own elder brief shows ejess (NEW) + emom (BIRTHDAY)
17// 4 elder-verdict followups=1 birthdays=1 thankyous=1 obligations=1
18// 5 elder-ISOLATED elder brief shows NOTHING of dave (no dboss, no dwife) [isolation]
19// 6 dave-brief-own dave brief shows dboss OBLIGATION DUE
20// 7 dave-verdict followups=1 birthdays=0 thankyous=0 obligations=1
21// 8 dave-ISOLATED dave brief shows NOTHING of elder (no emom, no ejess) [isolation]
22// 9 tid-traversal-reject brief with tenant-id ".." => exit 1 [security neg-control]
23// 10 brief-determinism elder brief byte-identical twice
24// Evidence: VIZSLA-TENANT-GATE -> stdout + knowledge/status/vizsla_gate.log; exit 0 iff 10/10.
25// spec: knowledge/research/2026-06-22-vizsla-sclass-roadmap.md license_tier: ORIGINAL
26import "nx_syscalls.nx"
27import "nx_gate_verdict.nx"
28
29func og_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
30func og_p(s: *u8) -> i64 { sys_write(1, s, og_slen(s)); return 0 }
31
32func og_cat(dst: *u8, off: i64, s: *u8) -> i64 {
33 var i: i64 = 0
34 while s[i] != (0 as u8) { dst[off + i] = s[i]; i = i + 1 }
35 return off + i
36}
37
38func og_catn(dst: *u8, off: i64, v: i64) -> i64 {
39 var o: i64 = off
40 var m: i64 = v
41 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m }
42 let t: *u8 = sys_mmap(28)
43 var k: i64 = 0
44 if m == 0 { t[0] = 48 as u8; k = 1 }
45 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
46 var i: i64 = 0
47 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 }
48 return o + k
49}
50
51func og_write(path: *u8, content: *u8) -> i64 {
52 let fd: i64 = sys_openat_wr(path, 0x1a4)
53 if fd < 0 { return 0 - 1 }
54 sys_write(fd, content, og_slen(content))
55 sys_close(fd)
56 return 0
57}
58
59func og_readall(path: *u8, szout: *i64) -> *u8 {
60 let fd: i64 = sys_openat_rd(path)
61 if fd < 0 { szout[0] = 0 - 1; return 0 as *u8 }
62 let sz: i64 = sys_lseek(fd, 0, 2)
63 sys_lseek(fd, 0, 0)
64 let buf: *u8 = sys_mmap(sz + 64)
65 var got: i64 = 0
66 var n: i64 = 1
67 while n > 0 {
68 n = sys_read(fd, (buf as i64 + got) as *u8, 65536)
69 if n > 0 { got = got + n }
70 }
71 sys_close(fd)
72 szout[0] = got
73 return buf
74}
75
76func og_runv(elf: *u8, args: *i64, outpath: *u8) -> i64 {
77 let pid: i64 = sys_fork()
78 if pid == 0 {
79 if (outpath as i64) != 0 {
80 let ofd: i64 = sys_openat_wr(outpath, 0x1a4)
81 if ofd >= 0 { sys_dup3(ofd, 1, 0); sys_dup3(ofd, 2, 0) }
82 }
83 let argv: *i64 = sys_mmap(128) as *i64
84 argv[0] = elf as i64
85 var i: i64 = 0
86 var go: i64 = 1
87 while go == 1 {
88 if args[i] == 0 { go = 0 } else {
89 argv[i + 1] = args[i]
90 i = i + 1
91 }
92 }
93 argv[i + 1] = 0
94 let envp: *i64 = sys_mmap(16) as *i64
95 envp[0] = 0
96 sys_execve(elf, argv, envp)
97 sys_exit(127)
98 }
99 let st: *i64 = sys_mmap(16) as *i64
100 sys_wait4(pid, st, 0)
101 let sig: i64 = st[0] & 0x7f
102 if sig != 0 { return 128 + sig }
103 return (st[0] >> 8) & 0xff
104}
105
106func og_has(path: *u8, needle: *u8) -> i64 {
107 let szp: *i64 = sys_mmap(16) as *i64
108 let b: *u8 = og_readall(path, szp)
109 let sz: i64 = szp[0]
110 let n: i64 = og_slen(needle)
111 if sz < n { return 0 }
112 var i: i64 = 0
113 while i + n <= sz {
114 var ok: i64 = 1
115 var j: i64 = 0
116 while j < n {
117 if b[i + j] != needle[j] { ok = 0; j = n } else { j = j + 1 }
118 }
119 if ok == 1 { return 1 }
120 i = i + 1
121 }
122 return 0
123}
124
125func og_fileeq(p1: *u8, p2: *u8) -> i64 {
126 let s1: *i64 = sys_mmap(16) as *i64
127 let s2: *i64 = sys_mmap(16) as *i64
128 let b1: *u8 = og_readall(p1, s1)
129 let b2: *u8 = og_readall(p2, s2)
130 if s1[0] != s2[0] { return 0 }
131 if s1[0] <= 0 { return 0 }
132 var i: i64 = 0
133 while i < s1[0] {
134 if b1[i] != b2[i] { return 0 }
135 i = i + 1
136 }
137 return 1
138}
139
140func og_row(name: *u8, pass: i64) -> i64 {
141 og_p("ROW " as *u8)
142 og_p(name)
143 if pass == 1 { og_p(" PASS\n" as *u8) } else { og_p(" FAIL\n" as *u8) }
144 return pass
145}
146
147func og_args(a1: *u8, a2: *u8, a3: *u8, a4: *u8, a5: *u8) -> *i64 {
148 let a: *i64 = sys_mmap(64) as *i64
149 a[0] = a1 as i64
150 a[1] = a2 as i64
151 a[2] = a3 as i64
152 a[3] = a4 as i64
153 a[4] = a5 as i64
154 a[5] = 0
155 return a
156}
157
158func og_args7(a1: *u8, a2: *u8, a3: *u8, a4: *u8, a5: *u8, a6: *u8, a7: *u8) -> *i64 {
159 let a: *i64 = sys_mmap(80) as *i64
160 a[0] = a1 as i64
161 a[1] = a2 as i64
162 a[2] = a3 as i64
163 a[3] = a4 as i64
164 a[4] = a5 as i64
165 a[5] = a6 as i64
166 a[6] = a7 as i64
167 a[7] = 0
168 return a
169}
170
171// build base+name into a fresh buffer
172func og_join(base: *u8, name: *u8) -> *u8 {
173 let p: *u8 = sys_mmap(512)
174 var o: i64 = 0
175 o = og_cat(p, o, base)
176 o = og_cat(p, o, name)
177 p[o] = 0 as u8
178 return p
179}
180
181func main(argc: i64, argv: *i64) -> i64 {
182 og_p("=== VIZSLA TENANT GATE: universal multi-tenant relationship mgmt, ISOLATION-proven ===\n" as *u8)
183 var ob: *u8 = "buildroot/_build/nx_vizsla_tenant.sov.elf" as *u8
184 if argc > 1 { ob = argv[1] as *u8 }
185 let pr: i64 = sys_openat_rd(ob)
186 if pr >= 0 { sys_close(pr) }
187 else {
188 og_p(" instrument missing -> rebuilding via durable runner\n" as *u8)
189 og_runv("_offc/nx_sov_build_run.elf" as *u8, og_args("nx_vizsla_tenant" as *u8, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8), "/tmp/vtt_rebuild.out" as *u8)
190 }
191
192 let base: *u8 = sys_mmap(256)
193 var bo: i64 = 0
194 bo = og_cat(base, bo, "/tmp/vztU" as *u8)
195 bo = og_catn(base, bo, sys_now_us())
196 bo = og_cat(base, bo, "_" as *u8)
197 base[bo] = 0 as u8
198
199 // tenant fixtures (each person's private files)
200 og_write(og_join(base, "elder.contacts.txt" as *u8), "CONF soon_days 14\nTIER inner 30\nTIER close 90\nCONTACT emom Mom inner 06-25\nCONTACT ejess Jess close -\n" as *u8)
201 og_write(og_join(base, "elder.relate_log.txt" as *u8), "TOUCH 2026-06-20 emom call\nOBLIGATION 2026-06-01 OWE ejess dinner 0 owe-dinner\nTHANKS 2026-06-10 emom gift\n" as *u8)
202 og_write(og_join(base, "dave.contacts.txt" as *u8), "CONF soon_days 14\nTIER inner 30\nTIER work 60\nCONTACT dwife Maria inner 09-01\nCONTACT dboss Boss work -\n" as *u8)
203 og_write(og_join(base, "dave.relate_log.txt" as *u8), "TOUCH 2026-06-21 dwife dinner\nOBLIGATION 2026-06-05 DUE dboss raise 0 raise-talk\n" as *u8)
204
205 let today: *u8 = "2026-06-22" as *u8
206 var pass: i64 = 0
207 var r: i64 = 0
208
209 // row 1: load elder
210 let rcle: i64 = og_runv(ob, og_args("load" as *u8, base, "elder" as *u8, "8001" as *u8, 0 as *u8), "/tmp/vtt_le.txt" as *u8)
211 r = 0
212 if rcle == 0 {
213 if og_has("/tmp/vtt_le.txt" as *u8, "VIZSLA-RELATE-LOAD scanned=3 new=3 dup_infile=0 dup_instore=0 segment=seg-8001" as *u8) == 1 { r = 1 }
214 }
215 pass = pass + og_row("load-elder" as *u8, r)
216
217 // row 2: load dave
218 let rcld: i64 = og_runv(ob, og_args("load" as *u8, base, "dave" as *u8, "8002" as *u8, 0 as *u8), "/tmp/vtt_ld.txt" as *u8)
219 r = 0
220 if rcld == 0 {
221 if og_has("/tmp/vtt_ld.txt" as *u8, "VIZSLA-RELATE-LOAD scanned=2 new=2 dup_infile=0 dup_instore=0 segment=seg-8002" as *u8) == 1 { r = 1 }
222 }
223 pass = pass + og_row("load-dave" as *u8, r)
224
225 // rows 3-5: elder brief (own data + isolation)
226 og_runv(ob, og_args("brief" as *u8, base, "elder" as *u8, today, 0 as *u8), "/tmp/vtt_be.txt" as *u8)
227 r = 0
228 if og_has("/tmp/vtt_be.txt" as *u8, "FOLLOWUP contact=ejess" as *u8) == 1 {
229 if og_has("/tmp/vtt_be.txt" as *u8, "BIRTHDAY contact=emom" as *u8) == 1 { r = 1 }
230 }
231 pass = pass + og_row("elder-brief-own" as *u8, r)
232
233 r = og_has("/tmp/vtt_be.txt" as *u8, "VIZSLA-RELATE-BRIEF-VERDICT followups=1 birthdays=1 thankyous=1 obligations=1" as *u8)
234 pass = pass + og_row("elder-verdict" as *u8, r)
235
236 var leak1: i64 = og_has("/tmp/vtt_be.txt" as *u8, "dboss" as *u8)
237 var leak2: i64 = og_has("/tmp/vtt_be.txt" as *u8, "dwife" as *u8)
238 r = 0
239 if leak1 == 0 { if leak2 == 0 { r = 1 } }
240 pass = pass + og_row("elder-ISOLATED-no-dave" as *u8, r)
241
242 // rows 6-8: dave brief (own data + isolation)
243 og_runv(ob, og_args("brief" as *u8, base, "dave" as *u8, today, 0 as *u8), "/tmp/vtt_bd.txt" as *u8)
244 r = og_has("/tmp/vtt_bd.txt" as *u8, "OBLIGATION contact=dboss dir=DUE" as *u8)
245 pass = pass + og_row("dave-brief-own" as *u8, r)
246
247 r = og_has("/tmp/vtt_bd.txt" as *u8, "VIZSLA-RELATE-BRIEF-VERDICT followups=1 birthdays=0 thankyous=0 obligations=1" as *u8)
248 pass = pass + og_row("dave-verdict" as *u8, r)
249
250 var leak3: i64 = og_has("/tmp/vtt_bd.txt" as *u8, "emom" as *u8)
251 var leak4: i64 = og_has("/tmp/vtt_bd.txt" as *u8, "ejess" as *u8)
252 r = 0
253 if leak3 == 0 { if leak4 == 0 { r = 1 } }
254 pass = pass + og_row("dave-ISOLATED-no-elder" as *u8, r)
255
256 // row 9: path-traversal tenant-id rejected (security neg-control)
257 let rctr: i64 = og_runv(ob, og_args("brief" as *u8, base, ".." as *u8, today, 0 as *u8), "/tmp/vtt_tr.txt" as *u8)
258 r = 0
259 if rctr == 1 { r = 1 }
260 pass = pass + og_row("tid-traversal-reject" as *u8, r)
261
262 // row 10: determinism
263 og_runv(ob, og_args("brief" as *u8, base, "elder" as *u8, today, 0 as *u8), "/tmp/vtt_be2.txt" as *u8)
264 r = og_fileeq("/tmp/vtt_be.txt" as *u8, "/tmp/vtt_be2.txt" as *u8)
265 pass = pass + og_row("brief-determinism" as *u8, r)
266
267 // rows 11-13: frictionless capture on a FRESH "cap" tenant (provision -> add-contact -> touch)
268 og_runv(ob, og_args("provision" as *u8, base, "cap" as *u8, 0 as *u8, 0 as *u8), "/tmp/vtt_cprov.txt" as *u8)
269 og_runv(ob, og_args7("add-contact" as *u8, base, "cap" as *u8, "newpal" as *u8, "New-Pal" as *u8, "inner" as *u8, "-" as *u8), "/tmp/vtt_cadd.txt" as *u8)
270 og_runv(ob, og_args("brief" as *u8, base, "cap" as *u8, today, 0 as *u8), "/tmp/vtt_cb1.txt" as *u8)
271 r = og_has("/tmp/vtt_cb1.txt" as *u8, "FOLLOWUP contact=newpal" as *u8)
272 pass = pass + og_row("capture-add-contact" as *u8, r)
273
274 og_runv(ob, og_args7("add-contact" as *u8, base, "cap" as *u8, "buddy" as *u8, "A-Buddy" as *u8, "close" as *u8, "07-04" as *u8), "/tmp/vtt_cadd2.txt" as *u8)
275 og_runv(ob, og_args("brief" as *u8, base, "cap" as *u8, today, 0 as *u8), "/tmp/vtt_cb2.txt" as *u8)
276 r = og_has("/tmp/vtt_cb2.txt" as *u8, "BIRTHDAY contact=buddy" as *u8)
277 pass = pass + og_row("capture-add-birthday" as *u8, r)
278
279 og_runv(ob, og_args7("touch" as *u8, base, "cap" as *u8, today, "newpal" as *u8, "hi" as *u8, 0 as *u8), "/tmp/vtt_ctouch.txt" as *u8)
280 og_runv(ob, og_args("brief" as *u8, base, "cap" as *u8, today, 0 as *u8), "/tmp/vtt_cb3.txt" as *u8)
281 var stillfollow: i64 = og_has("/tmp/vtt_cb3.txt" as *u8, "FOLLOWUP contact=newpal" as *u8)
282 var buddyfollow: i64 = og_has("/tmp/vtt_cb3.txt" as *u8, "FOLLOWUP contact=buddy" as *u8)
283 r = 0
284 if stillfollow == 0 { if buddyfollow == 1 { r = 1 } }
285 pass = pass + og_row("capture-touch-makes-fresh" as *u8, r)
286
287 let permil: i64 = (pass * 1000) / 13
288 let logfd: i64 = sys_openat_append("knowledge/status/vizsla_gate.log" as *u8, 0x1a4)
289 var fdi: i64 = 0
290 while fdi < 2 {
291 var fd: i64 = 1
292 if fdi == 1 { fd = logfd }
293 if fd > 0 {
294 let line: *u8 = sys_mmap(256)
295 var o: i64 = 0
296 o = og_cat(line, o, "VIZSLA-TENANT-GATE epoch=" as *u8)
297 o = og_catn(line, o, sys_now_realtime_sec())
298 o = og_cat(line, o, " rows=13 pass=" as *u8)
299 o = og_catn(line, o, pass)
300 o = og_cat(line, o, " permil=" as *u8)
301 o = og_catn(line, o, permil)
302 if pass == 13 {
303 o = og_cat(line, o, " verdict=GREEN\n" as *u8)
304 } else {
305 o = og_cat(line, o, " verdict=RED\n" as *u8)
306 }
307 sys_write(fd, line, o)
308 }
309 fdi = fdi + 1
310 }
311 if logfd > 0 { sys_close(logfd) }
312 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
313 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
314 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
315 let ctr__dry: *i64 = gv_ctr()
316 ctr__dry[0] = pass
317 ctr__dry[1] = 13
318 let rc__dry: i64 = gv_verdict("VIZSLA-TENANT-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
319 sys_exit(rc__dry)
320 return rc__dry
321}