code wiki / _hdl_build / _autorun_targets_gate_authored.nx

_autorun_targets_gate_authored.nx source

↩ module page · 137 lines · 4991 B

1// _autorun_targets_gate_authored.nx -- gate for X-Q-007 (slow-beat targets 2// as DATA). No mocks: adc_beat on a SCRATCH conf runs REAL durable-lane 3// targets (the proven toy fixtures). Checks: 4// PARSE-T scratch conf w/ 2 T rows -> adc_targets count==2 5// PARSE-DEFAULT conf w/o T rows -> count==1 + name==nx_math_rung_run 6// (parse-only: the default target is NOT executed here) 7// PARSE-REJECT malformed T row (bad charset) skipped, valid one kept 8// BEAT-RUNS adc_beat on toy conf -> TGT rows green=0 red=7, BEAT row 9// rung_rc=7 targets=2 verdict=ATTENTION (worst-rc law) 10// Markers: ATG-*; final ATGATE row -> knowledge/status/autorun_daemon.log 11// license_tier: ORIGINAL 12 13import "nx_ad_core.nx" 14 15func atg_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 16func atg_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 } 17 18func atg_chk(label: *u8, ok: i64, bad: *i64) -> i64 { 19 atg_p("ATG-" as *u8) 20 atg_p(label) 21 if ok == 1 { atg_p(" ok\n" as *u8) } else { atg_p(" BAD\n" as *u8); bad[0] = bad[0] + 1 } 22 return 0 23} 24 25func atg_write(path: *u8, s: *u8) -> i64 { 26 let fd: i64 = sys_openat_wr(path, 0x1a4) 27 if fd < 0 { return 0 } 28 atg_f(fd, s) 29 // pad: shorter rewrites across runs never leave stale tails (LM-022) 30 var i: i64 = 0 31 while i < 12 { atg_f(fd, "\n" as *u8); i = i + 1 } 32 sys_close(fd) 33 return 1 34} 35 36func atg_streq(a: *u8, b: *u8) -> i64 { 37 var i: i64 = 0 38 while 1 == 1 { 39 if a[i] != b[i] { return 0 } 40 if a[i] == (0 as u8) { return 1 } 41 i = i + 1 42 } 43 return 0 44} 45 46func atg_count(path: *u8, pat: *u8) -> i64 { 47 let buf: *u8 = sys_mmap(262144) 48 let fd: i64 = sys_openat_rd(path) 49 if fd < 0 { return 0 } 50 var n: i64 = 0 51 var r: i64 = sys_read(fd, buf, 262143) 52 while r > 0 { n = n + r; r = sys_read(fd, buf + n, 262143 - n) } 53 sys_close(fd) 54 var pl: i64 = 0 55 while pat[pl] != (0 as u8) { pl = pl + 1 } 56 var c: i64 = 0 57 var i: i64 = 0 58 while i + pl <= n { 59 var k: i64 = 0 60 var hit: i64 = 1 61 while k < pl { 62 if buf[i + k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } 63 } 64 if hit == 1 { c = c + 1 } 65 i = i + 1 66 } 67 return c 68} 69 70func main() -> i64 { 71 let badv: *i64 = sys_mmap(16) as *i64 72 badv[0] = 0 73 atg_p("=== autorun-targets gate (X-Q-007) ===\n" as *u8) 74 let arena: *u8 = sys_mmap(ADC_MAXTGT * ADC_NAMECAP) 75 76 // PARSE-T 77 atg_write("/tmp/_atg_a.conf" as *u8, "I 3600\nT nx_wd_toy_green\nT nx_wd_toy_red\n" as *u8) 78 var c: i64 = 0 79 if adc_targets("/tmp/_atg_a.conf" as *u8, arena) == 2 { 80 if atg_streq(arena, "nx_wd_toy_green" as *u8) == 1 { c = 1 } 81 } 82 atg_chk("PARSE-T" as *u8, c, badv) 83 84 // PARSE-DEFAULT (no T rows; parse only, never executed) 85 atg_write("/tmp/_atg_b.conf" as *u8, "I 3600\n" as *u8) 86 c = 0 87 if adc_targets("/tmp/_atg_b.conf" as *u8, arena) == 1 { 88 if atg_streq(arena, "nx_math_rung_run" as *u8) == 1 { c = 1 } 89 } 90 atg_chk("PARSE-DEFAULT" as *u8, c, badv) 91 92 // PARSE-REJECT (bad charset row skipped, valid kept) 93 atg_write("/tmp/_atg_c.conf" as *u8, "T ../evil path\nT nx_wd_toy_green\n" as *u8) 94 c = 0 95 if adc_targets("/tmp/_atg_c.conf" as *u8, arena) == 1 { 96 if atg_streq(arena, "nx_wd_toy_green" as *u8) == 1 { c = 1 } 97 } 98 atg_chk("PARSE-REJECT" as *u8, c, badv) 99 100 // BEAT-RUNS: real lane, toy targets, scratch logs 101 let blog: *u8 = "/tmp/_atg_beat.log" as *u8 102 let sep: i64 = sys_openat_append(blog, 0x1a4) 103 if sep >= 0 { atg_f(sep, "ATG-RUN-SEPARATOR\n" as *u8); sys_close(sep) } 104 let base_beat: i64 = atg_count(blog, "AUTORUN-BEAT " as *u8) 105 let worst: i64 = adc_beat("/tmp/_atg_a.conf" as *u8, "/tmp/_atg_beat.out" as *u8, blog) 106 c = 0 107 if worst == 7 { 108 if atg_count(blog, "AUTORUN-TGT name=nx_wd_toy_green rc=0" as *u8) >= 1 { 109 if atg_count(blog, "AUTORUN-TGT name=nx_wd_toy_red rc=7" as *u8) >= 1 { 110 if atg_count(blog, "rung_rc=7 targets=2 verdict=ATTENTION" as *u8) >= 1 { 111 if atg_count(blog, "AUTORUN-BEAT " as *u8) - base_beat == 1 { c = 1 } 112 } 113 } 114 } 115 } 116 atg_chk("BEAT-RUNS" as *u8, c, badv) 117 118 let lg: i64 = sys_openat_append("knowledge/status/autorun_daemon.log" as *u8, 0x1a4) 119 var rcg: i64 = 0 120 if badv[0] == 0 { 121 atg_p("ATGATE checks=4/4 verdict=GREEN\n" as *u8) 122 if lg >= 0 { 123 atg_f(lg, "ATGATE checks=4/4 verdict=GREEN epoch=" as *u8) 124 adc_wn(lg, sys_now_realtime_sec()) 125 atg_f(lg, "\n" as *u8) 126 } 127 } else { 128 atg_p("ATGATE verdict=RED bad=" as *u8) 129 adc_wn(1, badv[0]) 130 atg_p("\n" as *u8) 131 if lg >= 0 { atg_f(lg, "ATGATE verdict=RED\n" as *u8) } 132 rcg = badv[0] 133 } 134 if lg >= 0 { sys_close(lg) } 135 sys_exit(rcg) 136 return rcg 137}