test(cliffs): the cascade's whole gain is CROSS-CHUNK, and +8 was the wrong baseline (#84) - #148
Merged
Merged
Conversation
… wrong baseline (#84) Priced the destroy cascade against the model that actually ships rather than the post-filter baseline #143 used. Zero capture, scored on the error budget's own three regions. model port surplus missing wrongOri shipped (rejectAtCrossingStage) 1547 22 6 21 destroy cascade 1545 20 6 18 cascade forbidden to cross a chunk 1547 22 6 21 #143's net +8 does NOT survive. The real gain is +2 positions and +3 orientations with recall untouched. The +8 scored the cascade against a post-filter model, but the renderer ships rejectAtCrossingStage, which zeroes a rejected cell's four edges so its neighbours lose the shared one - already most of the cascade. Corrected at both sites that quote it. The third row is the finding: restricting the cascade to WITHIN a chunk reproduces the shipped model exactly, on all four counts. Everything it buys is a cascade crossing a chunk boundary, which rejectAtCrossingStage cannot do by construction - each chunk owns a private copy of its shared edges, which is what keeps the pass chunk-local and worker tiling byte-identical. All SIX cells where the models disagree are onChunkBorder, and every one the game has an opinion about is a correction: 2 removals of surplus cells, and 3 orientations moving to the game's exact value (none-to-east, north-to-none, none-to-west). That matters more than the two cells. It is the same place the residual's unexplained cells concentrate - the border enrichment has survived both its deflations (#134, #143) and stands at z = 2.67 - and a chunk-local rejection model that cannot cascade across a chunk boundary is a mechanism of exactly that shape. It is the first candidate that PREDICTS border-only errors rather than merely being consistent with them. It does not explain the enrichment yet: 6 cells here against 23 there, on different fixtures. Adoption deferred, and not for the reason expected. The reach is bounded at ONE hop (maxDepth 1, maxDist 4 tiles), so a one-chunk halo is all it would need. The obstacle is that cliffCellBounds.spec.ts pins the tiled-to-whole noise ratio below 1.1 to stop exactly that inflation: a 128px worker tile is 4x4 chunks and would become 6x6, ~2.25x the cliff-pass cell work by geometry (estimated, not benchmarked). +2 positions for that is a trade to make with a benchmark in hand. Verified: pnpm run verify green - 1566 app (up 4) + 13 worker + 3 container, 0 warnings, exit 0. Measurement only; shipping accuracy unchanged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HKjzpWJw1HbnigPP9udqN2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Priced the destroy cascade against the model that actually ships, rather than the post-filter baseline #143 used. No capture - scored on the error budget's own three regions.
rejectAtCrossingStage)#143's net +8 does not survive, and the real figure is +2
The +8 scored the cascade against a post-filter model - kills applied, no cascade. But
renderVulcanusCliffsshipsrejectAtCrossingStage, which zeroes a rejected cell's four edge registers so its neighbours lose the shared edge, and that already reproduces most of the cascade. The honest gain is +2 positions and +3 orientations, recall untouched.Corrected at both sites that quote it -
cliffResidualCascadeAudit.spec.ts's header and the notes banner - rather than only in the new spec, since the banner is what a reader hits first.The third row is the finding
Restricting the cascade to within a chunk reproduces the shipped model exactly, on all four counts. Everything the cascade buys is a cascade that crosses a chunk boundary - which
rejectAtCrossingStagecannot do by construction, because each chunk owns a private copy of its shared edges. That privacy is precisely what keeps the pass chunk-local and worker tiling byte-identical.All six disagreeing cells are
onChunkBorder, and every one the game has an opinion about is a correction:(1606, 1598.5)(-1050, 1022.5)(1634, 1534.5)west-to-eastnone-to-eastnone-to-east(1694, 1598.5)north-to-eastnorth-to-nonenorth-to-none(1670, 1662.5)south-to-westnone-to-westnone-to-west(1722, 1630.5)east-to-southeast-to-noneWhy this is worth more than the two cells
That is the same place the residual's unexplained cells concentrate. The chunk-border enrichment has survived both of its plausible deflations - the orientation-reach rival (#134) and cascade double-counting (#143) - and stands at z = 2.67.
A chunk-local rejection model that cannot cascade across a chunk boundary is a mechanism of exactly that shape, and it is the first candidate that predicts border-only errors rather than merely being consistent with them.
It does not explain the enrichment yet - 6 cells here against 23 unexplained there, on different fixtures - and the spec says so. What is established is that the mechanism exists and is border-exclusive, which is what makes testing it against the residual directly the next move.
Adoption is deferred, and not for the reason expected
The reach is bounded at one hop (
maxDepth1,maxDist4 tiles = one grid step), so a one-chunk halo is all it would ever need. The reach is not the obstacle.The obstacle is a perf guard:
test/cliffCellBounds.spec.tspins the tiled-to-whole noise ratio below 1.1 precisely to stop that kind of inflation. A 128px worker tile is 4x4 chunks and would become 6x6 - ~2.25x the cliff-pass cell work by geometry (estimated, not benchmarked). Buying +2 positions for that is a trade to make with a benchmark in hand, not as a side effect.Verification
pnpm run verifygreen - 1566 app (up 4) + 13 worker + 3 container tests, 0 warnings, exit 0. Measurement only; shipping accuracy unchanged.🤖 Generated with Claude Code
https://claude.ai/code/session_01HKjzpWJw1HbnigPP9udqN2