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}