code wiki / _hdl_build / nx_vizsla_tenant.nx
nx_vizsla_tenant.nx
buildroot/runtime/_hdl_build/nx_vizsla_tenant.nx
about
nx_vizsla_tenant.nx -- NISHI VIZSLA: the UNIVERSAL (multi-tenant) relationship manager. Operator 2026-06-22:
"i want these capabilities that can be universal also available to others on our other nishi systems so the
same thing giving me s class relationship management can help them achieve s class." The gated relate engine
(nx_vizsla_relate: cadence/ledger/thanks/brief) is ALREADY tenant-isolated BY CONSTRUCTION -- the seg_store
CID data plane separates each tenant by store PREFIX. This is the thin tenancy layer (rule 22: COMPOSES the
blessed _offc/nx_vizsla_relate.elf, re-implements NOTHING): it maps a <tenant-id> to that tenant's private
files+store and forks the engine. Every person gets the SAME S-class engine over THEIR OWN data, with no
cross-tenant bleed (proven by nx_vizsla_tenant_gate). Sovereign: no third-party, no shared cloud =
per-tenant isolation WITHOUT the snooping every cloud PRM does.
<base><tid>.contacts.txt the tenant's people (TIER/CONTACT rows)
<base><tid>.relate_log.txt the tenant's interaction journal (TOUCH/OBLIGATION/THANKS/...)
<base><tid>.relate- the tenant's private seg_store prefix (isolated CID records)
Commands (argv): all forward to the engine over the tenant's resolved paths --
load <base> <tid> [segid] ingest the tenant's journal into their store
brief <base> <tid> <today> the tenant's daily counsel (followups/birthdays/thankyous/obligations)
cadence|thanks <base> <tid> <today> ; ledger <base> <tid>
SECURITY (law 12 -- defensive at the boundary): tenant-id is validated [A-Za-z0-9_-] only -- a '.' or '/'
is REJECTED so no tenant can path-traverse into another's files. expect_exit: 1 (no args) license_tier: ORIGINAL
dependencies 1 imports · 0 importers
imports: nx_syscalls.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 22 | const K_MAGIC_2048: i64 = 2048 |
| 23 | const K_MAGIC_1024: i64 = 1024 |
functions
| 25 | func vt_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } |
| 26 | func vt_p(s: *u8) -> i64 { sys_write(1, s, vt_slen(s)); return 0 } |
| 28 | func vt_eq(a: *u8, b: *u8) -> i64 called by 1: main |
| 39 | func vt_cat(dst: *u8, off: i64, s: *u8) -> i64 |
| 46 | func vt_valid_tid(s: *u8) -> i64 called by 1: main |
| 63 | func vt_path(out: *u8, base: *u8, tid: *u8, suffix: *u8) -> i64 |
| 73 | func vt_run(a1: *u8, a2: *u8, a3: *u8, a4: *u8) -> i64 |
| 96 | func vt_exists(path: *u8) -> i64 { let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 } sys_close(fd); return 1 } |
| 98 | func vt_writefile(path: *u8, content: *u8) -> i64 |
| 107 | func vt_append5(path: *u8, a0: *u8, a1: *u8, a2: *u8, a3: *u8, a4: *u8) -> i64 |
| 123 | func main(argc: i64, argv: *i64) -> i64 |