test(cliffs): the crater RNG hypothesis is UNSUPPORTED - n is 1 (#84) - #136
Merged
Conversation
#130 proposed a mechanism class new to #84 - entity autoplace ROLLS, so removing calcite shifts the per-chunk RNG stream - and said "nothing here tests it". This is that test. No capture: every fact is in fixtures already committed, one of them since #111. The hypothesis is not refuted. The evidence for it is. 1. **n is ONE crater, not eight.** The eight `crater-cliff` entities are eight segments of a single ring - centre (1646.62, 1679.75), radii 4.95 to 7.00, against the prototype's own `crater_radius = 7`. FFF #386 describes exactly that. Effective sample size 1; #130's table invites reading it as 8. 2. **The spatial reading would have been vacuous.** All eight sit within 0.33 tiles of a calcite entity - and their chunk holds 805 calcite over 1024 tiles, 78.6% coverage. Landing on calcite there is expected. 3. **#130's `geyser OFF` control is VACUOUS.** Zero geysers in the ring's chunk; all 19 are in (48,48), (48,49), (53,54). The lever works globally - removes all 19, moves cliff-vulcanus 885 -> 889 - and cannot touch that chunk's stream by construction. 4. **A lever unrelated to calcite also produces craters**, unread in the #111 fixture: `LAVA TILES OFF only` gives 7 craters with resources still ON, and both levers together give 18 against 8 and 7 alone. 5. **And that row is a data fact.** `crater-cliff` overrides the default cliff mask with `{item, object, player, water_tile}`, and on Vulcanus only lava and lava-hot carry `water_tile`. No RNG needed. Calcite's own route stays open, with two more closed by reading rather than assuming: not entity collision (`resource` mask is `{resource}`, disjoint from every cliff mask including crater-cliff's - #124's argument extended rather than carried over), and not lava tiles (#128 measured zero blocking tiles moved). A third fact from the same file closes a route this session had to consider: the default `cliff` mask carries `not_colliding_with_itself = true`, so cliffs never collide with same-prototype cliffs. That matters because `applyCliffs` adds each cliff to the surface before testing the next, and 57 of 400 adjacent orientation pairs have overlapping boxes. No new fixtures, no shipping behaviour change. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmitdaFJxN9Wm8LkQu33kc
This was referenced Aug 4, 2026
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.
#130 proposed a mechanism class new to #84 — entity autoplace rolls, so removing calcite shifts the per-chunk RNG stream — and honestly marked itself "a hypothesis, not a result: nothing here tests it". This is that test.
No capture. Every fact below is in fixtures already committed, one of them since #111.
The hypothesis is not refuted. The evidence for it is.
1. n is ONE crater, not eight
The eight
crater-cliffentities are eight segments of a single ring — centre(1646.62, 1679.75), radii 4.95 to 7.00, against the prototype's owncrater_radius = 7. FFF #386 describes exactly this: "a ring of special cliffs where sections of the ring can randomly be removed."Effective sample size 1. #130's table invites reading it as 8.
2. The spatial reading would have been vacuous
All eight segments sit within 0.33 tiles of a calcite entity — which looks decisive and is not. Their chunk
(51,52)holds 805 calcite entities over 1024 tiles, 78.6% coverage. A ring landing on calcite there is the expected outcome.3. #130's control row is VACUOUS
It offers "geyser OFF → 0 craters" as the arm separating calcite from resources generally. There are zero geysers in the ring's chunk — all 19 are in
(48,48),(48,49),(53,54). The lever works globally (removes all 19, movescliff-vulcanus885 → 889) and cannot touch that chunk's stream by construction. Both halves are asserted, because "the lever did something" and "it did nothing here" are different claims.4. A lever unrelated to calcite also produces craters
Sitting unread in
oracle-vulcanus-cliff-suppressor-leverssince #111:cliff-vulcanuscrater-cliffCraters appear with calcite still ON. Every #84 spec filters to
name === "cliff-vulcanus", so the column was never looked at — the same failure #94 caught once already, in the same investigation.5. And that row is a data fact, not a hypothesis
crater-cliffoverrides the default cliff mask with an explicit{item, object, player, water_tile}. On Vulcanus onlylavaandlava-hotcarrywater_tile. Lava blocks crater segments by prototype; row 3 needs no RNG at all.Where calcite stands
Its route is still unexplained and the RNG stream is still the only unclosed candidate. Two others are now closed by reading rather than assuming:
core/lualib/collision-mask-defaults.luagivesresourcethe mask{resource}, disjoint from every cliff mask includingcrater-cliff's. That is test(cliffs): the ore rule is NOT entity collision, and it acts at the destroy stage (#84) #124's prototype-level argument extended to the second entity type rather than assumed to carry over.A third fact from the same file closes a route this session had to consider: the default
cliffmask carriesnot_colliding_with_itself = true, so cliffs never collide with cliffs of their own prototype. That matters becauseapplyCliffsadds each cliff to the surface before testing the next one, and 57 of 400 adjacent orientation pairs have overlapping boxes — without the flag the entire run would be placement-order dependent.Status and the real test
UNSUPPORTED, not refuted. Testing it properly needs a lever that changes the roll count in the ring's own chunk without touching that chunk's tiles or lava — switching off one of the rock prototypes listed before
crater-cliffinautoplace_settings.entitywould do it. One capture arm, and worth having a real control before spending it.No new fixtures, no shipping behaviour change.
pnpm run verifygreen (183 files, 1514 tests).🤖 Generated with Claude Code
https://claude.ai/code/session_01MmitdaFJxN9Wm8LkQu33kc