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}