Skip to content

test(cliffs): sweep cliff_smoothing IN THE GAME - it is NOT the residual (#18) - #80

Merged
wormeyman merged 2 commits into
mainfrom
cliffs-smoothing-sweep-oracle-18
Aug 2, 2026
Merged

test(cliffs): sweep cliff_smoothing IN THE GAME - it is NOT the residual (#18)#80
wormeyman merged 2 commits into
mainfrom
cliffs-smoothing-sweep-oracle-18

Conversation

@wormeyman

Copy link
Copy Markdown
Owner

Refutes the conclusion of #79, which merged this morning. Same day, one setting.

cliff_smoothing is the only code path that runs on Vulcanus and not on Nauvis, so it was the natural home for a residual Nauvis does not have. #79 swept it exhaustively inside the port - knot span, clamp, lattice anchor, blend strength, per-axis, interpolation family - and every parameter came back at a sharp optimum on the shipping value. That was read as "the model is right, so the fault is somewhere inside it."

Wrong. cliff_smoothing is a map_gen_settings.cliff_settings field, so it can be overridden on the created surface rather than accepted as the planet ships it - which turns one data point into a family. s = 0 is decisive: with smoothing off the cliff elevation is the raw field (accurate to a max of 4.8e-2) fed to the rule that reproduces Nauvis 334/334. A port whose only defect were the smoothing would be exact there.

Region [0,0], captured against the 2.1.12 binary:

cliff_smoothing game ours matched wrong
0 352 432 289 83 = 28.7%
0.5 315 374 267 73 = 27.3%
1 283 335 228 68 = 29.8%

The error is flat in s. Turning the suspect off does not move it.

The lesson

A sweep inside the port can only rank models within the family the port already implements, so a sharp optimum says "best in family", never "correct". The whole family was wrong here and no amount of internal sweeping could have said so. When a suspect is reachable as a game setting, vary it in the game - a one-run experiment that indicts or clears it without needing to be right about the mechanism.

Mechanics

  • sampleCliffEntitiesFull returns the cliff_settings the surface reports back, not what was written. That is what makes the sweep non-vacuous: an override that silently failed to apply is otherwise indistinguishable from a setting that does not matter - the exact conclusion being drawn. sampleCliffEntities keeps its signature and delegates.
  • Those dumped settings are also the only direct evidence outside the .lua files that Vulcanus generates with cliff_elevation_0 = 70, cliff_elevation_interval = 120, cliff_smoothing = 1.
  • The s = 1 arm reproduces the 283 cliffs the default-preset fixture already holds for that region, tying the new fixture to the existing ones.

Also cleared

The cliffiness gate, against the new s = 0 fixture: avg > 0.5 28.7%, requiring BOTH corners 37.1%, max arithmetically identical to avg because cliffiness_basic is confined to [0.5, 1.5]. The threshold bottoms exactly at 0.5, and min is refuted outright by Nauvis (334/334 → 295 placed / 32 wrong).

A trap recorded in the notes

Scoring edges over all the game's cells rather than the cells both place reports ~57% agreement and ~260 "sign flips" at every smoothing value - an artifact of the wider denominator, caught by the rate being flat in s.

Does not fix #18. pnpm run verify: 307 files clean, 1293 passed / 3 skipped, preview 12 passed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GRx1CU29RKLsRuUAErEDRB

wormeyman and others added 2 commits August 1, 2026 16:59
…ual (#18)

Refutes this morning's conclusion, and refutes it with one setting.

`cliff_smoothing` is the one code path that runs on Vulcanus and not on
Nauvis, so it was the natural home for a residual Nauvis does not have. It
was swept exhaustively inside the port earlier today - knot span, clamp,
lattice anchor, blend strength, per-axis, interpolation family - and every
parameter came back at a sharp optimum on the shipping value. That was read
as "the model is right, so the fault is somewhere inside it".

Wrong. `cliff_smoothing` is a map_gen_settings.cliff_settings field, so it
can be OVERRIDDEN on the created surface instead of accepted as the planet
ships it, which turns one data point into a family. `s = 0` is decisive:
with smoothing off the cliff elevation IS the raw field - measured accurate
to a max of 4.8e-2 - fed to the rule that reproduces Nauvis 334/334. A port
whose only defect were the smoothing would be EXACT there.

Region [0,0], captured against the 2.1.12 binary:

  s=0     game 352  ours 432  matched 289  wrong 83 = 28.7%
  s=0.5   game 315  ours 374  matched 267  wrong 73 = 27.3%
  s=1     game 283  ours 335  matched 228  wrong 68 = 29.8%

The error is FLAT in s. Turning the suspect off does not move it.

The general lesson, which this repo keeps re-learning: a sweep inside the
port can only rank models within the family the port already implements, so
a sharp optimum says "best in family", never "correct". The whole family was
wrong here and no amount of internal sweeping could have said so. When a
suspect is reachable as a game SETTING, vary it in the game - that is a
one-run experiment which indicts or clears it without needing to be right
about the mechanism.

Mechanics:

- `sampleCliffEntitiesFull` returns the cliff_settings the SURFACE reports
  back, not what was written. That is what makes the sweep non-vacuous: an
  override that silently failed to apply is otherwise indistinguishable from
  a setting that does not matter, which is the exact conclusion being drawn.
  `sampleCliffEntities` keeps its signature and delegates.
- Those dumped settings are also the only direct evidence outside the .lua
  data files that Vulcanus generates with cliff_elevation_0 = 70,
  cliff_elevation_interval = 120, cliff_smoothing = 1.
- The s=1 arm reproduces the 283 cliffs the default-preset fixture already
  holds for that region, tying the new fixture to the existing ones.

Also cleared, against the new s=0 fixture: the cliffiness gate. `avg > 0.5`
28.7%, requiring BOTH corners 37.1%, `max` arithmetically identical to `avg`
because cliffiness_basic is confined to [0.5, 1.5]; the threshold bottoms
exactly at 0.5, and `min` is refuted outright by Nauvis (334/334 -> 295
placed / 32 wrong).

Notes record one measurement trap met on the way: scoring edges over ALL the
game's cells rather than the cells both place reports ~57% agreement and
~260 "sign flips" - an artifact of the denominator, caught by the rate being
flat in s.

DOES NOT FIX #18.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GRx1CU29RKLsRuUAErEDRB
CI's verify failed on this branch with

  FAIL test/vulcanusRender.spec.ts > composites Vulcanus rocks and cliffs
       ON TOP of resource patches in view:'all'
  Error: Test timed out in 15000ms.

Not a hang and not a logic failure. That test measures 3001ms locally; the
4-core runner is ~3x slower and this branch's new spec adds suite load, which
was enough to tip a 5x margin.

The three `}, 15000)` in this file were the ONLY annotations in the suite
below `vite.config.ts`'s 30s `testTimeout`. That default was raised to ~3x the
slowest measured case precisely to absorb runner variance, so an annotation
under it opts the test out of the margin it exists to provide - the failure
mode the default was introduced to prevent, reintroduced by hand. Removing
them leaves ~10x the measured cost and still fails a real hang far inside the
job's 15-minute cap.

Retry was NOT used: nothing here is nondeterministic, so a retry would hide a
genuine regression instead of a slow machine.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GRx1CU29RKLsRuUAErEDRB
@wormeyman
wormeyman merged commit b595903 into main Aug 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vulcanus cliffs: 12.5% of matched cells get the wrong cliff_orientation (residual after the placement-count fixes)

1 participant