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}