code wiki / _hdl_build / _express_lane_gate_authored.nx
_express_lane_gate_authored.nx source
↩ module page · 153 lines · 6811 B
1// _express_lane_gate_authored.nx -- gate for X-XL-002. Drives the REAL lane elf over
2// epoch-unique scratch worlds:
3// K1 MARKWIRE-APPLIES MARKWIRE row -> scratch queue row gains ||MARK= + ACK mark-applied
4// K2 EXACTLY-ONCE re-run same world -> the ACK key appears EXACTLY once (no re-work)
5// K3 ANSWER-ACKED ANSWER row -> ACK note=received
6// K4 SITREP-PRESENT team_out carries SITREP-END + queue counts line
7// K5 LIVE real channel/queue -> exit 0
8// Markers: ELG-*; final ELGATE row -> knowledge/channel/team_out.tsv
9// license_tier: ORIGINAL
10import "nx_registry_lock.nx" // rt_lock/rt_unlock for the shared team_out write lock (nx_syscalls transitive)
11func eg_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
12func eg_f(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 }
13func eg_n(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 }
14func eg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
15func eg_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 }
16func eg_numcat(dst: *u8, off: i64, v: i64) -> i64 {
17 let t: *u8 = sys_mmap(28)
18 var m: i64 = v
19 var k: i64 = 0
20 if m == 0 { t[0] = 48 as u8; k = 1 }
21 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
22 var i: i64 = 0
23 var o: i64 = off
24 while i < k { dst[o] = t[k-1-i]; o = o + 1; i = i + 1 }
25 return o
26}
27func eg_mkpath(dst: *u8, epoch: i64, suffix: *u8) -> i64 {
28 var o: i64 = eg_cat(dst, 0, "/tmp/elg_" as *u8)
29 o = eg_numcat(dst, o, epoch)
30 o = eg_cat(dst, o, suffix)
31 dst[o] = 0 as u8
32 return o
33}
34func eg_writes(path: *u8, s: *u8) -> i64 {
35 let fd: i64 = sys_openat_wr(path, 0x1a4)
36 if fd < 0 { return 0 }
37 sys_write(fd, s, eg_len(s))
38 sys_close(fd)
39 return 1
40}
41func eg_run(tip: *u8, top: *u8, qp: *u8, live: i64) -> i64 {
42 let pid: i64 = sys_fork()
43 if pid == 0 {
44 let dn: i64 = sys_openat_wr("/dev/null" as *u8, 0x1a4)
45 if dn >= 0 { sys_dup3(dn, 1, 0); sys_dup3(dn, 2, 0) }
46 let argv: *i64 = sys_mmap(48) as *i64
47 argv[0] = "/tmp/nx_express_lane.sov.elf" as *u8 as i64
48 if live == 0 {
49 argv[1] = tip as i64
50 argv[2] = top as i64
51 argv[3] = qp as i64
52 argv[4] = 0
53 } else {
54 argv[1] = 0
55 }
56 let envp: *i64 = sys_mmap(16) as *i64
57 envp[0] = 0
58 sys_execve("/tmp/nx_express_lane.sov.elf" as *u8, argv, envp)
59 sys_exit(127)
60 }
61 let st: *i64 = sys_mmap(16) as *i64
62 sys_wait4(pid, st, 0)
63 if (st[0] % 128) != 0 { return 0 - 1 }
64 return (st[0] >> 8) & 0xff
65}
66func eg_count(path: *u8, pat: *u8) -> i64 {
67 let buf: *u8 = sys_mmap(262144)
68 let fd: i64 = sys_openat_rd(path)
69 if fd < 0 { return 0 }
70 var n: i64 = 0
71 var go: i64 = 1
72 while go == 1 { let base: i64 = buf as i64; let r: i64 = sys_read(fd, (base + n) as *u8, 262128 - n); if r <= 0 { go = 0 } else { n = n + r } if n >= 262128 { go = 0 } }
73 sys_close(fd)
74 let pl: i64 = eg_len(pat)
75 if pl == 0 { return 0 }
76 var cnt: i64 = 0
77 var i: i64 = 0
78 while i + pl <= n {
79 var k: i64 = 0
80 var hit: i64 = 1
81 while k < pl { if buf[i+k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } }
82 if hit == 1 { cnt = cnt + 1; i = i + pl } else { i = i + 1 }
83 }
84 return cnt
85}
86func eg_has(path: *u8, pat: *u8) -> i64 {
87 if eg_count(path, pat) > 0 { return 1 }
88 return 0
89}
90func eg_chk(label: *u8, ok: i64, bad: *i64) -> i64 {
91 eg_p("ELG-" as *u8)
92 eg_p(label)
93 if ok == 1 { eg_p(" ok\n" as *u8) } else { eg_p(" BAD\n" as *u8); bad[0] = bad[0] + 1 }
94 return 0
95}
96func main() -> i64 {
97 eg_p("=== EXPRESS-LANE GATE: real elf over scratch dialogue worlds ===\n" as *u8)
98 let ep: i64 = sys_now_realtime_sec()
99 let bad: *i64 = sys_mmap(16) as *i64
100 bad[0] = 0
101 let ti: *u8 = sys_mmap(128)
102 let to: *u8 = sys_mmap(128)
103 let q: *u8 = sys_mmap(128)
104 eg_mkpath(ti, ep, "_in.tsv" as *u8)
105 eg_mkpath(to, ep, "_out.tsv" as *u8)
106 eg_mkpath(q, ep, "_q.tsv" as *u8)
107 eg_writes(q, "# scratch queue\nROW-1\tX\t9\tS\tB\tTODO\t-\tGATEBAR\ttitle one\n" as *u8)
108 eg_writes(ti, "# scratch in\n100\tmodelA\tMARKWIRE\tROW-1\tscratch.log::ANCH::green\n101\tmodelA\tANSWER\tROW-2\troute text here\n" as *u8)
109 // K1 MARKWIRE-APPLIES
110 let r1: i64 = eg_run(ti, to, q, 0)
111 var ok1: i64 = 0
112 if r1 == 0 { if eg_has(q, "||MARK=scratch.log::ANCH::green" as *u8) == 1 { if eg_has(to, "note=mark-applied" as *u8) == 1 { ok1 = 1 } } }
113 eg_chk("MARKWIRE-APPLIES" as *u8, ok1, bad)
114 // K2 EXACTLY-ONCE: re-run -> key appears exactly once in team_out
115 let r2: i64 = eg_run(ti, to, q, 0)
116 var ok2: i64 = 0
117 if r2 == 0 { if eg_count(to, "key=100:MARKWIRE:ROW-1" as *u8) == 1 { ok2 = 1 } }
118 eg_chk("EXACTLY-ONCE" as *u8, ok2, bad)
119 // K3 ANSWER-ACKED
120 var ok3: i64 = 0
121 if eg_count(to, "key=101:ANSWER:ROW-2" as *u8) == 1 { if eg_has(to, "note=received" as *u8) == 1 { ok3 = 1 } }
122 eg_chk("ANSWER-ACKED" as *u8, ok3, bad)
123 // K4 SITREP-PRESENT
124 var ok4: i64 = 0
125 if eg_has(to, "SITREP-END acks=" as *u8) == 1 { if eg_has(to, "queue todo=" as *u8) == 1 { ok4 = 1 } }
126 eg_chk("SITREP-PRESENT" as *u8, ok4, bad)
127 // K5 LIVE
128 let r5: i64 = eg_run(ti, to, q, 1)
129 var ok5: i64 = 0
130 if r5 == 0 { ok5 = 1 }
131 eg_chk("LIVE" as *u8, ok5, bad)
132 // WMS torn-write fix: acquire the SHARED team_out lock (same path express_lane locks) so this
133 // ELGATE row can never interleave into a concurrent express_lane SITREP block. Degrade-gracefully.
134 let elglkp: *u8 = sys_mmap(512)
135 var elglko: i64 = eg_cat(elglkp, 0, "knowledge/channel/team_out.tsv.lock" as *u8); elglkp[elglko] = 0 as u8
136 let elglkfd: i64 = rt_lock(elglkp)
137 let lg: i64 = sys_openat_append("knowledge/channel/team_out.tsv" as *u8, 0x1a4)
138 if lg >= 0 {
139 eg_f(lg, "ELGATE checks=" as *u8)
140 eg_n(lg, 5 - bad[0])
141 eg_f(lg, "/5 verdict=" as *u8)
142 if bad[0] == 0 { eg_f(lg, "GREEN" as *u8) } else { eg_f(lg, "RED" as *u8) }
143 eg_f(lg, " epoch=" as *u8)
144 eg_n(lg, sys_now_realtime_sec())
145 eg_f(lg, "\n" as *u8)
146 sys_close(lg)
147 }
148 if elglkfd >= 0 { rt_unlock(elglkp, elglkfd) }
149 if bad[0] == 0 { eg_p(" ELGATE: GREEN 5/5\n" as *u8); sys_exit(0); return 0 }
150 eg_p(" ELGATE: RED\n" as *u8)
151 sys_exit(1)
152 return 1
153}