code wiki / _hdl_build / nx_role_parts.nx
nx_role_parts.nx source
↩ module page · 316 lines · 14269 B
1// nx_role_parts.nx -- X-ORC-006: SHEET MUSIC, extracted (operator: an orchestra works
2// because everyone reads the SAME score but plays from their own PART). Per beat,
3// derive knowledge/parts/<owner>.txt for EVERY distinct owner in the queue: their
4// TODO/NOVEL rows (id, w, gate, title) with the channel route inline when one exists
5// (the brief-join gene generalized from the tutor seat to every chair). Derived
6// state: sibling-tmp + renameat per part (no-TRUNC immunity, the reloop lesson).
7// Durable: parts files + one PARTS row -> knowledge/status/role_parts.log.
8// Exit 0 = parts derived; exit 1 = unreadable world. argv[1]=queue argv[2]=outdir.
9// license_tier: ORIGINAL
10import "nx_syscalls.nx"
11const K_MAGIC_1048576: i64 = 1048576
12const K_MAGIC_1048560: i64 = 1048560
13const K_MAGIC_262144: i64 = 262144
14const K_MAGIC_262128: i64 = 262128
15const K_MAGIC_8192: i64 = 8192
16const K_MAGIC_65536: i64 = 65536
17const K_MAGIC_65520: i64 = 65520
18func _p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
19func _fp(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
20func _fn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
21func rp_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
22func rp_cat(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { dst[off+i] = s[i]; i = i + 1 } return off + i }
23func rp_read(path: *u8, buf: *u8, cap: i64) -> i64 {
24 let fd: i64 = sys_openat_rd(path)
25 if fd < 0 { return 0 }
26 var n: i64 = 0
27 var go: i64 = 1
28 while go == 1 { let base: i64 = buf as i64; let r: i64 = sys_read(fd, (base + n) as *u8, cap - n); if r <= 0 { go = 0 } else { n = n + r } if n >= cap { go = 0 } }
29 sys_close(fd)
30 return n
31}
32// tab-column [start,end) spans for one line; returns ncols (<=9)
33func rp_cols(q: *u8, ls: i64, le: i64, sp: *i64) -> i64 {
34 var c: i64 = 0
35 var p: i64 = ls
36 while c < 9 {
37 var e: i64 = p
38 var s: i64 = 1
39 while s == 1 { if e >= le { s = 0 } else { if q[e] == (9 as u8) { s = 0 } else { e = e + 1 } } }
40 sp[c*2] = p
41 sp[c*2+1] = e
42 c = c + 1
43 if e >= le { return c }
44 p = e + 1
45 }
46 return c
47}
48func rp_slice_eq(a: *u8, s: i64, e: i64, b: *u8, bs: i64, be: i64) -> i64 {
49 if e - s != be - bs { return 0 }
50 var i: i64 = 0
51 while s + i < e { if a[s+i] != b[bs+i] { return 0 } i = i + 1 }
52 return 1
53}
54// the tutor-brief route gene: last channel ANSWER for id-slice -> write route line
55func rp_route(fd: i64, tin: *u8, tn: i64, q: *u8, ida: i64, idb: i64) -> i64 {
56 let idl: i64 = idb - ida
57 if idl <= 0 { return 0 }
58 var pa: i64 = 0 - 1
59 var pb: i64 = 0 - 1
60 var i: i64 = 0
61 while i < tn {
62 var le: i64 = i
63 var s: i64 = 1
64 while s == 1 { if le >= tn { s = 0 } else { if tin[le] == (10 as u8) { s = 0 } else { le = le + 1 } } }
65 var ap: i64 = 0 - 1
66 var j: i64 = i
67 while j + 7 < le {
68 if tin[j] == (9 as u8) { if tin[j+1] == (65 as u8) { if tin[j+6] == (82 as u8) { if tin[j+7] == (9 as u8) { ap = j + 8; j = le } } } }
69 j = j + 1
70 }
71 if ap >= 0 {
72 if ap + idl < le {
73 var k: i64 = 0
74 var hit: i64 = 1
75 while k < idl { if tin[ap+k] != q[ida+k] { hit = 0; k = idl } else { k = k + 1 } }
76 if hit == 1 { if tin[ap+idl] == (9 as u8) { pa = ap + idl + 1; pb = le } }
77 }
78 }
79 i = le + 1
80 }
81 if pa >= 0 {
82 _fp(fd, " route: " as *u8)
83 let base: i64 = tin as i64
84 sys_write(fd, (base + pa) as *u8, pb - pa)
85 _fp(fd, "\n" as *u8)
86 return 1
87 }
88 return 0
89}
90// emit one owner's part file (tmp+renameat); returns rows written
91func rp_part(q: *u8, qn: i64, tin: *u8, tn: i64, outd: *u8, oa: i64, ob: i64) -> i64 {
92 let path: *u8 = sys_mmap(512)
93 var o: i64 = rp_cat(path, 0, outd)
94 o = rp_cat(path, o, "/" as *u8)
95 var w: i64 = oa
96 while w < ob { path[o] = q[w]; o = o + 1; w = w + 1 }
97 let tmp: *u8 = sys_mmap(512)
98 var t2: i64 = 0
99 while t2 < o { tmp[t2] = path[t2]; t2 = t2 + 1 }
100 var o2: i64 = rp_cat(path, o, ".txt" as *u8)
101 path[o2] = 0 as u8
102 let t3: i64 = rp_cat(tmp, o, ".tmp" as *u8)
103 tmp[t3] = 0 as u8
104 let fd: i64 = sys_openat_wr(tmp, 0x1a4)
105 if fd < 0 { return 0 }
106 _fp(fd, "# PART (generated by nx_role_parts; the shared score, extracted) owner=" as *u8)
107 let qbase: i64 = q as i64
108 sys_write(fd, (qbase + oa) as *u8, ob - oa)
109 _fp(fd, "\n" as *u8)
110 let sp: *i64 = sys_mmap(160) as *i64
111 var nrows: i64 = 0
112 var i: i64 = 0
113 while i < qn {
114 var le: i64 = i
115 var s: i64 = 1
116 while s == 1 { if le >= qn { s = 0 } else { if q[le] == (10 as u8) { s = 0 } else { le = le + 1 } } }
117 if q[i] != (35 as u8) {
118 let nc: i64 = rp_cols(q, i, le, sp)
119 if nc == 9 {
120 if rp_slice_eq(q, sp[8], sp[9], q, oa, ob) == 1 {
121 var live: i64 = 0
122 if q[sp[10]] == (84 as u8) { live = 1 }
123 if q[sp[10]] == (78 as u8) { live = 1 }
124 if live == 1 {
125 _fp(fd, "== " as *u8)
126 sys_write(fd, (qbase + sp[0]) as *u8, sp[1] - sp[0])
127 _fp(fd, " w=" as *u8)
128 sys_write(fd, (qbase + sp[4]) as *u8, sp[5] - sp[4])
129 _fp(fd, " status=" as *u8)
130 sys_write(fd, (qbase + sp[10]) as *u8, sp[11] - sp[10])
131 _fp(fd, "\n gate: " as *u8)
132 sys_write(fd, (qbase + sp[14]) as *u8, sp[15] - sp[14])
133 _fp(fd, "\n what: " as *u8)
134 sys_write(fd, (qbase + sp[16]) as *u8, sp[17] - sp[16])
135 _fp(fd, "\n" as *u8)
136 rp_route(fd, tin, tn, q, sp[0], sp[1])
137 nrows = nrows + 1
138 }
139 }
140 }
141 }
142 i = le + 1
143 }
144 _fp(fd, "# rows=" as *u8); _fn(fd, nrows); _fp(fd, "\n" as *u8)
145 sys_close(fd)
146 sys_renameat(tmp, path)
147 return nrows
148}
149// ---- X-ORC-008 rung2: SECTION parts (union of a section's chairs' rows, lead first) ----
150// is the owner slice q[oa..ob) one of the comma-separated names in the sections-buffer sb[ca..cb)?
151func rp_name_in_csv(q: *u8, oa: i64, ob: i64, sb: *u8, ca: i64, cb: i64) -> i64 {
152 var p: i64 = ca
153 while p < cb {
154 var e: i64 = p
155 var go: i64 = 1
156 while go == 1 { if e >= cb { go = 0 } else { if sb[e] == (44 as u8) { go = 0 } else { e = e + 1 } } }
157 if rp_slice_eq(q, oa, ob, sb, p, e) == 1 { return 1 }
158 p = e + 1
159 }
160 return 0
161}
162// emit one queue row (id/w/owner/status/gate/what + route). Shared by the section-part passes;
163// mirrors rp_part's inline emit but prints owner (a section mixes chairs). rp_part is left untouched.
164func rp_emit_one(fd: i64, q: *u8, sp: *i64, tin: *u8, tn: i64) -> i64 {
165 let qbase: i64 = q as i64
166 _fp(fd, "== " as *u8); sys_write(fd, (qbase + sp[0]) as *u8, sp[1] - sp[0])
167 _fp(fd, " w=" as *u8); sys_write(fd, (qbase + sp[4]) as *u8, sp[5] - sp[4])
168 _fp(fd, " owner=" as *u8); sys_write(fd, (qbase + sp[8]) as *u8, sp[9] - sp[8])
169 _fp(fd, " status=" as *u8); sys_write(fd, (qbase + sp[10]) as *u8, sp[11] - sp[10])
170 _fp(fd, "\n gate: " as *u8); sys_write(fd, (qbase + sp[14]) as *u8, sp[15] - sp[14])
171 _fp(fd, "\n what: " as *u8); sys_write(fd, (qbase + sp[16]) as *u8, sp[17] - sp[16])
172 _fp(fd, "\n" as *u8)
173 rp_route(fd, tin, tn, q, sp[0], sp[1])
174 return 0
175}
176// emit one SECTION's part: <outd>/section_<name>.txt = union of its chairs' LIVE rows, LEAD first.
177// name/lead/chairs are slices into the sections-buffer sb.
178func rp_section_part(q: *u8, qn: i64, tin: *u8, tn: i64, outd: *u8, sb: *u8, na: i64, nb: i64, la: i64, lb: i64, ca: i64, cb: i64) -> i64 {
179 let path: *u8 = sys_mmap(512)
180 var o: i64 = rp_cat(path, 0, outd)
181 o = rp_cat(path, o, "/section_" as *u8)
182 var w: i64 = na
183 while w < nb { path[o] = sb[w]; o = o + 1; w = w + 1 }
184 let tmp: *u8 = sys_mmap(512)
185 var t2: i64 = 0
186 while t2 < o { tmp[t2] = path[t2]; t2 = t2 + 1 }
187 var o2: i64 = rp_cat(path, o, ".txt" as *u8); path[o2] = 0 as u8
188 let t3: i64 = rp_cat(tmp, o, ".tmp" as *u8); tmp[t3] = 0 as u8
189 let fd: i64 = sys_openat_wr(tmp, 0x1a4)
190 if fd < 0 { return 0 }
191 let sbase: i64 = sb as i64
192 _fp(fd, "# SECTION PART (nx_role_parts X-ORC-008; union of chairs' rows, lead first) section=" as *u8)
193 sys_write(fd, (sbase + na) as *u8, nb - na)
194 _fp(fd, " lead=" as *u8); sys_write(fd, (sbase + la) as *u8, lb - la)
195 _fp(fd, " chairs=" as *u8); sys_write(fd, (sbase + ca) as *u8, cb - ca)
196 _fp(fd, "\n" as *u8)
197 let sp: *i64 = sys_mmap(160) as *i64
198 var nrows: i64 = 0
199 var ph: i64 = 0
200 while ph < 2 {
201 var i: i64 = 0
202 while i < qn {
203 var le: i64 = i
204 var s: i64 = 1
205 while s == 1 { if le >= qn { s = 0 } else { if q[le] == (10 as u8) { s = 0 } else { le = le + 1 } } }
206 if q[i] != (35 as u8) {
207 let nc: i64 = rp_cols(q, i, le, sp)
208 if nc == 9 {
209 var liv: i64 = 0
210 if q[sp[10]] == (84 as u8) { liv = 1 }
211 if q[sp[10]] == (78 as u8) { liv = 1 }
212 if liv == 1 {
213 let is_lead: i64 = rp_slice_eq(q, sp[8], sp[9], sb, la, lb)
214 var em: i64 = 0
215 if ph == 0 { if is_lead == 1 { em = 1 } }
216 if ph == 1 { if is_lead == 0 { if rp_name_in_csv(q, sp[8], sp[9], sb, ca, cb) == 1 { em = 1 } } }
217 if em == 1 { rp_emit_one(fd, q, sp, tin, tn); nrows = nrows + 1 }
218 }
219 }
220 }
221 i = le + 1
222 }
223 ph = ph + 1
224 }
225 _fp(fd, "# rows=" as *u8); _fn(fd, nrows); _fp(fd, "\n" as *u8)
226 sys_close(fd)
227 sys_renameat(tmp, path)
228 return nrows
229}
230func main(argc: i64, argv: *i64) -> i64 {
231 var qp: *u8 = "knowledge/registry/assignment_queue.tsv" as *u8
232 var outd: *u8 = "knowledge/parts" as *u8
233 if argc >= 2 { qp = argv[1] as *u8 }
234 if argc >= 3 { outd = argv[2] as *u8 }
235 _p("=== ROLE PARTS: the shared score, one extracted part per chair ===\n" as *u8)
236 let q: *u8 = sys_mmap(K_MAGIC_1048576)
237 let qn: i64 = rp_read(qp, q, K_MAGIC_1048560)
238 if qn <= 0 { _p(" queue MISSING -- fail loud\n" as *u8); sys_exit(1); return 1 }
239 let tin: *u8 = sys_mmap(K_MAGIC_262144)
240 let tn: i64 = rp_read("knowledge/channel/tutor_in.tsv" as *u8, tin, K_MAGIC_262128)
241 // collect distinct owners (col 5) from data rows
242 let seen: *u8 = sys_mmap(K_MAGIC_8192)
243 var sn: i64 = 0
244 let sp: *i64 = sys_mmap(160) as *i64
245 var nparts: i64 = 0
246 var nrows_total: i64 = 0
247 var i: i64 = 0
248 while i < qn {
249 var le: i64 = i
250 var s: i64 = 1
251 while s == 1 { if le >= qn { s = 0 } else { if q[le] == (10 as u8) { s = 0 } else { le = le + 1 } } }
252 if q[i] != (35 as u8) {
253 let nc: i64 = rp_cols(q, i, le, sp)
254 if nc == 9 {
255 let oa: i64 = sp[8]
256 let ob: i64 = sp[9]
257 // seen-set: nul-separated owner names
258 var dup: i64 = 0
259 var x: i64 = 0
260 while x < sn {
261 var y: i64 = x
262 while seen[y] != (0 as u8) { y = y + 1 }
263 if rp_slice_eq(seen, x, y, q, oa, ob) == 1 { dup = 1; x = sn } else { x = y + 1 }
264 }
265 if dup == 0 {
266 if ob - oa > 0 {
267 var c2: i64 = oa
268 while c2 < ob { seen[sn] = q[c2]; sn = sn + 1; c2 = c2 + 1 }
269 seen[sn] = 0 as u8
270 sn = sn + 1
271 nrows_total = nrows_total + rp_part(q, qn, tin, tn, outd, oa, ob)
272 nparts = nparts + 1
273 }
274 }
275 }
276 }
277 i = le + 1
278 }
279 // X-ORC-008 rung2: per sections.tsv row, emit knowledge/parts/section_<name>.txt
280 // (union of the section's chairs' LIVE rows, lead first). Additive -- owner parts above unchanged.
281 let sbuf: *u8 = sys_mmap(K_MAGIC_65536)
282 let sblen: i64 = rp_read("knowledge/registry/sections.tsv" as *u8, sbuf, K_MAGIC_65520)
283 var nsec: i64 = 0
284 if sblen > 0 {
285 let ssp: *i64 = sys_mmap(160) as *i64
286 var si: i64 = 0
287 while si < sblen {
288 var sle: i64 = si
289 var ss: i64 = 1
290 while ss == 1 { if sle >= sblen { ss = 0 } else { if sbuf[sle] == (10 as u8) { ss = 0 } else { sle = sle + 1 } } }
291 if sbuf[si] != (35 as u8) {
292 let snc: i64 = rp_cols(sbuf, si, sle, ssp)
293 if snc >= 4 {
294 // sections.tsv cols: section(0) family(1) lead(2) chairs(3) chain_ref(4) why(5)
295 if ssp[1] - ssp[0] > 0 {
296 nrows_total = nrows_total + rp_section_part(q, qn, tin, tn, outd, sbuf, ssp[0], ssp[1], ssp[4], ssp[5], ssp[6], ssp[7])
297 nsec = nsec + 1
298 }
299 }
300 }
301 si = sle + 1
302 }
303 }
304 let lfd: i64 = sys_openat_append("knowledge/status/role_parts.log" as *u8, 0x1a4)
305 if lfd >= 0 {
306 _fp(lfd, "PARTS epoch=" as *u8); _fn(lfd, sys_now_realtime_sec())
307 _fp(lfd, " owners=" as *u8); _fn(lfd, nparts)
308 _fp(lfd, " sections=" as *u8); _fn(lfd, nsec)
309 _fp(lfd, " rows=" as *u8); _fn(lfd, nrows_total)
310 _fp(lfd, " verdict=DERIVED\n" as *u8)
311 sys_close(lfd)
312 }
313 _p(" PARTS: derived per chair (knowledge/parts/<owner>.txt) + per section (section_<name>.txt)\n" as *u8)
314 sys_exit(0)
315 return 0
316}