code wiki / _hdl_build / nx_worldgen_tuner.nx

nx_worldgen_tuner.nx source

↩ module page · 270 lines · 12125 B

1// nx_worldgen_tuner.nx -- TEAM-OWNED verdict-targeted knob tuner 2// (operator 2026-06-10 "build the team's capabilities to handle your 3// callouts"). The refine loop auto-files a verdict row NAMING a weak 4// axis; this organ picks that assignment up MECHANICALLY: 5// 6// read knowledge/status/worldgen_best.conf (preset, density, axis) 7// coordinate-descend the generator's exposed knobs 8// (river_depth, rill_depth, rill_radius, detail_amp) 9// score = (worst-of-seeds grade, named-axis value) lexicographic 10// bank winner -> knowledge/status/worldgen_knobs.conf (+ /tmp copy) 11// on banked-knobs CHANGE -> auto-file one arc=PROCGEN pm row 12// 13// nx_worldgen_refine consumes the banked knobs each beat, so the tuned 14// metric IS the gate metric. Verdict -> assignment -> tune -> re-verdict: 15// the loop is closed with the 8-axis grader as referee, no LLM anywhere. 16// 17// TUNER lines -> stdout + /tmp/nishi_worldgen_tuner.log. 18// Exit 0 = tuned (banked best >= starting score), 1 = regression refused. 19// license_tier: ORIGINAL 20import "nx_syscalls.nx" 21import "nx_tier.nx" 22import "nx_worldgen_tunelib.nx" 23const K_MAGIC_1024: i64 = 1024 24const K_MAGIC_1228: i64 = 1228 25const K_MAGIC_1433: i64 = 1433 26const K_MAGIC_4096: i64 = 4096 27const K_MAGIC_4095: i64 = 4095 28 29func tn_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 30func tn_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 } 31func tn_cat_n(dst: *u8, off: i64, v: i64) -> i64 { 32 var o: i64 = off 33 var m: i64 = v 34 if m < 0 { dst[o] = 45; o = o + 1; m = 0 - m } 35 let t: *u8 = sys_mmap(28) 36 var k: i64 = 0 37 if m == 0 { t[0] = 48; k = 1 } 38 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 } 39 var i: i64 = 0 40 while i < k { dst[o+i] = t[k-1-i]; i = i + 1 } 41 return o + k 42} 43 44// grid tables (DATA -- a new knob = one row here + one tl_ slot) 45func tn_grid_len(knob: i64) -> i64 { 46 if knob == TL_K_RIVER_DEPTH { return 4 } 47 if knob == TL_K_RILL_DEPTH { return 5 } 48 if knob == TL_K_RILL_RADIUS { return 5 } 49 if knob == TL_K_PEAKS_EXTRA { return 3 } 50 if knob == TL_K_AMP_BOOST { return 3 } 51 if knob == TL_K_TERRACE { return 4 } 52 return 4 // detail_amp 53} 54func tn_grid_val(knob: i64, i: i64) -> i64 { 55 if knob == TL_K_RIVER_DEPTH { 56 if i == 0 { return 60 } 57 if i == 1 { return 90 } 58 if i == 2 { return 120 } 59 return 150 60 } 61 if knob == TL_K_RILL_DEPTH { 62 if i == 0 { return 0 } 63 if i == 1 { return 30 } 64 if i == 2 { return 45 } 65 if i == 3 { return 60 } 66 return 90 67 } 68 if knob == TL_K_RILL_RADIUS { 69 if i == 0 { return 3 } 70 if i == 1 { return 4 } 71 if i == 2 { return 6 } 72 if i == 3 { return 8 } 73 return 12 // sparse-deep drainage (gen-3: 74 } // density, not depth, kills read 75 if knob == TL_K_PEAKS_EXTRA { 76 if i == 0 { return 0 } 77 if i == 1 { return 1 } 78 return 2 79 } 80 if knob == TL_K_AMP_BOOST { 81 if i == 0 { return K_MAGIC_1024 } 82 if i == 1 { return K_MAGIC_1228 } // 1.2x 83 return K_MAGIC_1433 // 1.4x 84 } 85 if knob == TL_K_TERRACE { 86 if i == 0 { return 0 } // smooth faces 87 if i == 1 { return 3 } 88 if i == 2 { return 4 } 89 return 6 90 } 91 if i == 0 { return 0 } 92 if i == 1 { return 60 } 93 if i == 2 { return 100 } 94 return 140 95} 96 97func tn_report(logfd: i64, tag: *u8, ts: i64, knobs: *i64, grade: i64, 98 axis: i64, axisval: i64) -> i64 { 99 let line: *u8 = sys_mmap(512) 100 var o: i64 = 0 101 o = tn_cat(line, o, "TUNER ts=" as *u8); o = tn_cat_n(line, o, ts) 102 o = tn_cat(line, o, " " as *u8); o = tn_cat(line, o, tag) 103 o = tn_cat(line, o, " river_depth=" as *u8); o = tn_cat_n(line, o, knobs[TL_K_RIVER_DEPTH]) 104 o = tn_cat(line, o, " rill_depth=" as *u8); o = tn_cat_n(line, o, knobs[TL_K_RILL_DEPTH]) 105 o = tn_cat(line, o, " rill_radius=" as *u8); o = tn_cat_n(line, o, knobs[TL_K_RILL_RADIUS]) 106 o = tn_cat(line, o, " detail_amp=" as *u8); o = tn_cat_n(line, o, knobs[TL_K_DETAIL_AMP]) 107 o = tn_cat(line, o, " peaks_extra=" as *u8); o = tn_cat_n(line, o, knobs[TL_K_PEAKS_EXTRA]) 108 o = tn_cat(line, o, " amp_boost=" as *u8); o = tn_cat_n(line, o, knobs[TL_K_AMP_BOOST]) 109 o = tn_cat(line, o, " terrace=" as *u8); o = tn_cat_n(line, o, knobs[TL_K_TERRACE]) 110 o = tn_cat(line, o, " grade=" as *u8); o = tn_cat(line, o, tl_grade_name(grade)) 111 o = tn_cat(line, o, " axis=" as *u8); o = tn_cat(line, o, tl_refine_name(axis)) 112 o = tn_cat(line, o, " axisval=" as *u8); o = tn_cat_n(line, o, axisval) 113 o = tn_cat(line, o, "\n" as *u8) 114 sys_write(1, line, o) 115 if logfd >= 0 { sys_write(logfd, line, o) } 116 return 0 117} 118 119func main() -> i64 { 120 let logfd: i64 = sys_openat_append("/tmp/nishi_worldgen_tuner.log" as *u8, 0x1a4) 121 let ts: i64 = sys_now_realtime_sec() 122 123 // the ASSIGNMENT: banked verdict (preset, density, named axis) 124 let vb: *u8 = sys_mmap(K_MAGIC_4096) 125 let vn: i64 = tl_read_file("knowledge/status/worldgen_best.conf" as *u8, vb, K_MAGIC_4095) 126 var preset: i64 = 0 127 var density: i64 = K_MAGIC_1024 128 var axis: i64 = NX_WQG_REFINE_ADD_DETAIL 129 if vn > 0 { 130 preset = tl_conf_get(vb, vn, "preset" as *u8, preset) 131 density = tl_conf_get(vb, vn, "density_q10" as *u8, density) 132 axis = tl_conf_get_refine(vb, vn, axis) 133 } 134 135 // starting point: banked knobs (or preset-table defaults) 136 let knobs: *i64 = sys_mmap(TL_K_COUNT * 8) as *i64 137 tl_load_knobs("knowledge/status/worldgen_knobs.conf" as *u8, preset, knobs) 138 139 let out12: *i64 = sys_mmap(8 * 12) as *i64 140 var best_grade: i64 = tl_eval(preset, density, knobs, out12) 141 var best_score: i64 = tl_score(best_grade, out12, axis) 142 let start_score: i64 = best_score 143 tn_report(logfd, "START" as *u8, ts, knobs, best_grade, axis, tl_axis_value(out12, axis)) 144 145 // coordinate descent, 2 passes 146 var pass: i64 = 0 147 while pass < 2 { 148 var knob: i64 = 0 149 while knob < TL_K_COUNT { 150 let keep: i64 = knobs[knob] 151 var best_val: i64 = keep 152 var gi: i64 = 0 153 while gi < tn_grid_len(knob) { 154 let cand: i64 = tn_grid_val(knob, gi) 155 if cand != keep { 156 knobs[knob] = cand 157 let g: i64 = tl_eval(preset, density, knobs, out12) 158 let sc: i64 = tl_score(g, out12, axis) 159 if sc > best_score { 160 best_score = sc 161 best_grade = g 162 best_val = cand 163 } 164 } 165 gi = gi + 1 166 } 167 knobs[knob] = best_val 168 knob = knob + 1 169 } 170 pass = pass + 1 171 } 172 173 // JOINT pass over the COUPLED pair (peaks_extra x terrace): terrace 174 // only matters WITH landmarks, so greedy per-knob descent never sees 175 // the pair (it zeroes peaks before terrace is ever tried -- measured 176 // 2026-06-10: read-targeted runs kept walking landmarks back while 177 // terrace=0 sat untouched). Coupled knobs get a 2D sweep. 178 var pi: i64 = 0 179 while pi < tn_grid_len(TL_K_PEAKS_EXTRA) { 180 var ti: i64 = 0 181 while ti < tn_grid_len(TL_K_TERRACE) { 182 let pv: i64 = tn_grid_val(TL_K_PEAKS_EXTRA, pi) 183 let tv: i64 = tn_grid_val(TL_K_TERRACE, ti) 184 var differs: i64 = 0 185 if pv != knobs[TL_K_PEAKS_EXTRA] { differs = 1 } 186 if tv != knobs[TL_K_TERRACE] { differs = 1 } 187 if differs == 1 { 188 let keep_p: i64 = knobs[TL_K_PEAKS_EXTRA] 189 let keep_t: i64 = knobs[TL_K_TERRACE] 190 knobs[TL_K_PEAKS_EXTRA] = pv 191 knobs[TL_K_TERRACE] = tv 192 let g: i64 = tl_eval(preset, density, knobs, out12) 193 let sc: i64 = tl_score(g, out12, axis) 194 if sc > best_score { 195 best_score = sc 196 best_grade = g 197 } else { 198 knobs[TL_K_PEAKS_EXTRA] = keep_p 199 knobs[TL_K_TERRACE] = keep_t 200 } 201 } 202 ti = ti + 1 203 } 204 pi = pi + 1 205 } 206 207 // re-eval the winner (out12 = winner's verdict for the report) 208 best_grade = tl_eval(preset, density, knobs, out12) 209 tn_report(logfd, "BEST" as *u8, ts, knobs, best_grade, axis, tl_axis_value(out12, axis)) 210 211 // bank: durable home + /tmp consumer copy; auto-file pm row on change 212 let cl: *u8 = sys_mmap(384) 213 var co: i64 = 0 214 co = tn_cat(cl, co, "preset=" as *u8); co = tn_cat_n(cl, co, preset) 215 co = tn_cat(cl, co, "\ndensity_q10=" as *u8); co = tn_cat_n(cl, co, density) 216 co = tn_cat(cl, co, "\nriver_depth=" as *u8); co = tn_cat_n(cl, co, knobs[TL_K_RIVER_DEPTH]) 217 co = tn_cat(cl, co, "\nrill_depth=" as *u8); co = tn_cat_n(cl, co, knobs[TL_K_RILL_DEPTH]) 218 co = tn_cat(cl, co, "\nrill_radius=" as *u8); co = tn_cat_n(cl, co, knobs[TL_K_RILL_RADIUS]) 219 co = tn_cat(cl, co, "\ndetail_amp=" as *u8); co = tn_cat_n(cl, co, knobs[TL_K_DETAIL_AMP]) 220 co = tn_cat(cl, co, "\npeaks_extra=" as *u8); co = tn_cat_n(cl, co, knobs[TL_K_PEAKS_EXTRA]) 221 co = tn_cat(cl, co, "\namp_boost=" as *u8); co = tn_cat_n(cl, co, knobs[TL_K_AMP_BOOST]) 222 co = tn_cat(cl, co, "\nterrace_steps=" as *u8); co = tn_cat_n(cl, co, knobs[TL_K_TERRACE]) 223 co = tn_cat(cl, co, "\ngrade=" as *u8); co = tn_cat(cl, co, tl_grade_name(best_grade)) 224 co = tn_cat(cl, co, "\ntuned_axis=" as *u8); co = tn_cat(cl, co, tl_refine_name(axis)) 225 co = tn_cat(cl, co, "\n" as *u8) 226 227 let durable: *u8 = "knowledge/status/worldgen_knobs.conf" as *u8 228 var changed: i64 = 1 229 let old: *u8 = sys_mmap(384) 230 let on: i64 = tl_read_file(durable, old, 383) 231 if on == co { 232 changed = 0 233 var ci: i64 = 0 234 while ci < co { 235 if old[ci] != cl[ci] { changed = 1; ci = co } else { ci = ci + 1 } 236 } 237 } 238 if changed == 1 { 239 let pfd: i64 = sys_openat_append("knowledge/status/pm_plan_durable.log" as *u8, 0x1a4) 240 if pfd >= 0 { 241 let row: *u8 = sys_mmap(512) 242 var ro: i64 = 0 243 ro = tn_cat(row, ro, "arc=PROCGEN step=TUNER ts=" as *u8) 244 ro = tn_cat_n(row, ro, ts) 245 ro = tn_cat(row, ro, " AUTO-FILED by nx_worldgen_tuner (knobs changed): grade=" as *u8) 246 ro = tn_cat(row, ro, tl_grade_name(best_grade)) 247 ro = tn_cat(row, ro, " tuned_axis=" as *u8) 248 ro = tn_cat(row, ro, tl_refine_name(axis)) 249 ro = tn_cat(row, ro, " river_depth=" as *u8); ro = tn_cat_n(row, ro, knobs[TL_K_RIVER_DEPTH]) 250 ro = tn_cat(row, ro, " rill_depth=" as *u8); ro = tn_cat_n(row, ro, knobs[TL_K_RILL_DEPTH]) 251 ro = tn_cat(row, ro, " rill_radius=" as *u8); ro = tn_cat_n(row, ro, knobs[TL_K_RILL_RADIUS]) 252 ro = tn_cat(row, ro, " detail_amp=" as *u8); ro = tn_cat_n(row, ro, knobs[TL_K_DETAIL_AMP]) 253 ro = tn_cat(row, ro, " peaks_extra=" as *u8); ro = tn_cat_n(row, ro, knobs[TL_K_PEAKS_EXTRA]) 254 ro = tn_cat(row, ro, " amp_boost=" as *u8); ro = tn_cat_n(row, ro, knobs[TL_K_AMP_BOOST]) 255 ro = tn_cat(row, ro, " terrace_steps=" as *u8); ro = tn_cat_n(row, ro, knobs[TL_K_TERRACE]) 256 ro = tn_cat(row, ro, " -- banked to worldgen_knobs.conf, the gate sweep consumes it next beat owner=Builder\n" as *u8) 257 sys_write(pfd, row, ro) 258 sys_fsync(pfd) 259 sys_close(pfd) 260 } 261 } 262 let dfd: i64 = sys_openat_wr(durable, 0x1a4) 263 if dfd >= 0 { sys_write(dfd, cl, co); sys_fsync(dfd); sys_close(dfd) } 264 let tfd: i64 = sys_openat_wr("/tmp/nishi_worldgen_knobs.conf" as *u8, 0x1a4) 265 if tfd >= 0 { sys_write(tfd, cl, co); sys_close(tfd) } 266 267 if logfd >= 0 { sys_close(logfd) } 268 if best_score < start_score { return 1 } 269 return 0 270}