nx_forge_repair.nx source
↩ module page · 226 lines · 8587 B
1// nx_forge_repair.nx -- the REPAIR CYCLE for the local coder (2026-07-16): take the best failed candidate
2// (compiled+ran but wrong bytes = the closest miss), feed back ONLY what the MACHINE knows -- the program, the
3// verdict "ran but wrong output", and the exact required output -- and ask the local 1.5B for a corrected
4// program. Judged by the same byte-exact lane; a ledger record (localpass=) is written ONLY on green.
5// Honesty: zero Claude-authored diagnosis in the prompt (no "you used undefined variables" hints); the model
6// gets the same feedback a CI system would give. Rides the disk KV snapshot (minipack prefix cached; only the
7// task+candidate+feedback suffix prefills). This is the autofix stage-4 shape: error -> regenerate.
8// argv: [1]=candidate path (default knowledge/forge/fix/cand_mpT1.nx) [2]=maxnew (default 300)
9// license_tier: ORIGINAL expect_exit: 0 (measurement organ)
10import "nx_nofloat_serve_core.nx"
11import "nx_forge.nx"
12const K_MAGIC_65536: i64 = 65536
13const K_MAGIC_32768: i64 = 32768
14const K_MAGIC_16384: i64 = 16384
15const K_MAGIC_16000: i64 = 16000
16const K_MAGIC_30000: i64 = 30000
17
18func rp_read(path: *u8, buf: *u8, cap: i64) -> i64 {
19 let fd: i64 = sys_openat_rd(path)
20 if fd < 0 { return 0 - 1 }
21 var o: i64 = 0
22 var reading: i64 = 1
23 while reading == 1 {
24 let q: *u8 = buf + o
25 let rem: i64 = cap - 1 - o
26 if rem <= 0 { reading = 0 } else {
27 let r: i64 = sys_read(fd, q, rem)
28 if r <= 0 { reading = 0 } else { o = o + r }
29 }
30 }
31 sys_close(fd)
32 buf[o] = 0 as u8
33 return o
34}
35func rp_cat(buf: *u8, o: i64, s: *u8) -> i64 {
36 var i: i64 = 0
37 var oo: i64 = o
38 while s[i] != (0 as u8) { buf[oo] = s[i]; oo = oo + 1; i = i + 1 }
39 buf[oo] = 0 as u8
40 return oo
41}
42// strip ```fences (idempotent)
43func rp_strip(src: *u8, n: i64, out: *u8) -> i64 {
44 var f0: i64 = 0 - 1
45 var i: i64 = 0
46 let stop: i64 = n - 3
47 while i <= stop {
48 let c0: i64 = src[i] as i64
49 let c1: i64 = src[i + 1] as i64
50 let c2: i64 = src[i + 2] as i64
51 if c0 == 96 && c1 == 96 && c2 == 96 { f0 = i; i = stop + 1 }
52 if f0 < 0 { i = i + 1 }
53 }
54 if f0 < 0 {
55 var k: i64 = 0
56 while k < n { out[k] = src[k]; k = k + 1 }
57 out[n] = 0 as u8
58 return n
59 }
60 var cs: i64 = f0 + 3
61 var sc: i64 = 1
62 while sc == 1 {
63 if cs >= n { sc = 0 }
64 if sc == 1 {
65 let c: i64 = src[cs] as i64
66 cs = cs + 1
67 if c == 10 { sc = 0 }
68 }
69 }
70 var f1: i64 = n
71 var j: i64 = cs
72 let stop2: i64 = n - 3
73 while j <= stop2 {
74 let d0: i64 = src[j] as i64
75 let d1: i64 = src[j + 1] as i64
76 let d2: i64 = src[j + 2] as i64
77 if d0 == 96 && d1 == 96 && d2 == 96 { f1 = j; j = stop2 + 1 }
78 if f1 == n { j = j + 1 }
79 }
80 var o: i64 = 0
81 var p: i64 = cs
82 while p < f1 { out[o] = src[p]; o = o + 1; p = p + 1 }
83 out[o] = 0 as u8
84 return o
85}
86func rp_write(path: *u8, buf: *u8, n: i64) -> i64 {
87 let fd: i64 = sys_openat_wr(path, 420)
88 if fd < 0 { return 0 - 1 }
89 var off: i64 = 0
90 while off < n {
91 let q: *u8 = buf + off
92 let wr: i64 = sys_write(fd, q, n - off)
93 if wr <= 0 { off = n }
94 if wr > 0 { off = off + wr }
95 }
96 sys_close(fd)
97 return n
98}
99
100func main(argc: i64, argv: *i64) -> i64 {
101 var candpath: *u8 = "knowledge/forge/fix/cand_mpT1.nx" as *u8
102 var mxn: i64 = 300
103 if argc >= 2 {
104 let a1: i64 = argv[1]
105 candpath = a1 as *u8
106 }
107 if argc >= 3 {
108 let a2: i64 = argv[2]
109 let arg2: *u8 = a2 as *u8
110 var mv: i64 = 0
111 var mi: i64 = 0
112 while arg2[mi] != (0 as u8) { let dd: i64 = arg2[mi] as i64; if dd >= 48 { if dd <= 57 { mv = mv*10 + (dd-48) } } mi = mi + 1 }
113 if mv > 0 { mxn = mv }
114 }
115 std_putln("REPAIR CYCLE: failed candidate + machine feedback -> corrected program (1.5B, byte-exact judged)" as *u8)
116
117 // prompt = minipack + task + previous program + machine feedback
118 let pbuf: *u8 = sys_mmap(K_MAGIC_65536) as *u8
119 var plen: i64 = rp_read("knowledge/forge/nishilang_pack_mini_v1.txt" as *u8, pbuf, K_MAGIC_32768)
120 if plen < 1000 {
121 std_putln("PACK READ FAIL" as *u8)
122 sys_exit(1)
123 return 1
124 }
125 plen = rp_cat(pbuf, plen, "\nTASK: print EXACTLY this line then exit 0:\nFBENCH-T1 fib10=55 sum100=5050\n(fib(10), fib(1)=fib(2)=1; sum 1..100.)\n\nYour previous program:\n" as *u8)
126 let cbuf: *u8 = sys_mmap(K_MAGIC_16384) as *u8
127 let cn: i64 = rp_read(candpath, cbuf, K_MAGIC_16000)
128 if cn <= 0 {
129 std_putln("CANDIDATE READ FAIL" as *u8)
130 sys_exit(1)
131 return 1
132 }
133 plen = rp_cat(pbuf, plen, cbuf)
134 plen = rp_cat(pbuf, plen, "\nJUDGE RESULT: your program compiled and ran but printed the WRONG output. It must print EXACTLY:\nFBENCH-T1 fib10=55 sum100=5050\nRewrite the COMPLETE corrected NishiLang program. Every variable must be declared before use. One stmt per line. Output ONLY source.\n" as *u8)
135 std_puts("prompt bytes=" as *u8)
136 std_pdec(plen)
137 std_puts("\n" as *u8)
138
139 let ir: i64 = nsv_init_i8("/home/elderwesto/nx_stage/nx_coder15_model.gguf\x00" as *u8)
140 if ir != 0 {
141 std_puts("init FAIL rc=" as *u8)
142 std_pdec(ir)
143 std_puts("\n" as *u8)
144 sys_exit(1)
145 return 1
146 }
147
148 let outb: *u8 = sys_mmap(K_MAGIC_16384) as *u8
149 let cand: *u8 = sys_mmap(K_MAGIC_16384) as *u8
150 let meta: *i64 = sys_mmap(64) as *i64
151 let gp: *i64 = sys_mmap(128) as *i64
152 let neg: i64 = 0 - 1
153 gp[0] = pbuf as i64
154 gp[1] = plen
155 gp[2] = mxn
156 gp[3] = 1 // i8 fast (judge-side soundness)
157 gp[4] = outb as i64
158 gp[5] = K_MAGIC_16384
159 gp[6] = meta as i64
160 gp[7] = 1 // STREAM generation to stdout -> the log GROWS during gen = watcher liveness signal
161 gp[8] = 0 // GREEDY: repair should be the model's best single answer, not a roll
162 gp[9] = 0
163 gp[10] = 0
164 gp[11] = 1
165 gp[12] = 1 // chatml
166 // ride the disk snapshot if present (minipack prefix identical; boundary-safe common-prefix handles the rest)
167 let lr: i64 = nsv_kv_snapshot_load("/home/elderwesto/nx_stage/bestof_kvsnap.bin" as *u8)
168 std_puts("snapshot load rc=" as *u8)
169 std_pdec(lr)
170 std_puts("\n" as *u8)
171 var usnap: i64 = 0
172 if lr > 0 { usnap = 1 }
173 let tl: i64 = nsv_generate_pfx(gp, K_MAGIC_30000, usnap)
174 std_puts("REPAIR gen ngen=" as *u8)
175 std_pdec(meta[1])
176 std_puts(" ms=" as *u8)
177 std_pdec(meta[2])
178 var cl: i64 = 0
179 if tl > 0 { cl = rp_strip(outb, tl, cand) }
180 std_puts(" candlen=" as *u8)
181 std_pdec(cl)
182 std_puts("\n" as *u8)
183 var green: i64 = 0
184 if cl > 40 {
185 rp_write("knowledge/forge/fix/cand_rep_t1.nx" as *u8, cand, cl)
186 let jr: i64 = fg_run("knowledge/forge/fix/spec_rep1.txt" as *u8)
187 std_puts("judge_rc=" as *u8)
188 std_pdec(jr)
189 if jr > 0 {
190 green = 1
191 std_putln(" *** GREEN -- the local coder REPAIRED its own program ***" as *u8)
192 } else {
193 std_putln(" (repair missed -- banked as curriculum)" as *u8)
194 }
195 } else {
196 std_putln("(too short, no judge)" as *u8)
197 }
198
199 if green == 1 {
200 let ts: i64 = sys_now_realtime_sec()
201 let rec: *u8 = sys_mmap(256) as *u8
202 var ro: i64 = 0
203 ro = rp_cat(rec, ro, "CGB ts=" as *u8)
204 var m: i64 = ts
205 let tb: *u8 = sys_mmap(24) as *u8
206 var tk: i64 = 0
207 while m > 0 { tb[tk] = (48 + (m % 10)) as u8; m = m / 10; tk = tk + 1 }
208 var ti: i64 = tk - 1
209 while ti >= 0 { rec[ro] = tb[ti]; ro = ro + 1; ti = ti - 1 }
210 ro = rp_cat(rec, ro, " generator=15b-repair-cycle tasks=1 localpass=1\n" as *u8)
211 let olb: *i64 = sys_mmap(8) as *i64
212 let old: *u8 = sys_read_file("/home/elderwesto/nx_stage/codegen_bench_ledger.log" as *u8, olb)
213 let full: *u8 = sys_mmap(K_MAGIC_65536) as *u8
214 var wo: i64 = 0
215 if (old as i64) != 0 {
216 var z: i64 = 0
217 while z < olb[0] { full[wo] = old[z]; wo = wo + 1; z = z + 1 }
218 }
219 var z2: i64 = 0
220 while z2 < ro { full[wo] = rec[z2]; wo = wo + 1; z2 = z2 + 1 }
221 let lfd: i64 = sys_openat_wr("/home/elderwesto/nx_stage/codegen_bench_ledger.log" as *u8, 0x1a4)
222 if lfd >= 0 { sys_write(lfd, full, wo); sys_close(lfd); std_putln("ledger record appended (localpass=1)" as *u8) }
223 }
224 sys_exit(0)
225 return 0
226}