nx_container_compose.nx source
↩ module page · 171 lines · 7732 B
1// nx_container_compose.nx -- R2 of the Nishi Container Host: SOVEREIGN multi-service orchestration planner
2// (the docker-compose / k8s-ordering analog). Reads a service registry (data: NAME:dep1,dep2 per line),
3// computes a dependency-ordered launch plan via topological sort, and REJECTS cycles + missing deps
4// (never-brick: an unsatisfiable stack must not "launch"). = the declarative multi-service core that closes the
5// census orchestration_multi axis. Per-service container PEs come from R1 nx_container_spec_emit (composable).
6// GATE: real Elder AI stack orders correctly (svcconfig -> sdserver -> genimg); cycle -> rejected; missing-dep
7// -> rejected. Topo self-checks its own output (deps must precede dependents). NO fake greens. license_tier: ORIGINAL
8import "nx_syscalls.nx"
9import "nx_runtime.nx"
10const CCP_MAGIC_8192: i64 = 8192
11const CCP_MAGIC_8191: i64 = 8191
12
13const CCP_TSV: *u8 = "knowledge/status/container_compose.tsv"
14const CMAX: i64 = 12
15const CNL: i64 = 24
16const CDEP: i64 = 96
17
18func cc_w(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 }
19func cc_wn(fd: i64, v: i64) -> i64 {
20 let bb: *u8 = sys_mmap(28)
21 var m: i64 = v
22 if m < 0 { sys_write(fd, "-" as *u8, 1); m = 0 - m }
23 let tt: *u8 = sys_mmap(28)
24 var k: i64 = 0
25 if m == 0 { tt[0] = 48 as u8; k = 1 }
26 while m > 0 { tt[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
27 var i: i64 = 0
28 while i < k { bb[i] = tt[k-1-i]; i = i + 1 }
29 sys_write(fd, bb, k)
30 return 0
31}
32func cc_p(s: *u8) -> i64 { return cc_w(1, s) }
33func cc_pn(v: i64) -> i64 { return cc_wn(1, v) }
34func cc_read(path: *u8, buf: *u8, cap: i64) -> i64 {
35 let fd: i64 = sys_openat_rd(path)
36 if fd < 0 { return 0 }
37 var tot: i64 = 0
38 var go: i64 = 1
39 while go == 1 {
40 let r: i64 = sys_read(fd, (buf as i64 + tot) as *u8, cap - tot)
41 if r <= 0 { go = 0 } else { tot = tot + r }
42 if tot >= cap { go = 0 }
43 }
44 sys_close(fd)
45 return tot
46}
47func cc_streq(a: *u8, b: *u8) -> i64 {
48 var i: i64 = 0
49 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 }
50 if b[i] != (0 as u8) { return 0 }
51 return 1
52}
53func cc_bit(k: i64) -> i64 { var b: i64 = 1; var i: i64 = 0; while i < k { b = b * 2; i = i + 1 } return b }
54func cc_findname(names: *u8, count: i64, tok: *u8) -> i64 {
55 var j: i64 = 0
56 while j < count { if cc_streq((names as i64 + j * CNL) as *u8, tok) == 1 { return j } j = j + 1 }
57 return 0 - 1
58}
59
60// parse registry -> names + topo order. returns op(==count) on success; -1 cycle; -2 missing dep; -3 bad order (self-check)
61func cc_compose(buf: *u8, n: i64, names: *u8, order: *i64) -> i64 {
62 let depstr: *u8 = sys_mmap(CMAX * CDEP)
63 let depmask: *i64 = sys_mmap(CMAX * 8) as *i64
64 var z: i64 = 0
65 while z < CMAX { depmask[z] = 0; z = z + 1 }
66 var pos: i64 = 0
67 var count: i64 = 0
68 while pos < n {
69 var eol: i64 = pos
70 var fe: i64 = 0
71 while fe == 0 { if eol >= n { fe = 1 } else { if buf[eol] == (10 as u8) { fe = 1 } else { eol = eol + 1 } } }
72 if eol > pos { if count < CMAX {
73 var col: i64 = pos
74 var fc: i64 = 0
75 while fc == 0 { if col >= eol { fc = 1 } else { if buf[col] == (58 as u8) { fc = 1 } else { col = col + 1 } } }
76 let np: *u8 = (names as i64 + count * CNL) as *u8
77 var a: i64 = 0
78 var fa: i64 = 0
79 while fa == 0 { if pos + a >= col { fa = 1 } else { if a >= CNL - 1 { fa = 1 } else { np[a] = buf[pos + a]; a = a + 1 } } }
80 np[a] = 0 as u8
81 let dp: *u8 = (depstr as i64 + count * CDEP) as *u8
82 var b: i64 = 0
83 var s: i64 = col + 1
84 var fb: i64 = 0
85 while fb == 0 { if s + b >= eol { fb = 1 } else { if b >= CDEP - 1 { fb = 1 } else { dp[b] = buf[s + b]; b = b + 1 } } }
86 dp[b] = 0 as u8
87 count = count + 1
88 } }
89 pos = eol + 1
90 }
91 var miss: i64 = 0
92 var i: i64 = 0
93 while i < count {
94 let ds: *u8 = (depstr as i64 + i * CDEP) as *u8
95 var p: i64 = 0
96 var fd2: i64 = 0
97 while fd2 == 0 {
98 if ds[p] == (0 as u8) { fd2 = 1 } else {
99 let tok: *u8 = sys_mmap(CNL)
100 var t: i64 = 0
101 var ft: i64 = 0
102 while ft == 0 { if ds[p] == (0 as u8) { ft = 1 } else { if ds[p] == (44 as u8) { ft = 1 } else { if t < CNL - 1 { tok[t] = ds[p]; t = t + 1 } p = p + 1 } } }
103 tok[t] = 0 as u8
104 if t > 0 { let j: i64 = cc_findname(names, count, tok); if j < 0 { miss = 1 } else { depmask[i] = depmask[i] | cc_bit(j) } }
105 if ds[p] == (44 as u8) { p = p + 1 }
106 }
107 }
108 i = i + 1
109 }
110 var emitted: i64 = 0
111 var op: i64 = 0
112 var prog: i64 = 1
113 while prog == 1 {
114 prog = 0
115 var k: i64 = 0
116 while k < count {
117 let bit: i64 = cc_bit(k)
118 if (emitted & bit) == 0 { if (depmask[k] & (0 - emitted - 1)) == 0 { emitted = emitted | bit; order[op] = k; op = op + 1; prog = 1 } }
119 k = k + 1
120 }
121 }
122 var okorder: i64 = 1
123 var em: i64 = 0
124 var q: i64 = 0
125 while q < op { let sx: i64 = order[q]; if (depmask[sx] & (0 - em - 1)) == 0 { } else { okorder = 0 } em = em | cc_bit(sx); q = q + 1 }
126 if miss == 1 { return 0 - 2 }
127 if op < count { return 0 - 1 }
128 if okorder == 0 { return 0 - 3 }
129 return op
130}
131
132func main() -> i64 {
133 cc_p("=== nx_container_compose: sovereign multi-service orchestration planner (docker-compose analog) ===\n" as *u8)
134 let names: *u8 = sys_mmap(CMAX * CNL)
135 let order: *i64 = sys_mmap(CMAX * 8) as *i64
136 let rb: *u8 = sys_mmap(CCP_MAGIC_8192)
137 let rn: i64 = cc_read("knowledge/containers/elderai_stack.compose" as *u8, rb, CCP_MAGIC_8191)
138 let r1: i64 = cc_compose(rb, rn, names, order)
139 cc_p(" T1 real Elder AI stack -> code=" as *u8); cc_pn(r1); cc_p(" launch order: " as *u8)
140 if r1 > 0 { var p: i64 = 0; while p < r1 { cc_p((names as i64 + order[p] * CNL) as *u8); cc_p(" -> " as *u8); p = p + 1 } }
141 cc_p("(ready)\n" as *u8)
142 var t1: i64 = 0
143 if r1 == 3 { t1 = 1 }
144 let cyc: *u8 = "a:b\nb:a\n" as *u8
145 let r2: i64 = cc_compose(cyc, 8, names, order)
146 var t2: i64 = 0
147 if r2 == (0 - 1) { t2 = 1 }
148 cc_p(" T2 neg-control cycle(a<->b) -> code=" as *u8); cc_pn(r2); cc_p(" (expect -1 reject)\n" as *u8)
149 let mis: *u8 = "x:nope\n" as *u8
150 let r3: i64 = cc_compose(mis, 7, names, order)
151 var t3: i64 = 0
152 if r3 == (0 - 2) { t3 = 1 }
153 cc_p(" T3 neg-control missing-dep -> code=" as *u8); cc_pn(r3); cc_p(" (expect -2 reject)\n" as *u8)
154 let r1b: i64 = cc_compose(rb, rn, names, order)
155 let tfd: i64 = sys_openat_wr(CCP_TSV, 0x1a4)
156 if tfd >= 0 {
157 cc_w(tfd, "# nx_container_compose plan -- dependency-ordered, readiness-gated launch (sovereign docker-compose)\n" as *u8)
158 if r1b > 0 { var p2: i64 = 0; while p2 < r1b { cc_w(tfd, "start\t" as *u8); cc_w(tfd, (names as i64 + order[p2] * CNL) as *u8); cc_w(tfd, "\twait-ready-then-next\n" as *u8); p2 = p2 + 1 } }
159 sys_close(tfd)
160 }
161 cc_p(" t1=" as *u8); cc_pn(t1); cc_p(" t2=" as *u8); cc_pn(t2); cc_p(" t3=" as *u8); cc_pn(t3); cc_p("\n" as *u8)
162 var pass: i64 = 0
163 if t1 == 1 { if t2 == 1 { if t3 == 1 { pass = 1 } } }
164 if pass == 1 {
165 cc_p("CONTAINERCOMPOSEGATE verdict=GREEN (topo order correct; cycle + missing-dep rejected; plan emitted)\n" as *u8)
166 cc_p("plan -> knowledge/status/container_compose.tsv\n" as *u8)
167 return 0
168 }
169 cc_p("CONTAINERCOMPOSEGATE verdict=RED (ordering/neg-control failed)\n" as *u8)
170 return 1
171}