code wiki / _hdl_build / _autonomy_meter_gate_authored.nx
_autonomy_meter_gate_authored.nx source
↩ module page · 142 lines · 6620 B
1// _autonomy_meter_gate_authored.nx -- gate for X-AUT-002. Drives the REAL meter elf
2// over epoch-unique scratch ledgers with KNOWN ratios (a meter you cannot verify is
3// worse than no meter):
4// K1 KNOWN-RATIOS 4 DONE rows (2 MARKed) + 4 PULSE-RUNs + 2 DAEMON-BEATs + 1 ENG
5// DONE (0 MARK) -> a1=500 a3=500 a4=0 permil=250 grade=D in the row
6// K2 EMPTY-WORLD empty ledgers -> all axes 0, permil=0, grade=F, exit STILL 0
7// (measuring a bad grade is success; failing to measure is failure)
8// K3 LIVE real ledgers -> exit 0 + AUTMETER row appended
9// Markers: AMG-*; final AMGATE row -> knowledge/status/autonomy_meter.log
10// license_tier: ORIGINAL
11import "nx_syscalls.nx"
12func ag_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
13func ag_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 }
14func ag_n(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;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 }
15func ag_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
16func ag_cat(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { dst[off+i] = s[i]; i = i + 1 } return off + i }
17func ag_numcat(dst: *u8, off: i64, v: i64) -> i64 {
18 let t: *u8 = sys_mmap(28)
19 var m: i64 = v
20 var k: i64 = 0
21 if m == 0 { t[0] = 48 as u8; k = 1 }
22 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
23 var i: i64 = 0
24 var o: i64 = off
25 while i < k { dst[o] = t[k-1-i]; o = o + 1; i = i + 1 }
26 return o
27}
28func ag_mkpath(dst: *u8, epoch: i64, suffix: *u8) -> i64 {
29 var o: i64 = ag_cat(dst, 0, "/tmp/amg_" as *u8)
30 o = ag_numcat(dst, o, epoch)
31 o = ag_cat(dst, o, suffix)
32 dst[o] = 0 as u8
33 return o
34}
35func ag_writes(path: *u8, s: *u8) -> i64 {
36 let fd: i64 = sys_openat_wr(path, 0x1a4)
37 if fd < 0 { return 0 }
38 sys_write(fd, s, ag_len(s))
39 sys_close(fd)
40 return 1
41}
42func ag_run(qp: *u8, plp: *u8, dlp: *u8, olp: *u8) -> i64 {
43 let pid: i64 = sys_fork()
44 if pid == 0 {
45 let dn: i64 = sys_openat_wr("/dev/null" as *u8, 0x1a4)
46 if dn >= 0 { sys_dup3(dn, 1, 0); sys_dup3(dn, 2, 0) }
47 let argv: *i64 = sys_mmap(56) as *i64
48 argv[0] = "/tmp/nx_autonomy_meter.sov.elf" as *u8 as i64
49 argv[1] = qp as i64
50 argv[2] = plp as i64
51 argv[3] = dlp as i64
52 argv[4] = olp as i64
53 argv[5] = 0
54 let envp: *i64 = sys_mmap(16) as *i64
55 envp[0] = 0
56 sys_execve("/tmp/nx_autonomy_meter.sov.elf" as *u8, argv, envp)
57 sys_exit(127)
58 }
59 let st: *i64 = sys_mmap(16) as *i64
60 sys_wait4(pid, st, 0)
61 if (st[0] % 128) != 0 { return 0 - 1 }
62 return (st[0] >> 8) & 0xff
63}
64func ag_has(path: *u8, pat: *u8) -> i64 {
65 let buf: *u8 = sys_mmap(262144)
66 let fd: i64 = sys_openat_rd(path)
67 if fd < 0 { return 0 }
68 var n: i64 = 0
69 var go: i64 = 1
70 while go == 1 { let base: i64 = buf as i64; let r: i64 = sys_read(fd, (base + n) as *u8, 262128 - n); if r <= 0 { go = 0 } else { n = n + r } if n >= 262128 { go = 0 } }
71 sys_close(fd)
72 let pl: i64 = ag_len(pat)
73 if pl == 0 { return 0 }
74 var i: i64 = 0
75 while i + pl <= n {
76 var k: i64 = 0
77 var hit: i64 = 1
78 while k < pl { if buf[i+k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } }
79 if hit == 1 { return 1 }
80 i = i + 1
81 }
82 return 0
83}
84func ag_chk(label: *u8, ok: i64, bad: *i64) -> i64 {
85 ag_p("AMG-" as *u8)
86 ag_p(label)
87 if ok == 1 { ag_p(" ok\n" as *u8) } else { ag_p(" BAD\n" as *u8); bad[0] = bad[0] + 1 }
88 return 0
89}
90func main() -> i64 {
91 ag_p("=== AUTONOMY-METER GATE: a meter you cannot verify is worse than no meter ===\n" as *u8)
92 let ep: i64 = sys_now_realtime_sec()
93 let bad: *i64 = sys_mmap(16) as *i64
94 bad[0] = 0
95 let q1: *u8 = sys_mmap(128)
96 let p1: *u8 = sys_mmap(128)
97 let d1: *u8 = sys_mmap(128)
98 let o1: *u8 = sys_mmap(128)
99 let q2: *u8 = sys_mmap(128)
100 let o2: *u8 = sys_mmap(128)
101 ag_mkpath(q1, ep, "_q1.tsv" as *u8)
102 ag_mkpath(p1, ep, "_p1.log" as *u8)
103 ag_mkpath(d1, ep, "_d1.log" as *u8)
104 ag_mkpath(o1, ep, "_o1.log" as *u8)
105 ag_mkpath(q2, ep, "_q2.tsv" as *u8)
106 ag_mkpath(o2, ep, "_o2.log" as *u8)
107 // K1 world: 4 DONE (2 MARK) + 1 ENG DONE no-mark; 4 runs, 2 daemon
108 ag_writes(q1, "# q\nA-1\tX\t9\tS\tB\tDONE\t-\tg||MARK=x::y::z\tt\nA-2\tX\t9\tS\tB\tDONE\t-\tg||MARK=x::y::z\tt\nA-3\tX\t9\tS\tB\tDONE\t-\tg\tt\nENG-T\tX\t8\tM\tD\tDONE\t-\tg\tt\n" as *u8)
109 ag_writes(p1, "PULSE-RUN epoch=1\nPULSE-RUN epoch=2\nPULSE-RUN epoch=3\nPULSE-RUN epoch=4\n" as *u8)
110 ag_writes(d1, "DAEMON-BEAT epoch=1 pulse_rc=0\nDAEMON-BEAT epoch=2 pulse_rc=1\n" as *u8)
111 let r1: i64 = ag_run(q1, p1, d1, o1)
112 var ok1: i64 = 0
113 // v2 damping: n=4 worlds -> axis*4/5 (a1 500->400, a3 500->400), permil 200
114 if r1 == 0 { if ag_has(o1, "a1_judged_done=400" as *u8) == 1 { if ag_has(o1, "a3_daemon_runs=400" as *u8) == 1 { if ag_has(o1, "permil=200" as *u8) == 1 { if ag_has(o1, "grade=D" as *u8) == 1 { ok1 = 1 } } } } }
115 ag_chk("KNOWN-RATIOS" as *u8, ok1, bad)
116 // K2 world: empty-ish ledgers -> all zero, grade F, exit 0
117 ag_writes(q2, "# empty queue\n" as *u8)
118 let r2: i64 = ag_run(q2, q2, q2, o2)
119 var ok2: i64 = 0
120 if r2 == 0 { if ag_has(o2, "permil=0" as *u8) == 1 { if ag_has(o2, "grade=F" as *u8) == 1 { ok2 = 1 } } }
121 ag_chk("EMPTY-WORLD-F" as *u8, ok2, bad)
122 // K3 live
123 let r3: i64 = ag_run("knowledge/registry/assignment_queue.tsv" as *u8, "knowledge/status/team_pulse.log" as *u8, "knowledge/status/pulse_daemon.log" as *u8, "knowledge/status/autonomy_meter.log" as *u8)
124 var ok3: i64 = 0
125 if r3 == 0 { ok3 = 1 }
126 ag_chk("LIVE" as *u8, ok3, bad)
127 let lg: i64 = sys_openat_append("knowledge/status/autonomy_meter.log" as *u8, 0x1a4)
128 if lg >= 0 {
129 ag_f(lg, "AMGATE checks=" as *u8)
130 ag_n(lg, 3 - bad[0])
131 ag_f(lg, "/3 verdict=" as *u8)
132 if bad[0] == 0 { ag_f(lg, "GREEN" as *u8) } else { ag_f(lg, "RED" as *u8) }
133 ag_f(lg, " epoch=" as *u8)
134 ag_n(lg, sys_now_realtime_sec())
135 ag_f(lg, "\n" as *u8)
136 sys_close(lg)
137 }
138 if bad[0] == 0 { ag_p(" AMGATE: GREEN 3/3\n" as *u8); sys_exit(0); return 0 }
139 ag_p(" AMGATE: RED\n" as *u8)
140 sys_exit(1)
141 return 1
142}