nx_orchestrate_raci.nx source
↩ module page · 351 lines · 18523 B
1// nx_orchestrate_raci.nx -- ORCHESTRATION rung 3: the CONDUCTOR / the "call the API, it calls the team,
2// the team runs the workstream" engine (operator 2026-07-10: "standard mcp apis so that we call the apis
3// that call the teams that run the workstreams ... true orchestration like an orchestra ... key for
4// autonomous capabilities").
5//
6// ---- seq1789: WHY THIS FILE WAS RENAMED (restored capability, do not undo) --------------------------
7// This organ was `runtime/nx_orchestrate.nx`. A deduplication pass matched it against a COMPLETELY
8// DIFFERENT organ that happened to share the filename -- `runtime/_hdl_build/nx_orchestrate.nx`, the
9// wait-for-opening DEPLOY QUEUE POLLER -- and retired this one to `.dupe-reconciled`. They are not
10// duplicates: one resolves RACI and engages a team, the other polls a deploy queue. Nothing in their
11// CONTENT is shared; only the name was.
12// What that cost, measured 2026-07-30: nx_orchestrate_gate could no longer compile (expand_imports
13// failed), so it kept running its STALE binary -- which HANGS after two checks. That hang propagated:
14// nx_swcompare_evidence forks its domain gates with no deadline, so `librarian` never returned at all and
15// the failure surfaced as an MCP transport error, blaming the network for a retired source file.
16// LAW: A DEDUPLICATOR THAT MATCHES ON NAME RETIRES CAPABILITY, NOT DUPLICATION. Sameness is a property
17// of CONTENT; a filename is a label someone chose twice. Same family as the substring/role confusion in
18// md_promote_deny -- identity inferred from a name instead of read from the thing itself.
19// The name is now distinct from the poller's, so the collision cannot recur rather than being remembered.
20//
21// Given an ACTIVITY (workstream), this organ:
22// (1) RESOLVES its RACI from the sovereign RACI store -- the ONE Accountable role, the Responsible
23// role(s), Consulted, Informed. NEVER fabricates: an activity with no Accountable row -> DENY
24// (returns -1), so the orchestra cannot engage a role that does not own the work.
25// (2) BINDS the runnable workstream ORGAN from knowledge/orchestration/workstreams.conf (activity<TAB>organ).
26// (3) RECORDS the engagement durably on the seg-store (orchestration- prefix) -- who was engaged, what ran.
27// (4) DISPATCHES: forks _offc/nx_sov_build_run.elf <organ> and wait4s it = the team actually runs the
28// workstream (only with the run flag; resolve/plan still records the engagement).
29// license_tier: ORIGINAL
30import "nx_syscalls.nx"
31import "nx_estate_path.nx"
32import "nx_raci_sov.nx"
33import "nx_seg_store.nx"
34struct NxOrBinding {
35 raw:*u8,
36 allocated:i64,
37 organ:*u8,
38 verb:*u8,
39 id:*u8,
40 prefix:*u8,
41 code:i64,
42 stage:*u8
43}
44
45const OR_BIND_CELL:i64=128
46const OR_BIND_FIELDS:i64=5
47const OR_MAGIC_131072: i64 = 131072
48const OR_MAGIC_16384: i64 = 16384
49
50// OR_RACI retired 2026-07-16: RACI reads from the sovereign store (raci_read_all)
51const OR_WS: *u8 = "knowledge/orchestration/workstreams.conf"
52const OR_STORE:*u8 = "knowledge/store/orchestration-"
53
54func or_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
55func or_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){d[o]=s[i];o=o+1;i=i+1} d[o]=0 as u8; return o }
56func or_w(s: *u8) -> i64 { sys_write(1, s, or_slen(s)); return 0 }
57func or_eq(a: *u8, b: *u8) -> i64 { var i: i64=0; while a[i]!=(0 as u8){ if a[i]!=b[i]{return 0} i=i+1 } if b[i]!=(0 as u8){return 0} return 1 }
58func or_read(path: *u8, buf: *u8, cap: i64) -> i64 {
59 let fd: i64 = sys_openat_rd(path); if fd<0 { return 0 }
60 var n: i64=0; var r: i64=sys_read(fd, buf, cap-1)
61 while r>0 { n=n+r; if n>=cap-1 { r=0 } else { r=sys_read(fd, buf+n, cap-1-n) } }
62 sys_close(fd); buf[n]=0 as u8; return n
63}
64// field col (0-based, TAB-delimited) of line [ls,le) into dst (NUL-term); returns len.
65func or_field(buf: *u8, ls: i64, le: i64, col: i64, dst: *u8) -> i64 {
66 var c: i64=0; var p: i64=ls; var k: i64=0
67 while p<le {
68 if buf[p]==(9 as u8) { if c==col { dst[k]=0 as u8; return k } c=c+1; if c==col { k=0 } }
69 else { if c==col { if buf[p]!=(13 as u8) { dst[k]=buf[p]; k=k+1 } } }
70 p=p+1
71 }
72 dst[k]=0 as u8; return k
73}
74func or_has_letter(letters: *u8, L: u8) -> i64 { var i: i64=0; while letters[i]!=(0 as u8){ if letters[i]==L { return 1 } i=i+1 } return 0 }
75
76// Resolve every role for ACTIVITY whose RACI letters include L (A/R/C/I) -> comma-joined into out. returns count.
77func orch_roles(activity: *u8, L: u8, out: *u8) -> i64 {
78 let buf: *u8 = sys_mmap(OR_MAGIC_131072); let n: i64 = raci_read_all(buf, OR_MAGIC_131072)
79 let role: *u8 = sys_mmap(64); let act: *u8 = sys_mmap(64); let let3: *u8 = sys_mmap(16)
80 var o: i64 = 0; var cnt: i64 = 0
81 var ls: i64=0; var i: i64=0
82 while i<=n {
83 var eol: i64=0
84 if i==n { eol=1 } else { if buf[i]==(10 as u8) { eol=1 } }
85 if eol==1 {
86 if i>ls { if buf[ls]!=(35 as u8) {
87 or_field(buf, ls, i, 0, role)
88 or_field(buf, ls, i, 1, act)
89 or_field(buf, ls, i, 2, let3)
90 if or_eq(act, activity)==1 { if or_has_letter(let3, L)==1 {
91 if cnt>0 { out[o]=44 as u8; o=o+1 }
92 var j: i64=0; while role[j]!=(0 as u8){ out[o]=role[j]; o=o+1; j=j+1 }
93 cnt=cnt+1
94 } }
95 } }
96 ls=i+1
97 }
98 i=i+1
99 }
100 out[o]=0 as u8
101 return cnt
102}
103// the ONE Accountable role for activity into out; returns 1 found / 0 none (DENY: never fabricate).
104func orch_accountable(activity: *u8, out: *u8) -> i64 {
105 let tmp: *u8 = sys_mmap(256)
106 let c: i64 = orch_roles(activity, 65 as u8, tmp)
107 if c < 1 { out[0]=0 as u8; return 0 }
108 var i: i64=0; while tmp[i]!=(0 as u8){ if tmp[i]==(44 as u8) { out[i]=0 as u8; return 1 } out[i]=tmp[i]; i=i+1 } out[i]=0 as u8
109 return 1
110}
111// runnable organ bound to activity from workstreams.conf into out; returns 1 found / 0 none.
112func orch_organ(activity:*u8,out:*u8)->i64 {
113 let scratch:*u8=sys_mmap_shared(OR_BIND_CELL*3);if (scratch as i64)<=0{return -1}
114 let rc:i64=orch_binding_from(OR_WS,activity,out,scratch,scratch+OR_BIND_CELL,scratch+OR_BIND_CELL*2)
115 if sys_munmap(scratch,OR_BIND_CELL*3)!=0{return -1};return rc
116}
117// record the engagement durably on the seg-store.
118func or_record_hex(out:*u8,off:i64,s:*u8)->i64 {
119 let digits:*u8="0123456789abcdef";var i:i64=0;var o:i64=off
120 while s[i]!=(0 as u8){let b:i64=s[i] as i64;out[o]=digits[b/16];out[o+1]=digits[b%16];o=o+2;i=i+1};out[o]=0;return o
121}
122func orch_record_args_to(store:*u8,activity:*u8,acct:*u8,organ:*u8,verdict:*u8,verb:*u8,config:*u8,prefix:*u8)->i64 {
123 let kn:i64=or_slen("orch:engage:")+or_slen(activity)+1
124 let cap:i64=OR_BIND_CELL*2+or_slen(activity)+or_slen(acct)+or_slen(organ)+or_slen(verdict)+2*(or_slen(verb)+or_slen(config)+or_slen(prefix))
125 let key:*u8=sys_mmap_shared(kn);let val:*u8=sys_mmap_shared(cap);var rc:i64=0
126 if (key as i64)<=0||(val as i64)<=0{rc=-1}else{
127 var ko:i64=or_cat(key,0,"orch:engage:");or_cat(key,ko,activity)
128 var o:i64=or_cat(val,0,"activity=");o=or_cat(val,o,activity);o=or_cat(val,o,"|accountable=");o=or_cat(val,o,acct)
129 o=or_cat(val,o,"|organ=");o=or_cat(val,o,organ);o=or_cat(val,o,"|verdict=");o=or_cat(val,o,verdict)
130 if verb[0]!=(0 as u8){o=or_cat(val,o,"|verb_hex=");o=or_record_hex(val,o,verb);o=or_cat(val,o,"|configuration_id_hex=");o=or_record_hex(val,o,config);o=or_cat(val,o,"|configuration_plane_hex=");o=or_record_hex(val,o,prefix)}
131 let w:*i64=ss_begin()
132 if (w as i64)<=0{rc=-1}else{if ss_add(w,1,key,val,o)!=0{rc=-1}else{if ss_commit(store,w,sys_now_us())!=0{rc=-2}}}
133 }
134 if (key as i64)>0{if sys_munmap(key,kn)!=0{rc=-2}};if (val as i64)>0{if sys_munmap(val,cap)!=0{rc=-2}}
135 return rc
136}
137func orch_record(activity:*u8,acct:*u8,organ:*u8,verdict:*u8)->i64{return orch_record_args_to(OR_STORE,activity,acct,organ,verdict,"","","")}
138// DISPATCH: fork+exec `_offc/nx_sov_build_run.elf <organ>` and wait; returns child exit code, or -1 on fork fail.
139func orch_dispatch_args(organ:*u8,verb:*u8,id:*u8,prefix:*u8)->i64 {
140 if or_bind_name(organ)!=1{return -1}
141 if verb[0]!=(0 as u8)&&or_bind_name(verb)!=1{return -1}
142 if id[0]==(45 as u8)||prefix[0]==(45 as u8){return -1}
143 if verb[0]!=(0 as u8)&&id[0]==(0 as u8){return -1}
144 if verb[0]==(0 as u8)&&prefix[0]!=(0 as u8){return -1}
145 let pid: i64 = sys_fork()
146 if pid < 0 { return 0-1 }
147 if pid == 0 {
148 let argv: *i64 = sys_mmap(64) as *i64
149 argv[0] = "_offc/nx_sov_build_run.elf" as *u8 as i64
150 argv[1] = organ as i64
151 // Workflow execution must not implicitly publish its compiler output.
152 argv[2] = "--qualify" as *u8 as i64
153 argv[3] = 0
154 if verb[0]!=(0 as u8){argv[3]=verb as i64;argv[4]=id as i64;argv[5]=0;if prefix[0]!=(0 as u8){argv[5]=prefix as i64;argv[6]=0}}
155 let envp: *i64 = sys_mmap(16) as *i64; envp[0] = 0
156 sys_execve("_offc/nx_sov_build_run.elf" as *u8, argv, envp)
157 sys_exit(127)
158 }
159 let st: *i64 = sys_mmap(16) as *i64
160 let waited: i64 = sys_wait4(pid, st, 0)
161 if waited != pid { return -1 }
162 return wait_status_rc(st[0])
163}
164
165func orch_dispatch(organ:*u8)->i64{return orch_dispatch_args(organ,"","","")}
166
167// ORCHESTRATE one activity. do_run: 0 = resolve+plan+record only; 1 = also dispatch the workstream.
168// returns 1 GREEN (engaged; if run, workstream exit 0) / 0 workstream-nonzero / -1 DENY (no accountable role).
169func orch_engage_selected(activity:*u8,do_run:i64,records:*u8,binding:*NxOrBinding,hasorgan:i64)->i64 {
170 let acct: *u8 = sys_mmap(128)
171 if orch_accountable(activity, acct) == 0 {
172 or_w("ORCHESTRATE deny activity="); or_w(activity); or_w(" reason=no-accountable-role (not in the RACI SSOT)\n" as *u8)
173 return 0-1
174 }
175 let resp: *u8 = sys_mmap(256); orch_roles(activity, 82 as u8, resp)
176 let cons: *u8 = sys_mmap(256); orch_roles(activity, 67 as u8, cons)
177 let inf: *u8 = sys_mmap(256); orch_roles(activity, 73 as u8, inf)
178 let organ:*u8=binding.organ;let verb:*u8=binding.verb;let config:*u8=binding.id;let config_plane:*u8=binding.prefix
179 or_w("ORCHESTRATE activity="); or_w(activity)
180 or_w("\n Accountable="); or_w(acct)
181 or_w(" Responsible="); or_w(resp)
182 or_w("\n Consulted="); or_w(cons)
183 or_w(" Informed="); or_w(inf)
184 or_w("\n workstream-organ="); if hasorgan==1 { or_w(organ) } else { or_w("(none bound)" as *u8) }
185 or_w("\n" as *u8)
186 var verdict: *u8 = "PLANNED" as *u8
187 var rc: i64 = 1
188 if do_run == 1 && hasorgan == 0 {
189 verdict = "NOT-RUN-UNBOUND"; rc = 0
190 or_w(" reason=no-workstream-bound next=bind-qualified-workstream\n")
191 }
192 if do_run == 1 { if hasorgan == 1 {
193 or_w(" entrypoint=");or_w(verb);or_w(" configuration=");or_w(config);or_w(" configuration-plane=");or_w(config_plane);or_w("\n")
194 or_w(" DISPATCHING -> the "); or_w(acct); or_w(" team runs "); or_w(organ); or_w("...\n" as *u8)
195 let ex:i64=orch_dispatch_args(organ,verb,config,config_plane)
196 if ex == 0 { verdict = "RAN-GREEN" as *u8 } else { verdict = "RAN-NONZERO" as *u8; rc = 0 }
197 } }
198 let recorded:i64=orch_record_args_to(records,activity,acct,organ,verdict,verb,config,config_plane)
199 or_w(" verdict="); or_w(verdict)
200 if recorded != 0 {
201 or_w(" evidence=write-failed next=repair-engagement-store\n")
202 return -2
203 }
204 or_w(" (engagement recorded on the seg-store)\n" as *u8)
205 return rc
206}
207
208func orch_engage_from(activity:*u8,do_run:i64,workstreams:*u8,records:*u8)->i64 {
209 let binding:*NxOrBinding=sys_mmap_shared(__size_of(NxOrBinding)) as *NxOrBinding
210 if (binding as i64)<=0{or_w("ORCHESTRATE refused reason=binding-allocation-failed\n");return -3}
211 let selected:i64=orch_binding_read(workstreams,activity,binding);var rc:i64=-3
212 if selected<0{or_w("ORCHESTRATE refused binding-stage=");or_w(binding.stage);or_w(" next=repair-selected-workstreams-file\n")}else{
213 rc=orch_engage_selected(activity,do_run,records,binding,selected)
214 }
215 if or_binding_release(binding)!=0{rc=-3}
216 if sys_munmap(binding as *u8,__size_of(NxOrBinding))!=0{rc=-3}
217 return rc
218}
219func orch_engage(activity:*u8,do_run:i64)->i64{return orch_engage_from(activity,do_run,OR_WS,OR_STORE)}
220
221func main(argc: i64, argv: *i64) -> i64 {
222 if argc < 2 {
223 or_w("usage: nx_orchestrate_raci <activity> [run] (activity from the RACI store: research organize curate verify redteam ...)\n" as *u8)
224 return 1
225 }
226 if ep_anchor() < 0 { or_w("ORCHESTRATE unavailable reason=estate-context-unresolved\n"); return 3 }
227 let activity: *u8 = argv[1] as *u8
228 var do_run: i64 = 0
229 if argc >= 3 { if or_eq(argv[2] as *u8, "run" as *u8)==1 { do_run=1 } }
230 let r: i64 = orch_engage(activity, do_run)
231 if r != 1 { return 1 }
232 return 0
233}
234
235// Existing two-column binding remains valid. Optional verb, configuration ID,
236// and configuration plane are literal argv fields; no shell interpretation.
237import "nx_utf8.nx"
238func or_bind_name(s:*u8)->i64 {
239 if s[0]==(45 as u8){return 0}
240 var i:i64=0;while s[i]!=(0 as u8){let c:i64=s[i] as i64
241 if (c<48||c>57)&&(c<65||c>90)&&(c<97||c>122)&&c!=95&&c!=45{return 0};i=i+1
242 };if i==0{return 0};return 1
243}
244
245// Selected binding owns one observed file extent. Legacy output-buffer wrappers
246// below retain their documented cell capacity; the dispatch path has no field cap.
247import "nx_fio.nx"
248func or_binding_init(b:*NxOrBinding)->i64 {
249 b.raw=0 as *u8;b.allocated=0;b.organ="";b.verb="";b.id="";b.prefix="";b.code=0;b.stage="unbound";return 0
250}
251func or_binding_release(b:*NxOrBinding)->i64 {
252 if (b.raw as i64)>0{let rc:i64=sys_munmap(b.raw,b.allocated);if rc!=0{return rc}}
253 return or_binding_init(b)
254}
255func or_bind_name_span(buf:*u8,start:i64,n:i64)->i64 {
256 if n<1||buf[start]==(45 as u8){return 0}
257 var i:i64=0;while i<n{let c:i64=buf[start+i] as i64
258 if (c<48||c>57)&&(c<65||c>90)&&(c<97||c>122)&&c!=95&&c!=45{return 0};i=i+1
259 };return 1
260}
261// Returns selected=1, explicit unbound=0, malformed=-4, allocation=-5.
262// Selected spans are returned only after the complete observed extent is scanned.
263func orch_binding_select(buf:*u8,n:i64,activity:*u8,selected:*i64)->i64 {
264 if n<0||((buf as i64)==0&&n>0){return -4}
265 let fs:*i64=sys_mmap_shared(OR_BIND_FIELDS*2*8) as *i64
266 if (fs as i64)<=0{return -5};var rc:i64=0;var pos:i64=0;let an:i64=or_slen(activity)
267 var z:i64=0;while z<OR_BIND_FIELDS*2{selected[z]=0;z=z+1}
268 while pos<n&&rc>=0{
269 var end:i64=pos;while end<n&&buf[end]!=(10 as u8){end=end+1}
270 var le:i64=end;if le>pos&&buf[le-1]==(13 as u8){le=le-1}
271 var tab:i64=pos;while tab<le&&buf[tab]!=(9 as u8){tab=tab+1}
272 var same:i64=1
273 if tab-pos!=an{same=0}else{var k:i64=0;while k<an{if buf[pos+k]!=activity[k]{same=0};k=k+1}}
274 if same==1&&le>pos&&buf[pos]!=(35 as u8){
275 if rc==1{rc=-4;break}
276 var col:i64=0;var start:i64=pos;var k:i64=pos
277 while k<=le{
278 var boundary:i64=0;if k==le{boundary=1}else{if buf[k]==(9 as u8){boundary=1}}
279 if boundary==1{
280 if col>=OR_BIND_FIELDS||k==start{rc=-4;break}
281 if utf8_validate((buf as i64+start) as *u8,k-start)!=k-start{rc=-4;break}
282 fs[col*2]=start;fs[col*2+1]=k-start;col=col+1;start=k+1
283 }else{if buf[k]<(32 as u8){rc=-4;break}};k=k+1
284 }
285 if rc<0{break};if col!=2&&col!=4&&col!=5{rc=-4;break}
286 if or_bind_name_span(buf,fs[2],fs[3])!=1{rc=-4;break}
287 if col>2{
288 if or_bind_name_span(buf,fs[4],fs[5])!=1||buf[fs[6]]==(45 as u8){rc=-4;break}
289 if col==5&&buf[fs[8]]==(45 as u8){rc=-4;break}
290 }
291 k=0;while k<col*2{selected[k]=fs[k];k=k+1};rc=1
292 };pos=end+1
293 }
294 if sys_munmap(fs as *u8,OR_BIND_FIELDS*2*8)!=0{return -5};return rc
295}
296func orch_binding_read(path:*u8,activity:*u8,b:*NxOrBinding)->i64 {
297 or_binding_init(b)
298 let r:*NxFileReadRegion=sys_mmap_shared(__size_of(NxFileReadRegion)) as *NxFileReadRegion
299 let fs:*i64=sys_mmap_shared(OR_BIND_FIELDS*2*8) as *i64
300 var rc:i64=0;b.stage="allocation"
301 if (r as i64)<=0||(fs as i64)<=0{rc=-5}else{
302 fio_region_init(r);b.stage="open";let opened:i64=fio_region_open(path,r)
303 if opened!=0{b.code=opened;rc=-3;if opened==(0-2){b.stage="missing";rc=-2}}
304 if rc==0{
305 b.stage="extent"
306 if r.total<0||r.total==9223372036854775807{rc=-5}else{
307 b.allocated=r.total+1;b.raw=sys_mmap_shared(b.allocated)
308 if (b.raw as i64)<=0{b.raw=0 as *u8;rc=-5}else{
309 b.stage="read";if r.total>0{if fio_region_next(r,b.raw,r.total)!=r.total{b.code=r.code;rc=-3}}
310 if rc==0{b.raw[r.total]=0;b.stage="selection";rc=orch_binding_select(b.raw,r.total,activity,fs)}
311 }
312 }
313 }
314 fio_region_close(r);if r.close_code!=0{b.code=r.close_code;b.stage="close";rc=-3}
315 if rc==1{
316 b.organ=(b.raw as i64+fs[2]) as *u8;b.raw[fs[2]+fs[3]]=0
317 if fs[5]>0{b.verb=(b.raw as i64+fs[4]) as *u8;b.raw[fs[4]+fs[5]]=0}
318 if fs[7]>0{b.id=(b.raw as i64+fs[6]) as *u8;b.raw[fs[6]+fs[7]]=0}
319 if fs[9]>0{b.prefix=(b.raw as i64+fs[8]) as *u8;b.raw[fs[8]+fs[9]]=0}
320 b.stage="selected"
321 };if rc==0{b.stage="unbound"}
322 }
323 if (r as i64)>0{if sys_munmap(r as *u8,__size_of(NxFileReadRegion))!=0{rc=-5}}
324 if (fs as i64)>0{if sys_munmap(fs as *u8,OR_BIND_FIELDS*2*8)!=0{rc=-5}}
325 if b.code==0&&rc<0{b.code=rc};return rc
326}
327// Compatibility ABI: each caller-provided output has OR_BIND_CELL bytes.
328func orch_binding_buffer(buf:*u8,n:i64,activity:*u8,organ:*u8,verb:*u8,id:*u8,prefix:*u8)->i64 {
329 organ[0]=0;verb[0]=0;id[0]=0;prefix[0]=0
330 let fs:*i64=sys_mmap_shared(OR_BIND_FIELDS*2*8) as *i64;if (fs as i64)<=0{return -1}
331 var rc:i64=orch_binding_select(buf,n,activity,fs)
332 if rc==1{
333 var f:i64=1;while f<OR_BIND_FIELDS{if fs[f*2+1]>=OR_BIND_CELL{rc=-1};f=f+1}
334 if rc==1{f=1;while f<OR_BIND_FIELDS{
335 var out:*u8=organ;if f==2{out=verb};if f==3{out=id};if f==4{out=prefix}
336 var k:i64=0;while k<fs[f*2+1]{out[k]=buf[fs[f*2]+k];k=k+1};out[k]=0;f=f+1
337 }}
338 }
339 if sys_munmap(fs as *u8,OR_BIND_FIELDS*2*8)!=0{return -1};return rc
340}
341func orch_binding_from(path:*u8,activity:*u8,organ:*u8,verb:*u8,id:*u8,prefix:*u8)->i64 {
342 organ[0]=0;verb[0]=0;id[0]=0;prefix[0]=0
343 let b:*NxOrBinding=sys_mmap_shared(__size_of(NxOrBinding)) as *NxOrBinding
344 if (b as i64)<=0{return -1};var rc:i64=orch_binding_read(path,activity,b)
345 if rc==1{
346 if or_slen(b.organ)>=OR_BIND_CELL||or_slen(b.verb)>=OR_BIND_CELL||or_slen(b.id)>=OR_BIND_CELL||or_slen(b.prefix)>=OR_BIND_CELL{rc=-1}else{
347 or_cat(organ,0,b.organ);or_cat(verb,0,b.verb);or_cat(id,0,b.id);or_cat(prefix,0,b.prefix)
348 }
349 }
350 if or_binding_release(b)!=0{rc=-1};if sys_munmap(b as *u8,__size_of(NxOrBinding))!=0{rc=-1};return rc
351}