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}