code wiki / _hdl_build / nx_store_lineage.nx
nx_store_lineage.nx source
↩ module page · 145 lines · 7684 B
1// nx_store_lineage.nx -- the LINEAGE rung over the store catalog (DataHub/OpenLineage-class): for each organ,
2// which seg_stores does it reference, and as PRODUCER (writes -> ss_commit/ncfg_commit) or CONSUMER (reads ->
3// ss_open/ss_hget/ncfg_open). ONE sovereign getdents walk over runtime/ + _hdl_build/, READ-ONLY / ADDITIVE
4// (touches nothing). Matches the literal "knowledge/store/<name>" prefix in organ source (static-prefix edges;
5// dynamically-built prefixes are counted separately, honest). Composes nx_seg_store (ss_readall/ss_cat).
6// Self-verifies: the nx_algo_registry_migrate -> algo-registry PRODUCER edge is found.
7// expect_exit: 0 license_tier: ORIGINAL
8import "nx_seg_store.nx"
9import "nx_syscalls.nx"
10const K_MAGIC_262144: i64 = 262144
11const K_MAGIC_1024: i64 = 1024
12const K_MAGIC_2097152: i64 = 2097152
13
14func ln_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
15func ln_putn(v: i64) -> i64 {
16 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 }
17 var m: i64 = v
18 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m }
19 let d: *u8 = sys_mmap(24); var k: i64 = 0
20 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
21 var j: i64 = k - 1
22 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 }
23 return 0
24}
25func ln_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
26func ln_ends(name: *u8, suf: *u8) -> i64 {
27 let nl: i64 = ln_len(name); let sl: i64 = ln_len(suf)
28 if nl < sl { return 0 }
29 var i: i64 = 0
30 while i < sl { if name[nl - sl + i] != suf[i] { return 0 } i = i + 1 }
31 return 1
32}
33// substring search in buf[start..n); -1 if absent
34func ln_find(buf: *u8, n: i64, start: i64, needle: *u8, nlen: i64) -> i64 {
35 if nlen == 0 { return start }
36 var p: i64 = start
37 while p + nlen <= n {
38 var j: i64 = 0; var hit: i64 = 1
39 while j < nlen { if buf[p + j] != needle[j] { hit = 0; j = nlen } else { j = j + 1 } }
40 if hit == 1 { return p }
41 p = p + 1
42 }
43 return 0 - 1
44}
45func ln_has(buf: *u8, n: i64, needle: *u8) -> i64 { if ln_find(buf, n, 0, needle, ln_len(needle)) >= 0 { return 1 } return 0 }
46// store-name char? a-z 0-9 - _
47func ln_isnc(c: i64) -> i64 {
48 if c >= 97 { if c <= 122 { return 1 } }
49 if c >= 48 { if c <= 57 { return 1 } }
50 if c == 45 { return 1 }
51 if c == 95 { return 1 }
52 return 0
53}
54// acc: [0]=static edges [1]=dynamic-prefix refs [2]=emitted [3]=verify-found [4]=organs-with-store-ref
55func ln_walk(dir: *u8, acc: *i64) -> i64 {
56 let fd: i64 = sys_openat_rd(dir)
57 if fd < 0 { return 0 }
58 let dbuf: *u8 = sys_mmap(K_MAGIC_262144)
59 let szp: *i64 = sys_mmap(16) as *i64
60 var go: i64 = 1
61 while go == 1 {
62 let nb: i64 = sys_getdents64(fd, dbuf, K_MAGIC_262144)
63 if nb <= 0 { go = 0 } else {
64 var off: i64 = 0
65 while off < nb {
66 let rec: *u8 = (dbuf as i64 + off) as *u8
67 let rl: i64 = dirent_reclen(rec)
68 if rl <= 0 { off = nb } else {
69 let nm: *u8 = dirent_name(rec)
70 if ln_ends(nm, ".nx" as *u8) == 1 {
71 let path: *u8 = sys_mmap(K_MAGIC_1024); var o: i64 = 0
72 o = ss_cat(path, o, dir); path[o] = 47 as u8; o = o + 1
73 o = ss_cat(path, o, nm); path[o] = 0 as u8
74 szp[0] = 0
75 let buf: *u8 = ss_readall(path, szp)
76 let n: i64 = szp[0]
77 if n > 0 { if n < K_MAGIC_2097152 {
78 var isP: i64 = 0
79 if ln_has(buf, n, "ss_commit" as *u8) == 1 { isP = 1 }
80 if ln_has(buf, n, "ncfg_commit" as *u8) == 1 { isP = 1 }
81 var isCo: i64 = 0
82 if ln_has(buf, n, "ss_open" as *u8) == 1 { isCo = 1 }
83 if ln_has(buf, n, "ss_hget" as *u8) == 1 { isCo = 1 }
84 if ln_has(buf, n, "ncfg_open" as *u8) == 1 { isCo = 1 }
85 var organ_counted: i64 = 0
86 var pos: i64 = 0
87 var more: i64 = 1
88 while more == 1 {
89 let p: i64 = ln_find(buf, n, pos, "knowledge/store/" as *u8, 16)
90 if p < 0 { more = 0 } else {
91 let st: i64 = p + 16
92 var l: i64 = 0
93 var cont: i64 = 1
94 while cont == 1 {
95 if st + l >= n { cont = 0 } else {
96 if ln_isnc(buf[st + l] as i64) == 1 { l = l + 1 } else { cont = 0 }
97 }
98 }
99 if l > 0 {
100 acc[0] = acc[0] + 1
101 if organ_counted == 0 { acc[4] = acc[4] + 1; organ_counted = 1 }
102 if acc[2] < 120 {
103 acc[2] = acc[2] + 1
104 ln_puts(" " as *u8)
105 var q: i64 = 0; let nlen: i64 = ln_len(nm) - 3
106 while q < nlen { let oo: *u8 = sys_mmap(1); oo[0] = nm[q]; sys_write(1, oo, 1); q = q + 1 }
107 ln_puts(" [" as *u8)
108 if isP == 1 { ln_puts("P" as *u8) }
109 if isCo == 1 { ln_puts("C" as *u8) }
110 if isP == 0 { if isCo == 0 { ln_puts("?" as *u8) } }
111 ln_puts("] " as *u8)
112 var r2: i64 = 0
113 while r2 < l { let o2: *u8 = sys_mmap(1); o2[0] = buf[st + r2]; sys_write(1, o2, 1); r2 = r2 + 1 }
114 ln_puts("\n" as *u8)
115 }
116 if ln_find(nm, ln_len(nm), 0, "algo_registry_migrate" as *u8, 21) >= 0 {
117 if ln_find(buf, st + l, st, "algo-registry" as *u8, 13) >= 0 { if isP == 1 { acc[3] = 1 } }
118 }
119 } else { acc[1] = acc[1] + 1 }
120 pos = p + 16
121 }
122 }
123 } }
124 }
125 off = off + rl
126 }
127 }
128 }
129 }
130 sys_close(fd)
131 return 0
132}
133func main() -> i64 {
134 ln_puts("STORE LINEAGE: organ -> seg_store [P]roducer(commit) / [C]onsumer(open) (static prefixes; emit cap 120)\n" as *u8)
135 let acc: *i64 = sys_mmap(64) as *i64
136 var i: i64 = 0; while i < 8 { acc[i] = 0; i = i + 1 }
137 ln_walk("runtime" as *u8, acc)
138 ln_walk("runtime/_hdl_build" as *u8, acc)
139 ln_puts("LINEAGE SUMMARY: static-edges="); ln_putn(acc[0])
140 ln_puts(" organs-with-store-ref="); ln_putn(acc[4])
141 ln_puts(" dynamic-prefix-refs="); ln_putn(acc[1]); ln_puts("\n" as *u8)
142 if acc[3] == 1 { ln_puts("STORE-LINEAGE: GREEN (nx_algo_registry_migrate -> algo-registry PRODUCER edge found)\n" as *u8); return 0 }
143 ln_puts("STORE-LINEAGE: RED (expected the algo-registry producer edge)\n" as *u8)
144 return 1
145}