code wiki / _hdl_build / nx_attempt.nx

nx_attempt.nx source

↩ module page · 121 lines · 4964 B

1// nx_attempt.nx -- the WARDEN's ATTEMPT LOOP v1 (X-Q-003, honest scope): 2// EXECUTE recipe-typed assignments, no session. A queue row whose gate cell 3// carries "||EXEC=<lane-basename>" is a RECIPE: its work is running one organ 4// through the sovereign lane (re-prove an arc, run a census fetch, regenerate 5// an artifact). Each beat: pick the FIRST TODO recipe row with all deps DONE, 6// run the lane on it (output -> knowledge/status/attempts.out), append 7// ATTEMPT id=<id> exec=<basename> rc=<n> 8// to knowledge/status/attempts.log. CLOSURE IS NOT CLAIMED HERE: the row's 9// own ||MARK= evidence closes it via nx_reconcile next step -- attempt 10// executes, evidence judges, reconcile flips (three verbs, three organs). 11// ONE attempt per beat (rule 21: bounded work; the queue drains beat by beat). 12// AUTHORING-type assignments stay NOVEL raised hands -- this loop NEVER 13// pretends to write modules. 14// argv[1] = queue override. 15// license_tier: ORIGINAL 16import "nx_syscalls.nx" 17import "nx_assign_core.nx" 18 19func at_w(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 } 20func at_wn(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;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 } 21 22// extract ||EXEC=<basename> from a gate-cell string; 1 found / 0 not 23func at_exec_of(g: *u8, out: *u8, ocap: i64) -> i64 { 24 var i: i64 = 0 25 while g[i] != (0 as u8) { 26 var hit: i64 = 1 27 let pat: *u8 = "||EXEC=" as *u8 28 var k: i64 = 0 29 while k < 7 { 30 if g[i + k] != pat[k] { hit = 0; k = 7 } else { k = k + 1 } 31 } 32 if hit == 1 { 33 var p: i64 = i + 7 34 var k2: i64 = 0 35 var go: i64 = 1 36 while go == 1 { 37 let c: i64 = g[p] as i64 38 var fin: i64 = 0 39 if c == 0 { fin = 1 } 40 if c == 124 { fin = 1 } // '|' (next suffix) 41 if fin == 1 { go = 0 } else { 42 if k2 < ocap - 1 { out[k2] = c as u8; k2 = k2 + 1 } 43 p = p + 1 44 } 45 } 46 out[k2] = 0 as u8 47 if k2 > 0 { return 1 } 48 return 0 49 } 50 i = i + 1 51 } 52 return 0 53} 54 55// run the sovereign lane on basename, output appended to attempts.out 56func at_lane(base: *u8) -> i64 { 57 let pid: i64 = sys_fork() 58 if pid == 0 { 59 let ofd: i64 = sys_openat_append("knowledge/status/attempts.out" as *u8, 0x1a4) 60 if ofd >= 0 { sys_dup3(ofd, 1, 0); sys_dup3(ofd, 2, 0) } 61 let lane: *u8 = "./_offc/nx_sov_build_run.elf" as *u8 62 let argv: *i64 = sys_mmap(32) as *i64 63 argv[0] = lane as i64 64 argv[1] = base as i64 65 argv[2] = 0 66 let envp: *i64 = sys_mmap(16) as *i64 67 envp[0] = 0 68 sys_execve(lane, argv, envp) 69 sys_exit(127) 70 } 71 let st: *i64 = sys_mmap(16) as *i64 72 sys_wait4(pid, st, 0) 73 if (st[0] % 128) != 0 { return 0 - 1 } 74 return (st[0] >> 8) & 0xff 75} 76 77func main(argc: i64, argv: *i64) -> i64 { 78 var qp: *u8 = "knowledge/registry/assignment_queue.tsv" as *u8 79 if argc >= 2 { qp = argv[1] as *u8 } 80 let cx: *i64 = an_newcx() 81 let rows: i64 = an_load(qp, cx) 82 if rows <= 0 { at_w(1, "ATTEMPT verdict=RED reason=queue-missing\n" as *u8); sys_exit(101) } 83 let st: *i64 = cx[4] as *i64 84 let eb: *u8 = sys_mmap(128) 85 var picked: i64 = 0 - 1 86 var r: i64 = 0 87 while r < rows { 88 if picked < 0 { 89 if st[r] == 84 { // TODO 90 if at_exec_of(an_gate_at(cx, r), eb, 128) == 1 { 91 if an_deps_done(cx, r) == 1 { picked = r } 92 } 93 } 94 } 95 r = r + 1 96 } 97 let lf: i64 = sys_openat_append("knowledge/status/attempts.log" as *u8, 0x1a4) 98 if picked < 0 { 99 at_w(1, "ATTEMPT none-eligible (no TODO recipe rows with deps done) verdict=GREEN\n" as *u8) 100 if lf >= 0 { at_w(lf, "ATTEMPT none-eligible epoch=" as *u8); at_wn(lf, sys_now_realtime_sec()); at_w(lf, "\n" as *u8); sys_close(lf) } 101 sys_exit(0) 102 return 0 103 } 104 let rc: i64 = at_lane(eb) 105 var p: i64 = 0 106 while p < 2 { 107 var fd: i64 = 1 108 if p == 1 { fd = lf } 109 if fd >= 0 { 110 at_w(fd, "ATTEMPT id=" as *u8); at_w(fd, an_id_at(cx, picked)) 111 at_w(fd, " exec=" as *u8); at_w(fd, eb) 112 at_w(fd, " rc=" as *u8); at_wn(fd, rc) 113 at_w(fd, " epoch=" as *u8); at_wn(fd, sys_now_realtime_sec()) 114 if rc == 0 { at_w(fd, " verdict=RAN-GREEN (reconcile judges closure)\n" as *u8) } else { at_w(fd, " verdict=RAN-RED\n" as *u8) } 115 } 116 p = p + 1 117 } 118 if lf >= 0 { sys_close(lf) } 119 sys_exit(0) 120 return 0 121}