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}