code wiki / (root) / nx_gfx_gates_beat.nx

nx_gfx_gates_beat.nx source

↩ module page · 102 lines · 4097 B

1// nx_gfx_gates_beat.nx -- THE ROSTER BEAT for the 2026-08-12 graphics/procgen gate set (the wiring half of 2// debt 1786563155): a gate nobody re-runs is a comment; this beat runs the rostered gates on the clock so 3// EROSION is visible. Each gate journals itself (gv_journal -> knowledge/status/harness.jrnl), so fleet 4// publishing is DERIVED; this organ appends its own one-line-per-gate summary to 5// knowledge/status/gfxgates.jrnl (epoch TAB gfxgates TAB gate TAB verdict TAB exit). 6// Composes gk_run_capture_ms (the estate's bounded runner -- the pipe-deadline and watchdog lessons live 7// THERE, never re-implemented). An ABSENT gate elf is REPORTED, never silently skipped. Verdict classes: 8// GREEN(0) SKIP(3, tolerated -- gv_need preconditions) RED(other) ABSENT(no elf). 9// exit 0 = no RED/ABSENT; exit 1 otherwise. license_tier: ORIGINAL expect_exit: 0 10import "nx_syscalls.nx" 11import "nx_gatekit_lib.nx" 12 13const GXB_MS: i64 = 60000 14const GXB_CAP: i64 = 65536 15const GXB_MODE: i64 = 0x1a4 16const GXB_TAB: i64 = 9 17const GXB_NL: i64 = 10 18 19func gxb_s(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 20func gxb_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64 = 0; var p: i64 = o; while s[i] != (0 as u8) { d[p] = s[i]; p = p + 1; i = i + 1 } return p } 21func gxb_catn(d: *u8, o: i64, v: i64) -> i64 { 22 var p: i64 = o 23 var m: i64 = v 24 if m < 0 { d[p] = 45 as u8; p = p + 1; m = 0 - m } 25 if m == 0 { d[p] = 48 as u8; return p + 1 } 26 let t: *u8 = sys_mmap(32) 27 var k: i64 = 0 28 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 29 var i: i64 = 0 30 while i < k { d[p] = t[k-1-i]; p = p + 1; i = i + 1 } 31 return p 32} 33 34// run one gate; append its journal line; 0 = GREEN/SKIP, 1 = RED/ABSENT 35func gxb_one(name: *u8, jfd: i64) -> i64 { 36 let p: *u8 = sys_mmap(256) 37 var o: i64 = gxb_cat(p, 0, "./" as *u8) 38 o = gxb_cat(p, o, name) 39 o = gxb_cat(p, o, ".elf" as *u8) 40 p[o] = 0 as u8 41 var absent: i64 = 1 42 let fd: i64 = sys_openat_rd(p) 43 if fd >= 0 { absent = 0; sys_close(fd) } 44 var ec: i64 = 127 45 if absent == 0 { 46 let ob: *u8 = sys_mmap(GXB_CAP) 47 let ol: *i64 = sys_mmap(16) as *i64 48 ec = gk_run_capture_ms(p, 0 as *u8, 0 as *u8, 0 as *u8, 0 as *u8, GXB_MS, ob, GXB_CAP, ol) 49 } 50 var vname: *u8 = "RED" as *u8 51 if ec == 0 { vname = "GREEN" as *u8 } 52 if ec == 3 { vname = "SKIP" as *u8 } 53 if absent == 1 { vname = "ABSENT" as *u8 } 54 let ln: *u8 = sys_mmap(512) 55 var lo: i64 = gxb_catn(ln, 0, sys_now_realtime_sec()) 56 ln[lo] = GXB_TAB as u8 57 lo = lo + 1 58 lo = gxb_cat(ln, lo, "gfxgates" as *u8) 59 ln[lo] = GXB_TAB as u8 60 lo = lo + 1 61 lo = gxb_cat(ln, lo, name) 62 ln[lo] = GXB_TAB as u8 63 lo = lo + 1 64 lo = gxb_cat(ln, lo, vname) 65 ln[lo] = GXB_TAB as u8 66 lo = lo + 1 67 lo = gxb_cat(ln, lo, "exit=" as *u8) 68 lo = gxb_catn(ln, lo, ec) 69 ln[lo] = GXB_NL as u8 70 lo = lo + 1 71 if jfd >= 0 { sys_write(jfd, ln, lo) } 72 sys_write(1, ln, lo) 73 if ec == 0 { return 0 } 74 if ec == 3 { return 0 } 75 return 1 76} 77 78func main() -> i64 { 79 let jfd: i64 = sys_openat_append("knowledge/status/gfxgates.jrnl" as *u8, GXB_MODE) 80 var bad: i64 = 0 81 bad = bad + gxb_one("nx_gltf_load_gate" as *u8, jfd) 82 bad = bad + gxb_one("nx_nxa_texc_gate" as *u8, jfd) 83 bad = bad + gxb_one("nx_nxa_texbake_gate" as *u8, jfd) 84 bad = bad + gxb_one("nx_part_solver_gate" as *u8, jfd) 85 bad = bad + gxb_one("nx_canon_solver_gate" as *u8, jfd) 86 bad = bad + gxb_one("nx_world_recipe_gate" as *u8, jfd) 87 bad = bad + gxb_one("nx_jslogic_census" as *u8, jfd) 88 bad = bad + gxb_one("nx_clipcheck_gate" as *u8, jfd) 89 if jfd >= 0 { sys_close(jfd) } 90 if bad > 0 { 91 gxb_s("GFX-GATES-BEAT RED bad=" as *u8) 92 let b2: *u8 = sys_mmap(32) 93 let n2: i64 = gxb_catn(b2, 0, bad) 94 sys_write(1, b2, n2) 95 gxb_s("\n" as *u8) 96 sys_exit(1) 97 return 1 98 } 99 gxb_s("GFX-GATES-BEAT GREEN: every rostered gate re-ran on the clock\n" as *u8) 100 sys_exit(0) 101 return 0 102}