code wiki / (root) / nx_forge_repair.nx

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}