code wiki / _hdl_build / nx_build_registry_lib.nx

nx_build_registry_lib.nx source

↩ module page · 150 lines · 6331 B

1// nx_build_registry_lib.nx -- the BUILD-REGISTRAR library (Librarian SSOT of backend ORGANS); the 2// build-time twin of the publisher's pub_submit -> ledger. SEPARATE from the WMS stream-registry (does 3// NOT clobber it, per coordinate-don't-clobber). Storage = the WMS-R0b framed-append floor (fa_appendz: 4// O_APPEND + flock(LOCK_EX) + write-until-complete = atomic, torn-safe, NO TSV). Records: 5// "BR organ=<name> owner=<role> state=<state> END\n" 6// IDEMPOTENT by LATEST-WINS-on-read: re-submit appends, but distinct-organ count is stable and the 7// newest record's state is the live one (ledger-style dedup without rewrites). Pure lib, no main. 8// Consumers: nx_build_registry (R1 gate), nx_build_bypass_gate (R2 audit). license_tier: ORIGINAL 9import "nx_framed_append.nx" 10import "nx_syscalls.nx" 11 12const BR_CAP: i64 = 256 // per-record byte cap for fa_appendz 13const BR_FBUF: i64 = 262144 // store read buffer 14const BR_SLOT: i64 = 128 // per-field byte slot 15const BR_MAX: i64 = 1024 // max distinct organs 16 17func br_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 18func br_streq(a: *u8, b: *u8) -> i64 { 19 var i: i64 = 0 20 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 } 21 if b[i] != (0 as u8) { return 0 } 22 return 1 23} 24func br_read(path: *u8, buf: *u8, cap: i64) -> i64 { 25 let fd: i64 = sys_openat_rd(path) 26 if fd < 0 { return 0 - 1 } 27 var total: i64 = 0 28 var nrd: i64 = sys_read(fd, buf, cap) 29 while nrd > 0 { 30 total = total + nrd 31 if total >= cap { nrd = 0 } else { nrd = sys_read(fd, ((buf as i64) + total) as *u8, cap - total) } 32 } 33 sys_close(fd) 34 return total 35} 36func br_find(buf: *u8, from: i64, to: i64, pat: *u8) -> i64 { 37 let pl: i64 = br_len(pat) 38 if pl == 0 { return 0 - 1 } 39 var i: i64 = from 40 while i + pl <= to { 41 var j: i64 = 0; var ok: i64 = 1 42 while j < pl { if buf[i + j] != pat[j] { ok = 0; j = pl } else { j = j + 1 } } 43 if ok == 1 { return i } 44 i = i + 1 45 } 46 return 0 - 1 47} 48// extract the space-delimited value of `key` within line [ls,le) into out (NUL-term). 1 if found. 49func br_extract(buf: *u8, ls: i64, le: i64, key: *u8, out: *u8) -> i64 { 50 let pos: i64 = br_find(buf, ls, le, key) 51 if pos < 0 { return 0 } 52 var v: i64 = pos + br_len(key) 53 var o: i64 = 0 54 while v < le { if buf[v] == (32 as u8) { v = le } else { if o < BR_SLOT - 1 { out[o] = buf[v]; o = o + 1 } v = v + 1 } } 55 out[o] = 0 as u8 56 return 1 57} 58// THE REGISTRAR INTAKE with GENEALOGY OWNERSHIP (operator 2026-06-21: organs owned god->...->organ): 59// `parent` = the organ's anchor node in knowledge/registry/genesis_lineage.tsv (so it traces to god, 60// verified by nx_build_lineage_gate). One atomic framed append. 61func br_submit_lin(store: *u8, organ: *u8, owner: *u8, parent: *u8, state: *u8) -> i64 { 62 let rec: *u8 = sys_mmap(BR_CAP + 16) 63 var o: i64 = 0 64 o = fa_cat(rec, o, "BR organ=" as *u8) 65 o = fa_cat(rec, o, organ) 66 o = fa_cat(rec, o, " owner=" as *u8) 67 o = fa_cat(rec, o, owner) 68 o = fa_cat(rec, o, " parent=" as *u8) 69 o = fa_cat(rec, o, parent) 70 o = fa_cat(rec, o, " state=" as *u8) 71 o = fa_cat(rec, o, state) 72 o = fa_cat(rec, o, " END" as *u8) 73 rec[o] = 0 as u8 74 return fa_appendz(store, rec, BR_CAP) 75} 76// backward-compatible 4-arg: default genealogy anchor = DESC-ORGANS (the genesis node every organ 77// descends from). Existing callers keep working; their records now carry the lineage anchor. 78func br_submit(store: *u8, organ: *u8, owner: *u8, state: *u8) -> i64 { 79 return br_submit_lin(store, organ, owner, "DESC-ORGANS" as *u8, state) 80} 81// latest genealogy anchor (parent= node) for `organ` into out. 1 if the organ is registered. 82func br_get_parent(store: *u8, organ: *u8, out: *u8) -> i64 { 83 let buf: *u8 = sys_mmap(BR_FBUF) 84 let n: i64 = br_read(store, buf, BR_FBUF) 85 out[0] = 0 as u8 86 if n <= 0 { return 0 } 87 var found: i64 = 0 88 var i: i64 = 0 89 while i < n { 90 let ls: i64 = i 91 var le: i64 = ls 92 var g: i64 = 1 93 while g == 1 { if le >= n { g = 0 } else { if buf[le] == (10 as u8) { g = 0 } else { le = le + 1 } } } 94 let ob: *u8 = sys_mmap(BR_SLOT) 95 if br_extract(buf, ls, le, "organ=" as *u8, ob) == 1 { 96 if br_streq(ob, organ) == 1 { br_extract(buf, ls, le, "parent=" as *u8, out); found = 1 } 97 } 98 i = le + 1 99 } 100 return found 101} 102// distinct organs in the store (latest-wins => re-submit does NOT inflate this). 103func br_distinct(store: *u8) -> i64 { 104 let buf: *u8 = sys_mmap(BR_FBUF) 105 let n: i64 = br_read(store, buf, BR_FBUF) 106 if n <= 0 { return 0 } 107 let names: *i64 = sys_mmap(8 * BR_MAX) as *i64 108 var cnt: i64 = 0 109 var i: i64 = 0 110 while i < n { 111 let ls: i64 = i 112 var le: i64 = ls 113 var g: i64 = 1 114 while g == 1 { if le >= n { g = 0 } else { if buf[le] == (10 as u8) { g = 0 } else { le = le + 1 } } } 115 let ob: *u8 = sys_mmap(BR_SLOT) 116 if br_extract(buf, ls, le, "organ=" as *u8, ob) == 1 { 117 var found: i64 = 0 118 var k: i64 = 0 119 while k < cnt { if br_streq(names[k] as *u8, ob) == 1 { found = 1; k = cnt } else { k = k + 1 } } 120 if found == 0 { if cnt < BR_MAX { names[cnt] = ob as i64; cnt = cnt + 1 } } 121 } 122 i = le + 1 123 } 124 return cnt 125} 126// latest state for `organ` into out (NUL-term). returns 1 if the organ is registered, else 0. 127func br_get_state(store: *u8, organ: *u8, out: *u8) -> i64 { 128 let buf: *u8 = sys_mmap(BR_FBUF) 129 let n: i64 = br_read(store, buf, BR_FBUF) 130 out[0] = 0 as u8 131 if n <= 0 { return 0 } 132 var found: i64 = 0 133 var i: i64 = 0 134 while i < n { 135 let ls: i64 = i 136 var le: i64 = ls 137 var g: i64 = 1 138 while g == 1 { if le >= n { g = 0 } else { if buf[le] == (10 as u8) { g = 0 } else { le = le + 1 } } } 139 let ob: *u8 = sys_mmap(BR_SLOT) 140 if br_extract(buf, ls, le, "organ=" as *u8, ob) == 1 { 141 if br_streq(ob, organ) == 1 { br_extract(buf, ls, le, "state=" as *u8, out); found = 1 } 142 } 143 i = le + 1 144 } 145 return found 146} 147func br_registered(store: *u8, organ: *u8) -> i64 { 148 let tmp: *u8 = sys_mmap(BR_SLOT) 149 return br_get_state(store, organ, tmp) 150}