nx_worldpipe_erode_gate.nx source
↩ module page · 408 lines · 21820 B
1// nx_worldpipe_erode_gate.nx -- GATE for PG20: erosion as a PROCESS on the worldpipe heightfield.
2//
3// WHAT THIS GATE IS FOR. nx_water_erosion.nx shipped all seven Mei 2007 stages and was gate-proven by
4// nx_water_erosion_gate (PG18) -- and the ranker measured it LIB-UNIMPORTED: the only importer in the
5// whole estate was its own gate (nx_absent, corpus_complete=1 over 23,201 files). Meanwhile THREE of
6// the estate's own census gates carried the identical residual in their prose -- "erosion is a scalar
7// not a process". PG20 is the composition that closes both, and this gate is its referee.
8//
9// THE REFEREE, AND WHY IT IS THIS ONE. procgen.plan names two published geomorphology bands: the
10// hypsometric curve and DRAINAGE DENSITY. Only one of them is applicable here, and that is decidable
11// BEFORE any measurement is taken rather than after:
12// * drainage density is kilometres of channel per square kilometre. Our world has no metric scale
13// binding of any kind, so a published km/km2 band quoted against it would be a number about a
14// subject we do not have -- the subject-mismatch defect wearing a citation. It is DECLARED OPEN
15// here by name, not half-measured.
16// * Strahler's hypsometric integral, (mean - min) / (max - min), is DIMENSIONLESS. It is exactly
17// the right referee for an unscaled procedural world, and it is non-gameable for a reason that is
18// provable rather than hoped: it is INVARIANT under h -> a*h + b for a > 0. An implementation
19// that lowers the terrain, or flattens it, or shifts it, moves the referee NOWHERE. Two teeth
20// below prove that invariance on real data instead of asserting it in a comment.
21//
22// WHAT IS DELIBERATELY *NOT* ASSERTED, AND WHY. The DIRECTION the integral moves under one erosion run
23// is NOT asserted. Strahler's association of a falling integral with landscape maturity is an
24// empirical statement about long-run denudation, not a per-run theorem of the pipe model: a run that
25// incises a deep channel lowers the minimum faster than the mean and can raise the integral honestly.
26// Baking a direction in would be encoding a relationship this author cannot derive. Both values are
27// MEASURED and PRINTED; the direction is reported, exactly as the
28// sibling gate reports semi-Lagrangian transport rather than asserting a conservation it does not have.
29//
30// THE ANTI-VACUITY TOOTH THAT NOISE CANNOT PASS: erosion must remove material from steep ground and
31// leave or add it on flat ground, because the pipe model's sediment capacity is proportional to local
32// slope times velocity. So the mean height delta over cells STEEPER than the terrain's own mean slope
33// must be strictly more negative than over cells flatter than it. A uniform offset scores zero on both
34// sides; added noise is uncorrelated with slope and scores the same on both sides; only material
35// actually moved downhill separates them. The divider is the terrain's OWN mean slope, measured at
36// runtime -- there is no threshold to pick.
37//
38// FIXTURE POLICY: the synthetic teeth run on caller-owned mmap, and the integration teeth run against
39// the real worldpipe surface at a fixed seed. Nothing here writes a production plane.
40
41import "nx_syscalls.nx"
42import "nx_tier.nx"
43import "nx_gate_verdict.nx"
44import "nx_worldpipe.nx"
45
46// Synthetic fixture edge, adopted from the sibling nx_water_erosion_gate's derivation (16x16 = 256
47// cells: big enough that interior cells have four neighbours and both slope halves are populated,
48// small enough to stay well inside a beat).
49const WG_GN: i64 = 16
50// Staircase step for the synthetic grid, in world units. The talus threshold below is DERIVED from it.
51const WG_STEP: i64 = 40
52// Seed for the real-terrain leg. Any fixed seed makes the run reproducible; the teeth below assert
53// properties that hold for a surface with relief, not properties of this particular seed.
54const WG_SEED: i64 = 20260825
55// Ticks for the real-terrain bake. Reported with every measurement; the teeth bind to whether material
56// MOVED, never to how much, so this is an exercise budget and not a tuned constant.
57const WG_TICKS: i64 = 8
58// THE PUBLISHED MATURITY BANDS ARE DELIBERATELY NOT QUOTED HERE. They were sought and the primary is
59// unreachable from this lane: pubs.geoscienceworld.org answered HTTP 403 with Cf-Mitigated: challenge
60// on 2026-08-25, which the estate's own refs law names as a bot wall that SAVES as a plausible body --
61// a mirror worse than none. Printing band edges from memory would be an unsourced number wearing a
62// citation, the exact defect the gap-ledger lane refused to commit over Epic's content-free JS shell.
63// The integral needs no band to BE a referee: its INVARIANCE is what makes it one, and that is proven
64// above on real data. The band stays OWED, by name, in the verdict note.
65
66func wg_abs(v: i64) -> i64 { if v < 0 { return 0-v } return v }
67
68// The x-major index convention nx_pets_voxel3d.vp_erode_pass uses, written out INDEPENDENTLY here so
69// the claim "index order does not change the result" is MEASURED rather than left as a comment.
70// Voxel law: shed exactly one unit per overhung neighbour.
71func wg_ref_vp_pass(hg: *i64, gn: i64, talus: i64, delta: *i64) -> i64 {
72 var i: i64 = 0
73 while i < gn*gn { delta[i] = 0; i = i + 1 }
74 var z: i64 = 0
75 while z < gn {
76 var x: i64 = 0
77 while x < gn {
78 let h: i64 = hg[x*gn + z]
79 if x > 0 { if h - hg[(x-1)*gn+z] > talus { delta[x*gn+z] = delta[x*gn+z] - 1; delta[(x-1)*gn+z] = delta[(x-1)*gn+z] + 1 } }
80 if x < gn - 1 { if h - hg[(x+1)*gn+z] > talus { delta[x*gn+z] = delta[x*gn+z] - 1; delta[(x+1)*gn+z] = delta[(x+1)*gn+z] + 1 } }
81 if z > 0 { if h - hg[x*gn+(z-1)] > talus { delta[x*gn+z] = delta[x*gn+z] - 1; delta[x*gn+(z-1)] = delta[x*gn+(z-1)] + 1 } }
82 if z < gn - 1 { if h - hg[x*gn+(z+1)] > talus { delta[x*gn+z] = delta[x*gn+z] - 1; delta[x*gn+(z+1)] = delta[x*gn+(z+1)] + 1 } }
83 x = x + 1
84 }
85 z = z + 1
86 }
87 var j: i64 = 0
88 while j < gn*gn { hg[j] = hg[j] + delta[j]; j = j + 1 }
89 return 0
90}
91
92func wg_sum(g: *i64, n: i64) -> i64 {
93 var s: i64 = 0
94 var i: i64 = 0
95 while i < n { s = s + g[i]; i = i + 1 }
96 return s
97}
98
99// A rough staircase-plus-bump surface: monotone in one axis so the talus law has real overhangs, with
100// a raised block so the field is not separable and the hypsometric integral is not degenerate.
101func wg_seed_grid(g: *i64, gn: i64) -> i64 {
102 var y: i64 = 0
103 while y < gn {
104 var x: i64 = 0
105 while x < gn {
106 var v: i64 = (gn - 1 - x) * WG_STEP + y * (WG_STEP / 4)
107 if x > gn/3 { if x < gn/2 { if y > gn/3 { if y < gn/2 { v = v + WG_STEP * 3 } } } }
108 g[y*gn + x] = v
109 x = x + 1
110 }
111 y = y + 1
112 }
113 return gn*gn
114}
115
116func wg_copy(dst: *i64, src: *i64, n: i64) -> i64 {
117 var i: i64 = 0
118 while i < n { dst[i] = src[i]; i = i + 1 }
119 return n
120}
121
122func wg_diffcount(a: *i64, b: *i64, n: i64) -> i64 {
123 var d: i64 = 0
124 var i: i64 = 0
125 while i < n { if a[i] != b[i] { d = d + 1 } i = i + 1 }
126 return d
127}
128
129// Local slope proxy on a square grid: the largest absolute height difference to a 4-neighbour.
130func wg_slope_at(g: *i64, gn: i64, x: i64, y: i64) -> i64 {
131 let k: i64 = y*gn + x
132 let h: i64 = g[k]
133 var m: i64 = 0
134 if x > 0 { let d: i64 = wg_abs(h - g[k-1]); if d > m { m = d } }
135 if x < gn - 1 { let d: i64 = wg_abs(h - g[k+1]); if d > m { m = d } }
136 if y > 0 { let d: i64 = wg_abs(h - g[k-gn]); if d > m { m = d } }
137 if y < gn - 1 { let d: i64 = wg_abs(h - g[k+gn]); if d > m { m = d } }
138 return m
139}
140
141func main() -> i64 {
142 let c: *i64 = gv_ctr()
143 gv_head("NX-WORLDPIPE-ERODE-GATE -- PG20: the gate-proven Mei 2007 pipeline COMPOSED onto the worldpipe heightfield" as *u8)
144
145 // =========================================================================================
146 // PART 1 -- the talus law, in the lib that now owns it
147 // =========================================================================================
148 let fn2: i64 = WG_GN * WG_GN
149 let ga: *i64 = sys_mmap(te_grid_bytes(WG_GN)) as *i64
150 let gb: *i64 = sys_mmap(te_grid_bytes(WG_GN)) as *i64
151 let d1: *i64 = sys_mmap(te_grid_bytes(WG_GN)) as *i64
152 let d2: *i64 = sys_mmap(te_grid_bytes(WG_GN)) as *i64
153 wg_seed_grid(ga, WG_GN)
154 wg_copy(gb, ga, fn2)
155 gv_subjects("cells-in-synthetic-fixture" as *u8, fn2, c)
156
157 // talus DERIVED from the fixture's own staircase step: shedding must be able to fire, and it must
158 // not fire everywhere, so half a step is the one value the fixture itself supplies.
159 let talus: i64 = WG_STEP / 2
160 let sum_before: i64 = wg_sum(ga, fn2)
161 let moved: i64 = te_thermal_pass(ga, WG_GN, talus, 0, d1)
162 let sum_after: i64 = wg_sum(ga, fn2)
163 gv_puts(" thermal talus=" as *u8); gv_num(talus)
164 gv_puts(" sum_before=" as *u8); gv_num(sum_before)
165 gv_puts(" sum_after=" as *u8); gv_num(sum_after)
166 gv_puts(" moved=" as *u8); gv_num(moved); gv_puts("\n" as *u8)
167 gv_check("thermal-pass-conserves-terrain-mass-EXACTLY-tolerance-zero" as *u8, sum_after == sum_before, c)
168 gv_check("anti-vacuity-thermal-pass-actually-moved-material" as *u8, moved > 0, c)
169
170 // The equivalence that makes retiring nx_pets_voxel3d's private copy onto this owner PROVABLE.
171 wg_ref_vp_pass(gb, WG_GN, talus, d2)
172 let mism: i64 = wg_diffcount(ga, gb, fn2)
173 gv_puts(" voxel-law equivalence mismatching_cells=" as *u8); gv_num(mism)
174 gv_puts(" of=" as *u8); gv_num(fn2); gv_puts("\n" as *u8)
175 gv_check("voxel-law-at-flux-zero-is-byte-identical-to-the-x-major-reference-over-every-cell" as *u8,
176 mism == 0 && moved > 0, c)
177
178 // NEG-CONTROL for the conservation checker: plant a one-unit leak and the SAME checker must see it.
179 let clean: i64 = wg_abs(wg_sum(ga, fn2) - sum_before)
180 ga[0] = ga[0] + 1
181 let leaked: i64 = wg_abs(wg_sum(ga, fn2) - sum_before)
182 ga[0] = ga[0] - 1
183 gv_puts(" neg-control planted_leak_reads=" as *u8); gv_num(leaked)
184 gv_puts(" clean_reads=" as *u8); gv_num(clean); gv_puts("\n" as *u8)
185 var fires: i64 = 0
186 if leaked == 1 { fires = 1 }
187 var onclean: i64 = 1
188 if clean == 0 { onclean = 0 }
189 gv_bite("neg-control-mass-checker-fires-on-a-planted-one-unit-leak" as *u8, fires, onclean, c)
190
191 // The MUSGRAVE branch must also conserve, and must move a DIFFERENT amount from the voxel branch --
192 // otherwise the generalisation is decorative and one of the two laws is not being exercised.
193 wg_seed_grid(gb, WG_GN)
194 let msum0: i64 = wg_sum(gb, fn2)
195 let mmoved: i64 = te_thermal_pass(gb, WG_GN, talus, NX_WATER_Q, d2)
196 let msum1: i64 = wg_sum(gb, fn2)
197 gv_puts(" musgrave branch moved=" as *u8); gv_num(mmoved)
198 gv_puts(" voxel branch moved=" as *u8); gv_num(moved); gv_puts("\n" as *u8)
199 gv_check("musgrave-proportional-branch-also-conserves-mass-EXACTLY" as *u8, msum1 == msum0, c)
200 gv_check("the-two-laws-are-genuinely-different-not-one-law-with-a-dead-parameter" as *u8,
201 mmoved > 0 && mmoved != moved, c)
202
203 // =========================================================================================
204 // PART 2 -- the referee, proven non-gameable on real numbers
205 // =========================================================================================
206 wg_seed_grid(ga, WG_GN)
207 let hi_base: i64 = te_hypsometric_permil(ga, fn2)
208 // offset leg: every height raised by one full step. min and mean both move by exactly that amount
209 // and the range is untouched, so the integral is EXACTLY unchanged.
210 wg_copy(gb, ga, fn2)
211 var i2: i64 = 0
212 while i2 < fn2 { gb[i2] = gb[i2] + WG_STEP; i2 = i2 + 1 }
213 let hi_off: i64 = te_hypsometric_permil(gb, fn2)
214 // scale leg: every height tripled. The bound is DERIVED, not picked -- the only inexactness is the
215 // single truncation in the mean, amplified by the permille scale over the fixture's own range.
216 var mn: i64 = ga[0]
217 var mx: i64 = ga[0]
218 var i3: i64 = 0
219 while i3 < fn2 { if ga[i3] < mn { mn = ga[i3] } if ga[i3] > mx { mx = ga[i3] } i3 = i3 + 1 }
220 let scale_bound: i64 = TE_PERMIL / (mx - mn) + 1
221 wg_copy(gb, ga, fn2)
222 var i4: i64 = 0
223 while i4 < fn2 { gb[i4] = gb[i4] * 3; i4 = i4 + 1 }
224 let hi_scl: i64 = te_hypsometric_permil(gb, fn2)
225 gv_puts(" hypsometric base=" as *u8); gv_num(hi_base)
226 gv_puts(" after_offset=" as *u8); gv_num(hi_off)
227 gv_puts(" after_scale=" as *u8); gv_num(hi_scl)
228 gv_puts(" derived_scale_bound=" as *u8); gv_num(scale_bound); gv_puts("\n" as *u8)
229 gv_check("referee-is-EXACTLY-invariant-under-a-uniform-offset-so-a-shifter-cannot-move-it" as *u8,
230 hi_base > 0 && hi_off == hi_base, c)
231 gv_check("referee-is-invariant-under-a-uniform-positive-scale-within-the-derived-truncation-bound" as *u8,
232 wg_abs(hi_scl - hi_base) <= scale_bound, c)
233
234 // A field with no relief has no hypsometry. It must ABSTAIN, never return a number.
235 var i5: i64 = 0
236 while i5 < fn2 { gb[i5] = 7; i5 = i5 + 1 }
237 let hi_flat: i64 = te_hypsometric_permil(gb, fn2)
238 gv_puts(" hypsometric on a flat field reads=" as *u8); gv_num(hi_flat)
239 gv_puts(" (UNOBSERVABLE is -1)\n" as *u8)
240 gv_check("neg-control-referee-ABSTAINS-on-a-flat-field-instead-of-acquitting-with-a-number" as *u8,
241 hi_flat == 0-1, c)
242
243 // =========================================================================================
244 // PART 3 -- the integration, against the real worldpipe surface
245 // =========================================================================================
246 wp_init(WG_SEED)
247 let gn: i64 = HYW
248 let n: i64 = gn * gn
249 let hpre: *i64 = sys_mmap(te_grid_bytes(gn)) as *i64
250 let hpost: *i64 = sys_mmap(te_grid_bytes(gn)) as *i64
251 let hoff: *i64 = sys_mmap(te_grid_bytes(gn)) as *i64
252 let orig: *i64 = sys_mmap(te_grid_bytes(gn)) as *i64
253
254 // POPULATION DECLARED: every cell centre of the baked grid. wp_erode lands exactly on a stored
255 // sample at a cell centre (the interpolation fractions are zero there), so this reads the grid the
256 // bake wrote, with no sampling anywhere.
257 var inert: i64 = 0
258 var y1: i64 = 0
259 while y1 < gn {
260 var x1: i64 = 0
261 while x1 < gn {
262 let wx: i64 = x1*HYCELL - HYSPAN
263 let wz: i64 = y1*HYCELL - HYSPAN
264 hpre[y1*gn + x1] = wp_height(wx, wz)
265 orig[y1*gn + x1] = wp_flow_h(wx, wz)
266 if wp_erode(wx, wz) != 0 { inert = inert + 1 }
267 x1 = x1 + 1
268 }
269 y1 = y1 + 1
270 }
271 gv_subjects("world-cells-probed-full-population" as *u8, n, c)
272 gv_puts(" before any bake: non-zero wp_erode readings=" as *u8); gv_num(inert)
273 gv_puts(" of=" as *u8); gv_num(n); gv_puts("\n" as *u8)
274 gv_check("wp_erode-is-INERT-before-the-bake-so-every-existing-consumer-is-byte-unchanged" as *u8,
275 inert == 0, c)
276
277 // talus for the real surface, DERIVED from the terrain's own mean neighbour drop -- material sheds
278 // where the ground is steeper than the ground's own average, so no threshold is picked.
279 var slope_sum: i64 = 0
280 var y2: i64 = 0
281 while y2 < gn {
282 var x2: i64 = 0
283 while x2 < gn { slope_sum = slope_sum + wg_slope_at(orig, gn, x2, y2); x2 = x2 + 1 }
284 y2 = y2 + 1
285 }
286 let mean_slope: i64 = slope_sum / n
287 gv_puts(" terrain mean neighbour drop=" as *u8); gv_num(mean_slope)
288 gv_puts(" world units per " as *u8); gv_num(64); gv_puts("-unit cell (talus derived from it)\n" as *u8)
289 gv_check("terrain-has-relief-so-the-derived-talus-is-a-measurement-not-a-default" as *u8, mean_slope > 0, c)
290
291 let cells: i64 = wp_erode_bake(WG_TICKS, NX_WATER_Q, mean_slope, NX_WATER_Q)
292 let hi0: i64 = wp_erode_stat(2)
293 let hi1: i64 = wp_erode_stat(3)
294 let er_moved: i64 = wp_erode_stat(1)
295 gv_puts(" bake cells=" as *u8); gv_num(cells)
296 gv_puts(" ticks=" as *u8); gv_num(wp_erode_stat(0))
297 gv_puts(" talus_moved=" as *u8); gv_num(er_moved); gv_puts("\n" as *u8)
298 gv_check("bake-covered-the-whole-declared-grid" as *u8, cells == n, c)
299 gv_check("anti-vacuity-the-talus-pass-moved-material-on-the-real-terrain" as *u8, er_moved > 0, c)
300
301 var changed: i64 = 0
302 var y3: i64 = 0
303 while y3 < gn {
304 var x3: i64 = 0
305 while x3 < gn {
306 let wx: i64 = x3*HYCELL - HYSPAN
307 let wz: i64 = y3*HYCELL - HYSPAN
308 let v: i64 = wp_height(wx, wz)
309 hpost[y3*gn + x3] = v
310 if v != hpre[y3*gn + x3] { changed = changed + 1 }
311 x3 = x3 + 1
312 }
313 y3 = y3 + 1
314 }
315 gv_puts(" after bake: world cells whose height CHANGED=" as *u8); gv_num(changed)
316 gv_puts(" of=" as *u8); gv_num(n); gv_puts("\n" as *u8)
317 gv_check("anti-vacuity-the-composed-stage-actually-changed-the-terrain-the-world-reads" as *u8,
318 changed > 0, c)
319
320 // CAUSALITY: turning the stage off must restore the pre-bake height at EVERY probed cell, not most.
321 wp_set_erode(0)
322 var restored: i64 = 0
323 var y4: i64 = 0
324 while y4 < gn {
325 var x4: i64 = 0
326 while x4 < gn {
327 let v: i64 = wp_height(x4*HYCELL - HYSPAN, y4*HYCELL - HYSPAN)
328 hoff[y4*gn + x4] = v
329 if v == hpre[y4*gn + x4] { restored = restored + 1 }
330 x4 = x4 + 1
331 }
332 y4 = y4 + 1
333 }
334 wp_set_erode(1)
335 gv_puts(" causality: cells restored with the stage off=" as *u8); gv_num(restored)
336 gv_puts(" of=" as *u8); gv_num(n); gv_puts("\n" as *u8)
337 gv_check("causality-stage-off-restores-the-pre-bake-height-at-EVERY-cell-in-the-population" as *u8,
338 restored == n && changed > 0, c)
339
340 // THE REFEREE ON REAL TERRAIN. Values measured and PRINTED. The DIRECTION is reported, never
341 // asserted, and no published band is quoted -- see this file's header for both reasons.
342 gv_puts(" STRAHLER hypsometric integral before=" as *u8); gv_num(hi0)
343 gv_puts(" after=" as *u8); gv_num(hi1)
344 gv_puts(" permille -- direction REPORTED not asserted, and the published maturity BAND is UNSOURCED" as *u8)
345 gv_puts(" (primary behind a bot wall, measured; no band edge quoted from memory -- see header)\n" as *u8)
346 gv_check("referee-produced-a-real-reading-on-both-sides-of-the-run-never-an-abstention" as *u8,
347 hi0 >= 0 && hi1 >= 0 && hi0 <= TE_PERMIL && hi1 <= TE_PERMIL, c)
348 gv_check("erosion-moved-the-referee-which-an-offset-or-a-scale-provably-cannot" as *u8, hi1 != hi0, c)
349
350 // THE TOOTH NOISE CANNOT PASS: material must leave STEEP ground for FLAT ground. The divider is the
351 // terrain's own mean slope, so there is no threshold here to tune.
352 var steep_n: i64 = 0
353 var flat_n: i64 = 0
354 var steep_d: i64 = 0
355 var flat_d: i64 = 0
356 var y5: i64 = 0
357 while y5 < gn {
358 var x5: i64 = 0
359 while x5 < gn {
360 let d: i64 = wp_erode(x5*HYCELL - HYSPAN, y5*HYCELL - HYSPAN)
361 if wg_slope_at(orig, gn, x5, y5) > mean_slope {
362 steep_n = steep_n + 1
363 steep_d = steep_d + d
364 } else {
365 flat_n = flat_n + 1
366 flat_d = flat_d + d
367 }
368 x5 = x5 + 1
369 }
370 y5 = y5 + 1
371 }
372 gv_puts(" slope partition steep=" as *u8); gv_num(steep_n)
373 gv_puts(" flat=" as *u8); gv_num(flat_n)
374 gv_puts(" sum=" as *u8); gv_num(steep_n + flat_n)
375 gv_puts(" of=" as *u8); gv_num(n); gv_puts("\n" as *u8)
376 gv_check("slope-partition-reconciles-to-the-whole-population" as *u8, steep_n + flat_n == n, c)
377 gv_check("both-slope-halves-are-populated-so-the-comparison-below-is-not-vacuous" as *u8,
378 steep_n > 0 && flat_n > 0, c)
379 let steep_mean: i64 = steep_d / steep_n
380 let flat_mean: i64 = flat_d / flat_n
381 gv_puts(" mean height delta on STEEP ground=" as *u8); gv_num(steep_mean)
382 gv_puts(" on FLAT ground=" as *u8); gv_num(flat_mean); gv_puts("\n" as *u8)
383 gv_check("material-left-STEEP-ground-for-FLAT-ground-a-uniform-offset-or-added-noise-scores-equal" as *u8,
384 steep_mean < flat_mean, c)
385
386 // DETERMINISM: the same seed and the same budget must produce the same grid, or nothing above is
387 // reproducible by anybody else.
388 let rebake: i64 = wp_erode_bake(WG_TICKS, NX_WATER_Q, mean_slope, NX_WATER_Q)
389 var same: i64 = 0
390 var y6: i64 = 0
391 while y6 < gn {
392 var x6: i64 = 0
393 while x6 < gn {
394 if wp_height(x6*HYCELL - HYSPAN, y6*HYCELL - HYSPAN) == hpost[y6*gn + x6] { same = same + 1 }
395 x6 = x6 + 1
396 }
397 y6 = y6 + 1
398 }
399 gv_puts(" determinism: identical cells across two bakes=" as *u8); gv_num(same)
400 gv_puts(" of=" as *u8); gv_num(n); gv_puts(" rebake_cells=" as *u8); gv_num(rebake); gv_puts("\n" as *u8)
401 gv_check("two-bakes-at-one-seed-agree-at-EVERY-cell-in-the-population" as *u8, same == n, c)
402
403 gv_puts(" DECLARED OPEN, not half-measured: drainage density is km of channel per km2 and this\n" as *u8)
404 gv_puts(" world has no metric scale binding, so no published band for it is quoted here.\n" as *u8)
405
406 return gv_verdict("nx_worldpipe_erode_gate" as *u8, c,
407 "PG20: the gate-proven Mei 2007 pipeline plus the Musgrave talus companion, composed onto the worldpipe heightfield through one owner. Mass exact, inert before bake, causal on the toggle, deterministic across bakes, and judged by a dimensionless referee proven invariant to the offset and scale a fake erosion would use. Scope, declared: it says nothing about drainage density, which needs a metric scale this world does not have, and it quotes NO published maturity band because the primary is behind a bot wall -- both owed by name rather than half-measured." as *u8)
408}