code wiki / _hdl_build / _ale_exec_gate.nx

_ale_exec_gate.nx source

↩ module page · 411 lines · 18979 B

1// _ale_exec_gate.nx -- the ALE-R2b gate: sovereign agent-core EXECUTE/dispatch organ. 2// Diff-lane / no-mocks: runs the REAL sovereign planner nx_ale_plan.elf to produce the ordered 3// plan, then the REAL sovereign executor nx_ale_exec.elf (both built nx_cc_sovereign->nxasm_x86_main, 4// NO gcc) over a REAL hello-class ALE fixture, and asserts: 5// (1) STAGE -- stage_input (step 1) copies the input_stage material into the sandbox: 6// the staged file EXISTS and byte-matches the materials_dir source 7// (2) TRANSFORM -- run_organ (step 2) applies the named deterministic transform: the 8// artifact's unit| lines are the transform of the staged kv| lines 9// (3) ARTIFACT -- write_artifact (step 3) produced a REAL non-empty file at artifact_path 10// (4) ORDER/NO-LEAKAGE -- a malformed out-of-order plan is REFUSED, AND the artifact is byte- 11// identical whether a decoy reference is planted in the sandbox or not 12// (the executor never opens the reference path -> no leakage end-to-end) 13// (5) DETERMINISTIC -- two runs on the same (plan,task,fresh sandbox) yield a BYTE-IDENTICAL artifact 14// (6) TAMPER REJECTED -- a plan MISSING write_artifact -> child exits NON-ZERO and writes NO artifact 15// (G) FEEDS GRADER -- nx_ale_grade.elf (ALE-R1a) on the produced artifact + reference scores 1000 16// Evidence -> knowledge/status/ale_exec.log (ALEEXECGATE row; the queue row's ||MARK= reads it). 17// Sovereign orchestration (fork/dup3/execve/wait4 + mkdirat). license_tier: ORIGINAL 18import "nx_syscalls.nx" 19 20func g_p(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 21func g_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 } 22func g_fn(fd: i64, v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m }; let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48; 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 } 23 24// run nx_ale_plan.elf <task> <planout>; return child exit code 25func g_run_plan(task: *u8, planout: *u8) -> i64 { 26 let pid: i64 = sys_fork() 27 if pid == 0 { 28 let dn: i64 = sys_openat_wr("/dev/null" as *u8, 0x1a4) 29 if dn >= 0 { sys_dup3(dn, 1, 0); sys_dup3(dn, 2, 0) } 30 let argv: *i64 = sys_mmap(32) as *i64 31 argv[0] = "_offc/nx_ale_plan.elf" as *u8 as i64 32 argv[1] = task as i64 33 argv[2] = planout as i64 34 argv[3] = 0 35 let envp: *i64 = sys_mmap(16) as *i64 36 envp[0] = 0 37 sys_execve("_offc/nx_ale_plan.elf" as *u8, argv, envp) 38 sys_exit(127) 39 } 40 let st: *i64 = sys_mmap(16) as *i64 41 sys_wait4(pid, st, 0) 42 return (st[0] >> 8) & 0xff 43} 44 45// run nx_ale_exec.elf <plan> <task> <sandbox>; return child exit code 46func g_run_exec(plan: *u8, task: *u8, sandbox: *u8) -> i64 { 47 let pid: i64 = sys_fork() 48 if pid == 0 { 49 let dn: i64 = sys_openat_wr("/dev/null" as *u8, 0x1a4) 50 if dn >= 0 { sys_dup3(dn, 1, 0); sys_dup3(dn, 2, 0) } 51 let argv: *i64 = sys_mmap(48) as *i64 52 argv[0] = "_offc/nx_ale_exec.elf" as *u8 as i64 53 argv[1] = plan as i64 54 argv[2] = task as i64 55 argv[3] = sandbox as i64 56 argv[4] = 0 57 let envp: *i64 = sys_mmap(16) as *i64 58 envp[0] = 0 59 sys_execve("_offc/nx_ale_exec.elf" as *u8, argv, envp) 60 sys_exit(127) 61 } 62 let st: *i64 = sys_mmap(16) as *i64 63 sys_wait4(pid, st, 0) 64 return (st[0] >> 8) & 0xff 65} 66 67// run nx_ale_grade.elf <ref> <artifact> <scoreout>; return child exit code 68func g_run_grade(ref: *u8, art: *u8, scoreout: *u8) -> i64 { 69 let pid: i64 = sys_fork() 70 if pid == 0 { 71 let dn: i64 = sys_openat_wr("/dev/null" as *u8, 0x1a4) 72 if dn >= 0 { sys_dup3(dn, 1, 0); sys_dup3(dn, 2, 0) } 73 let argv: *i64 = sys_mmap(48) as *i64 74 argv[0] = "_offc/nx_ale_grade.elf" as *u8 as i64 75 argv[1] = ref as i64 76 argv[2] = art as i64 77 argv[3] = scoreout as i64 78 argv[4] = 0 79 let envp: *i64 = sys_mmap(16) as *i64 80 envp[0] = 0 81 sys_execve("_offc/nx_ale_grade.elf" as *u8, argv, envp) 82 sys_exit(127) 83 } 84 let st: *i64 = sys_mmap(16) as *i64 85 sys_wait4(pid, st, 0) 86 return (st[0] >> 8) & 0xff 87} 88 89// read whole file into buf (cap), return byte count (0 on open-fail / empty) 90func g_read(path: *u8, buf: *u8, cap: i64) -> i64 { 91 let fd: i64 = sys_openat_rd(path) 92 if fd < 0 { return 0 } 93 var n: i64 = 0 94 var go: i64 = 1 95 while go == 1 { 96 let r: i64 = sys_read(fd, (buf as i64 + n) as *u8, cap - 1 - n) 97 if r <= 0 { go = 0 } else { n = n + r } 98 if n >= cap - 1 { go = 0 } 99 } 100 sys_close(fd) 101 return n 102} 103 104func g_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 105 106// two files byte-identical? 1/0 (both must be non-empty) 107func g_files_eq(pa: *u8, pb: *u8) -> i64 { 108 let ba: *u8 = sys_mmap(262144) 109 let bb: *u8 = sys_mmap(262144) 110 let na: i64 = g_read(pa, ba, 262144) 111 let nb: i64 = g_read(pb, bb, 262144) 112 if na != nb { return 0 } 113 if na == 0 { return 0 } 114 var i: i64 = 0 115 while i < na { if ba[i] != bb[i] { return 0 } i = i + 1 } 116 return 1 117} 118 119// does buf[pos..] match pat (len pl)? 1/0 120func g_match(buf: *u8, n: i64, pos: i64, pat: *u8, pl: i64) -> i64 { 121 if pos + pl > n { return 0 } 122 var k: i64 = 0 123 while k < pl { if buf[pos + k] != pat[k] { return 0 } k = k + 1 } 124 return 1 125} 126 127// is pos a line start? (pos==0 or previous byte is newline) 128func g_is_bol(buf: *u8, pos: i64) -> i64 { 129 if pos == 0 { return 1 } 130 if buf[pos - 1] == (10 as u8) { return 1 } 131 return 0 132} 133 134// does the COMPLETE line `lit` (NUL-terminated, no newline) appear as a complete line in buf? 1/0 135func g_line_in(buf: *u8, n: i64, lit: *u8) -> i64 { 136 let ll: i64 = g_len(lit) 137 var j: i64 = 0 138 while j < n { 139 if g_is_bol(buf, j) == 1 { 140 if g_match(buf, n, j, lit, ll) == 1 { 141 let after: i64 = j + ll 142 if after == n { return 1 } 143 if after < n { if buf[after] == (10 as u8) { return 1 } } 144 } 145 } 146 j = j + 1 147 } 148 return 0 149} 150 151// write n bytes from buf to a fresh file at path. 1/0. 152func g_write_file(path: *u8, buf: *u8, n: i64) -> i64 { 153 let fd: i64 = sys_openat_wr(path, 0x1a4) 154 if fd < 0 { return 0 } 155 if n > 0 { sys_write(fd, buf, n) } 156 sys_close(fd) 157 return 1 158} 159 160func main() -> i64 { 161 let task: *u8 = "knowledge/specs/ale_exec_examples/task_exec.txt" as *u8 162 let materials: *u8 = "knowledge/specs/ale_exec_examples/materials/field_input.txt" as *u8 163 let reference: *u8 = "knowledge/specs/ale_exec_examples/reference.txt" as *u8 164 let planp: *u8 = "/tmp/_aleexec_g_plan" as *u8 165 let sb1: *u8 = "/tmp/_aleexec_g_sb1" as *u8 166 let sb2: *u8 = "/tmp/_aleexec_g_sb2" as *u8 167 let sbdec: *u8 = "/tmp/_aleexec_g_sbdecoy" as *u8 168 let sbbad: *u8 = "/tmp/_aleexec_g_sbbad" as *u8 169 let art1: *u8 = "/tmp/_aleexec_g_sb1/result.units" as *u8 170 let art2: *u8 = "/tmp/_aleexec_g_sb2/result.units" as *u8 171 let artdec: *u8 = "/tmp/_aleexec_g_sbdecoy/result.units" as *u8 172 let artbad: *u8 = "/tmp/_aleexec_g_sbbad/result.units" as *u8 173 let staged1: *u8 = "/tmp/_aleexec_g_sb1/field_input.txt" as *u8 174 let decoyref: *u8 = "/tmp/_aleexec_g_sbdecoy/reference.txt" as *u8 175 let badplan: *u8 = "/tmp/_aleexec_g_badplan" as *u8 176 let scoreout: *u8 = "/tmp/_aleexec_g_score" as *u8 177 178 // ALE-R3a: 2nd transform (copy_verbatim) fixture paths 179 let taskv: *u8 = "knowledge/specs/ale_exec_examples/task_exec_verbatim.txt" as *u8 180 let matv: *u8 = "knowledge/specs/ale_exec_examples/materials/verbatim_units.txt" as *u8 181 let refv: *u8 = "knowledge/specs/ale_exec_examples/reference_verbatim.txt" as *u8 182 let planv: *u8 = "/tmp/_aleexec_g_planv" as *u8 183 let sbv1: *u8 = "/tmp/_aleexec_g_sbv1" as *u8 184 let sbv2: *u8 = "/tmp/_aleexec_g_sbv2" as *u8 185 let sbvdec: *u8 = "/tmp/_aleexec_g_sbvdecoy" as *u8 186 let sbunk: *u8 = "/tmp/_aleexec_g_sbunk" as *u8 187 let artv1: *u8 = "/tmp/_aleexec_g_sbv1/result.copy" as *u8 188 let artv2: *u8 = "/tmp/_aleexec_g_sbv2/result.copy" as *u8 189 let artvdec: *u8 = "/tmp/_aleexec_g_sbvdecoy/result.copy" as *u8 190 let artunk: *u8 = "/tmp/_aleexec_g_sbunk/result.copy" as *u8 191 let stagedv1: *u8 = "/tmp/_aleexec_g_sbv1/verbatim_units.txt" as *u8 192 let decoyrefv: *u8 = "/tmp/_aleexec_g_sbvdecoy/reference_verbatim.txt" as *u8 193 let unkplan: *u8 = "/tmp/_aleexec_g_unkplan" as *u8 194 let scorev: *u8 = "/tmp/_aleexec_g_scorev" as *u8 195 196 g_p("=== ALE-exec gate (ALE-R2b/R3a: sovereign agent-core EXECUTE phase) ===\n" as *u8) 197 198 // fresh sandbox dirs (mkdir is idempotent: -EEXIST is harmless; artifact writes use O_TRUNC) 199 sys_mkdir(sb1, 0x1ed) 200 sys_mkdir(sb2, 0x1ed) 201 sys_mkdir(sbdec, 0x1ed) 202 sys_mkdir(sbbad, 0x1ed) 203 sys_mkdir(sbv1, 0x1ed) 204 sys_mkdir(sbv2, 0x1ed) 205 sys_mkdir(sbvdec, 0x1ed) 206 sys_mkdir(sbunk, 0x1ed) 207 208 // PLAN: produce the ordered plan from the task via the REAL planner (genuine plan->exec link) 209 let rcplan: i64 = g_run_plan(task, planp) 210 211 // EXEC #1 (good): run the executor over the fixture into sb1 212 let rc1: i64 = g_run_exec(planp, task, sb1) 213 // EXEC #2 (determinism): a 2nd fresh run into sb2 214 let rc2: i64 = g_run_exec(planp, task, sb2) 215 216 // (1) STAGE: staged file exists in sb1 AND byte-matches the materials source 217 var c1: i64 = 0 218 if g_files_eq(staged1, materials) == 1 { c1 = 1 } 219 220 // (2) TRANSFORM: the artifact's unit| lines are the transform of the staged kv| lines. 221 // Confirm the four expected unit| lines (kv| -> unit|) are present as complete lines. 222 let abuf: *u8 = sys_mmap(262144) 223 let an: i64 = g_read(art1, abuf, 262144) 224 var c2: i64 = 0 225 if g_line_in(abuf, an, "unit|row_count|3" as *u8) == 1 { 226 if g_line_in(abuf, an, "unit|header|id,name,score" as *u8) == 1 { 227 if g_line_in(abuf, an, "unit|sorted_by|id" as *u8) == 1 { 228 if g_line_in(abuf, an, "unit|checksum|7a1c" as *u8) == 1 { c2 = 1 } 229 } 230 } 231 } 232 233 // (3) ARTIFACT: a real non-empty file at artifact_path under sb1, child exited 0 234 var c3: i64 = 0 235 if rc1 == 0 { if an > 0 { c3 = 1 } } 236 237 // (4) ORDER/NO-LEAKAGE: artifact is byte-identical whether a decoy reference is planted in the 238 // sandbox or not (the executor never opens the reference path). Plant a decoy reference in 239 // sbdec, run there, and compare the produced artifact to sb1's (no-reference) artifact. 240 let refbuf: *u8 = sys_mmap(262144) 241 let refn: i64 = g_read(reference, refbuf, 262144) 242 g_write_file(decoyref, refbuf, refn) 243 let rcdec: i64 = g_run_exec(planp, task, sbdec) 244 var c4: i64 = 0 245 if rcdec == 0 { if g_files_eq(artdec, art1) == 1 { c4 = 1 } } 246 247 // (5) DETERMINISTIC: sb1 and sb2 artifacts byte-identical 248 var c5: i64 = 0 249 if rc1 == 0 { if rc2 == 0 { if g_files_eq(art1, art2) == 1 { c5 = 1 } } } 250 251 // (6) TAMPER REJECTED: a plan MISSING write_artifact -> non-zero exit AND no artifact written. 252 // Author a malformed plan (only stage_input + run_organ, no write_artifact step). 253 let bptxt: *u8 = "step|1|stage_input|field_input.txt\nstep|2|run_organ|extract_kv_to_units go\n" as *u8 254 g_write_file(badplan, bptxt, g_len(bptxt)) 255 let rcbad: i64 = g_run_exec(badplan, task, sbbad) 256 let bbuf: *u8 = sys_mmap(4096) 257 let bn: i64 = g_read(artbad, bbuf, 4096) 258 var c6: i64 = 0 259 if rcbad != 0 { if bn == 0 { c6 = 1 } } 260 261 // (G) FEEDS GRADER: nx_ale_grade on the produced artifact + reference scores 1000 262 let rcg: i64 = g_run_grade(reference, art1, scoreout) 263 let scbuf: *u8 = sys_mmap(64) 264 let scn: i64 = g_read(scoreout, scbuf, 64) 265 var score: i64 = 0 266 var si: i64 = 0 267 while si < scn { 268 if scbuf[si] >= (48 as u8) { if scbuf[si] <= (57 as u8) { score = score * 10 + (scbuf[si] - 48) } } 269 si = si + 1 270 } 271 var cg: i64 = 0 272 if rcg == 0 { if score == 1000 { cg = 1 } } 273 274 // ================= ALE-R3a: data-driven vocabulary + 2nd transform (copy_verbatim) ================= 275 // PLAN the verbatim task via the REAL planner; its instruction leading-token selects copy_verbatim. 276 let rcplanv: i64 = g_run_plan(taskv, planv) 277 // EXEC #1 (good) into sbv1, EXEC #2 (determinism) into sbv2 278 let rcv1: i64 = g_run_exec(planv, taskv, sbv1) 279 let rcv2: i64 = g_run_exec(planv, taskv, sbv2) 280 281 // (7) COPY_VERBATIM ARTIFACT: child exited 0, real non-empty artifact == staged input (identity). 282 let avbuf: *u8 = sys_mmap(262144) 283 let avn: i64 = g_read(artv1, avbuf, 262144) 284 var c7: i64 = 0 285 if rcv1 == 0 { if avn > 0 { if g_files_eq(artv1, stagedv1) == 1 { c7 = 1 } } } 286 // staged file present in sbv1 AND byte-matches the materials source (stage_input ran for transform 2 too) 287 var c7s: i64 = 0 288 if g_files_eq(stagedv1, matv) == 1 { c7s = 1 } 289 290 // (8) FEEDS GRADER (2nd transform): nx_ale_grade(reference_verbatim, artv1) == 1000 -> no regression. 291 let rcgv: i64 = g_run_grade(refv, artv1, scorev) 292 let scvbuf: *u8 = sys_mmap(64) 293 let scvn: i64 = g_read(scorev, scvbuf, 64) 294 var scorev2: i64 = 0 295 var svi: i64 = 0 296 while svi < scvn { 297 if scvbuf[svi] >= (48 as u8) { if scvbuf[svi] <= (57 as u8) { scorev2 = scorev2 * 10 + (scvbuf[svi] - 48) } } 298 svi = svi + 1 299 } 300 var c8: i64 = 0 301 if rcgv == 0 { if scorev2 == 1000 { c8 = 1 } } 302 303 // (9) DETERMINISTIC (2nd transform): sbv1 and sbv2 artifacts byte-identical 304 var c9: i64 = 0 305 if rcv1 == 0 { if rcv2 == 0 { if g_files_eq(artv1, artv2) == 1 { c9 = 1 } } } 306 307 // (10) NO-LEAKAGE (2nd transform): plant a decoy reference in sbvdec, run there, and confirm the 308 // produced artifact is byte-identical to sbv1's -- the executor never opened the reference path. 309 let refvbuf: *u8 = sys_mmap(262144) 310 let refvn: i64 = g_read(refv, refvbuf, 262144) 311 g_write_file(decoyrefv, refvbuf, refvn) 312 let rcvdec: i64 = g_run_exec(planv, taskv, sbvdec) 313 var c10: i64 = 0 314 if rcvdec == 0 { if g_files_eq(artvdec, artv1) == 1 { c10 = 1 } } 315 316 // (11) UNKNOWN-TOKEN REFUSED (data-driven negative control): a plan whose run_organ arg leads with 317 // a token ABSENT from the vocabulary table -> child exits NON-ZERO and writes NO artifact. 318 let uptxt: *u8 = "step|1|stage_input|verbatim_units.txt\nstep|2|run_organ|frobnicate the staged bytes somehow\nstep|3|write_artifact|result.copy\n" as *u8 319 g_write_file(unkplan, uptxt, g_len(uptxt)) 320 let rcunk: i64 = g_run_exec(unkplan, taskv, sbunk) 321 let ubuf: *u8 = sys_mmap(4096) 322 let un: i64 = g_read(artunk, ubuf, 4096) 323 var c11: i64 = 0 324 if rcunk != 0 { if un == 0 { c11 = 1 } } 325 326 g_p(" rc_plan=" as *u8); g_fn(1, rcplan) 327 g_p(" rc_exec=" as *u8); g_fn(1, rc1) 328 g_p(" art_bytes=" as *u8); g_fn(1, an) 329 g_p(" rc_bad=" as *u8); g_fn(1, rcbad) 330 g_p(" bad_art_bytes=" as *u8); g_fn(1, bn) 331 g_p(" score=" as *u8); g_fn(1, score); g_p("\n" as *u8) 332 g_p(" c1_stage=" as *u8); g_fn(1, c1) 333 g_p(" c2_transform=" as *u8); g_fn(1, c2) 334 g_p(" c3_artifact=" as *u8); g_fn(1, c3) 335 g_p(" c4_order_no_leakage=" as *u8); g_fn(1, c4) 336 g_p(" c5_deterministic=" as *u8); g_fn(1, c5) 337 g_p(" c6_tamper_rejected=" as *u8); g_fn(1, c6) 338 g_p(" cg_feeds_grader=" as *u8); g_fn(1, cg) 339 g_p("\n" as *u8) 340 // ALE-R3a diagnostics (2nd transform copy_verbatim, data-driven dispatch) 341 g_p(" [R3a] rc_planv=" as *u8); g_fn(1, rcplanv) 342 g_p(" rc_execv=" as *u8); g_fn(1, rcv1) 343 g_p(" art_copy_bytes=" as *u8); g_fn(1, avn) 344 g_p(" scorev=" as *u8); g_fn(1, scorev2) 345 g_p(" rc_unknown=" as *u8); g_fn(1, rcunk) 346 g_p(" unk_art_bytes=" as *u8); g_fn(1, un); g_p("\n" as *u8) 347 g_p(" [R3a] c7_copy_artifact=" as *u8); g_fn(1, c7) 348 g_p(" c7s_stage=" as *u8); g_fn(1, c7s) 349 g_p(" c8_feeds_grader=" as *u8); g_fn(1, c8) 350 g_p(" c9_deterministic=" as *u8); g_fn(1, c9) 351 g_p(" c10_no_leakage=" as *u8); g_fn(1, c10) 352 g_p(" c11_unknown_refused=" as *u8); g_fn(1, c11) 353 g_p("\n" as *u8) 354 355 var allok: i64 = 1 356 if c1 == 0 { allok = 0 } 357 if c2 == 0 { allok = 0 } 358 if c3 == 0 { allok = 0 } 359 if c4 == 0 { allok = 0 } 360 if c5 == 0 { allok = 0 } 361 if c6 == 0 { allok = 0 } 362 if cg == 0 { allok = 0 } 363 364 // ALE-R3a checks: the rung is GREEN only if BOTH transforms + the data-driven negative control pass. 365 var r3aok: i64 = 1 366 if c7 == 0 { r3aok = 0 } 367 if c7s == 0 { r3aok = 0 } 368 if c8 == 0 { r3aok = 0 } 369 if c9 == 0 { r3aok = 0 } 370 if c10 == 0 { r3aok = 0 } 371 if c11 == 0 { r3aok = 0 } 372 if r3aok == 0 { allok = 0 } 373 374 let lfd: i64 = sys_openat_append("knowledge/status/ale_exec.log" as *u8, 0x1a4) 375 if allok == 1 { 376 g_p("ALEEXECGATE verdict=GREEN (stage transform artifact order+no-leakage deterministic; missing-write_artifact tamper REJECTED; feeds grader score=1000)\n" as *u8) 377 g_p("ALEEXECVOCAB verdict=GREEN (data-driven vocabulary dispatch; copy_verbatim 2nd transform 1000 no-regression; deterministic; no-leakage; UNKNOWN token REFUSED)\n" as *u8) 378 if lfd >= 0 { 379 g_fp(lfd, "ALEEXECGATE verdict=GREEN stage=1 transform=1 artifact=1 order_no_leakage=1 deterministic=1 tamper_rejected=1 feeds_grader=1 score=1000 rung=ALE-R2b epoch=" as *u8) 380 g_fn(lfd, sys_now_realtime_sec()) 381 g_fp(lfd, "\n" as *u8) 382 g_fp(lfd, "ALEEXECVOCAB verdict=GREEN vocab_data_driven=1 copy_verbatim=1 copy_stage=1 copy_feeds_grader=1 score_kv=1000 score_copy=1000 deterministic=1 no_leakage=1 unknown_token_refused=1 both_no_regression=1 rung=ALE-R3a epoch=" as *u8) 383 g_fn(lfd, sys_now_realtime_sec()) 384 g_fp(lfd, "\n" as *u8) 385 sys_close(lfd) 386 } 387 sys_exit(0) 388 return 0 389 } 390 g_p("ALEEXECGATE verdict=RED (a check did not fire)\n" as *u8) 391 if lfd >= 0 { 392 g_fp(lfd, "ALEEXECGATE verdict=RED c1=" as *u8); g_fn(lfd, c1) 393 g_fp(lfd, " c2=" as *u8); g_fn(lfd, c2) 394 g_fp(lfd, " c3=" as *u8); g_fn(lfd, c3) 395 g_fp(lfd, " c4=" as *u8); g_fn(lfd, c4) 396 g_fp(lfd, " c5=" as *u8); g_fn(lfd, c5) 397 g_fp(lfd, " c6=" as *u8); g_fn(lfd, c6) 398 g_fp(lfd, " cg=" as *u8); g_fn(lfd, cg) 399 g_fp(lfd, "\n" as *u8) 400 g_fp(lfd, "ALEEXECVOCAB verdict=RED c7=" as *u8); g_fn(lfd, c7) 401 g_fp(lfd, " c7s=" as *u8); g_fn(lfd, c7s) 402 g_fp(lfd, " c8=" as *u8); g_fn(lfd, c8) 403 g_fp(lfd, " c9=" as *u8); g_fn(lfd, c9) 404 g_fp(lfd, " c10=" as *u8); g_fn(lfd, c10) 405 g_fp(lfd, " c11=" as *u8); g_fn(lfd, c11) 406 g_fp(lfd, " rung=ALE-R3a\n" as *u8) 407 sys_close(lfd) 408 } 409 sys_exit(1) 410 return 1 411}