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}