Skip to content

Commit 774ceed

Browse files
wormeymanclaude
andauthored
test(cliffs): two LEVERS - no entity suppresses a cliff, lava is 166/169 (#84) (#111)
#110 asked for a lever that isolates the non-ore suppressor the way `autoplace_controls` isolated the ore, with the suspect unnamed. This adds two, through `map_gen_settings.autoplace_settings` - a knob `autoplace_controls` cannot reach, since a control only touches prototypes that name one and the rocks, chimneys and `crater-cliff` name none. **No placed entity suppresses a Vulcanus cliff.** Switching the whole `entity` category off removes 409 rocks, 115 chimneys, 45 rock explosions and all 8 `crater-cliff`s, and the cliff set does not move by one cell. Rocks were previously refuted only statistically against our own rock model (#109); this is the class excluded positively, with the lever's own proof in the same run three ways. **Cliffs do not collide with each other**, refuted by the game's own output rather than a model: 293 pairs of its own cliffs have overlapping collision rectangles. **Lava suppresses 169 cells and our rejection gets 166, with 5 false positives** - precision 0.9708, recall 0.9822, the first real score that rule has had. Its errors ARE the residual: the 3 it misses are 3 of the 10 surplus cells and the 5 it invents include all 3 of the port's missing ones. They point both ways, so the box's shape is wrong rather than its size - left measured and unfixed, per #88. **With neither ore nor lava, recall is 1.0000** (1049 matched, 9 wrong, 12 surplus, 0 missing of 1058). The port produces a strict superset of the game's cells, so everything left is over-placement and the question is now what else the game refuses. Claude-Session: https://claude.ai/code/session_015C8AbtvYMdc7ed3rnAZbhP Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 96d076e commit 774ceed

6 files changed

Lines changed: 46793 additions & 3 deletions

File tree

docs/noise/vulcanus-cliffs-NOTES.md

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2193,3 +2193,118 @@ Running BOTH sides with the resources off isolates it:
21932193
So 13 wrong orientations and 10 surplus cells survive with the ore entirely out
21942194
of the picture. Tuning the ore rule cannot reach them, and that non-ore half is
21952195
the larger target now.
2196+
2197+
## Two LEVERS: no entity suppresses a cliff, and the lava rule is 166/169 (2026-08-03, #84)
2198+
2199+
#110 handed over "find a lever that isolates the non-ore suppressor the way
2200+
`autoplace_controls` isolated the ore", with the suspect unnamed.
2201+
`oracle-vulcanus-cliff-suppressor-levers` supplies two, through
2202+
`map_gen_settings.autoplace_settings` - a knob `autoplace_controls` cannot
2203+
reach, because a control only touches prototypes that name one, and the rocks,
2204+
the chimneys and `crater-cliff` name none.
2205+
`test/vulcanusCliffSuppressorLevers.spec.ts`.
2206+
2207+
### The entity class is excluded POSITIVELY
2208+
2209+
Switching the whole `entity` category off (`treat_missing_as_default = false`,
2210+
empty settings) removes every autoplaced entity in the region - **409 rocks, 115
2211+
chimneys, 45 rock explosions and all 8 `crater-cliff`s** - and the cliff set does
2212+
not move by one cell: same 916 cells, same orientations, bit for bit.
2213+
2214+
Rocks were previously refuted only statistically, against the port's OWN rock
2215+
model (#109). This is the whole class, measured, with the lever's own proof in
2216+
the same run three ways: the `autoplace_settings` read back off the surface, the
2217+
569 entities that vanished, and the crater ring that went with them. The
2218+
vacuity arm runs the other way too - `cliff-vulcanus` comes from `cliff_settings`
2219+
rather than the category, so it must SURVIVE the lever, and it does.
2220+
2221+
`crater-cliff` is worth a line of its own: it is a real Vulcanus feature the port
2222+
does not model (8 entities in a radius-7 ring at `(1646.6, 1679.75)`, present
2223+
only when calcite is off), and every spec's `name === "cliff-vulcanus"` filter
2224+
had been discarding it - the same trap as #94. It is not the residual: the whole
2225+
ring is 47 to 180 tiles from the nearest disputed cell.
2226+
2227+
### Cliffs do not collide with each other
2228+
2229+
The tempting candidate, since a cliff IS an entity with a collision box and
2230+
`tryToAddCliff` adds them one at a time. Refuted by the game's own output rather
2231+
than by a model: **293 pairs of the game's own cliffs have overlapping collision
2232+
rectangles**. No model needed and no scoring - whatever that call tests, it is
2233+
not this. (The port's own set reports 299, so the counter is not dead.)
2234+
2235+
### The lava lever, and the rejection's first precision/recall
2236+
2237+
Dropping `lava`/`lava-hot` from the TILE category leaves the elevation the
2238+
crossings read untouched - tiles are downstream of it - and takes away the only
2239+
thing the tile test can reject against. The cells that appear are the game's own
2240+
answer to which cliffs lava suppresses.
2241+
2242+
| | |
2243+
| --- | --- |
2244+
| lava tiles in the region, on / off | **6709** (2466 + 4243) / **0** |
2245+
| game cells, lava on / off | 892 / 1058 |
2246+
| cells lava suppresses | **169** |
2247+
| cells that DISAPPEAR when lava is added back | 3 |
2248+
| our rejection fires on | **171**, of which true **166** |
2249+
| | **precision 0.9708, recall 0.9822** |
2250+
2251+
Until now this rule was scored only by how much it improved the totals (#84 item
2252+
1: "drops 198 cells, 185 false positives and 13 true"), which cannot tell a rule
2253+
that is right from one that is merely profitable.
2254+
2255+
**Its errors are the residual, not a scatter.** With 1,058 cells to be wrong
2256+
about, all 8 land inside the 26 the port already disputes:
2257+
2258+
- the **3** suppressions we miss - `1658,1598.5`, `1662,1630.5`, `1722,1630.5` -
2259+
are 3 of the 10 surplus cells;
2260+
- the **5** false rejections include all **3** of the port's missing cells -
2261+
`1638,1598.5`, `1638,1602.5`, `1662,1634.5`.
2262+
2263+
They point BOTH WAYS, which a box uniformly too small or too big cannot produce.
2264+
The shape is wrong, not the size - and that is precisely the thing #88 says must
2265+
not be tuned until it fits, so it is left measured and unfixed.
2266+
2267+
### The sharpest statement of the residual there has been
2268+
2269+
With neither ore nor lava in the world:
2270+
2271+
| | matched | wrong | surplus | missing |
2272+
| --- | --- | --- | --- | --- |
2273+
| `[1500,1500]`, both sides, no ore, no lava | **1049** | 9 | 12 | **0** |
2274+
2275+
**Recall 1.0000.** The crossing field plus the repair produce a strict SUPERSET
2276+
of the game's cells, so everything left is over-placement and the two rejections
2277+
are the only things that can remove one. That reframes the target: the question
2278+
is no longer "what does the port miss" but "what else does the game refuse".
2279+
2280+
The 12 surplus cells sit in four tight clusters, each the same shape - the port
2281+
runs a cliff one or two cells past where the game's run ends in an entrance
2282+
orientation - and the 9 wrong orientations are the far side of those same edges
2283+
(#103), not a separate defect.
2284+
2285+
### What led here, and what it is worth as a lead
2286+
2287+
The lava lever was not a guess. Measuring each cell's gap from its collision box
2288+
to the nearest tile the resolver calls lava, against the matched cells as
2289+
control:
2290+
2291+
| population | n | lava within 2 tiles of the box |
2292+
| --- | --- | --- |
2293+
| matched (control) | 876 | 9 = **1.0%** |
2294+
| surplus | 10 | 4 = **40%** |
2295+
| wrong | 13 | 5 = **38%** |
2296+
2297+
A 40x enrichment. Two cautions are kept with it rather than dropped: the
2298+
effective sample size is the number of CLUSTERS, four, not 23 cells - and one
2299+
cluster, `[1742..1746, 1530..1542]`, has no lava within 10 tiles at all. The
2300+
lever confirms that reservation: that cluster survives with lava gone from the
2301+
world entirely.
2302+
2303+
### Where that leaves it
2304+
2305+
Still open, and the exclusion list is still open on principle (#106 -> #107).
2306+
What is now excluded with a positive measurement rather than by elimination: the
2307+
whole entity class, cliff-on-cliff collision, and - for 166 of 169 cells - lava.
2308+
Of the four surviving clusters, none is ore, none is lava, and none is an entity.
2309+
The next question is what else the game refuses, and the useful new constraint is
2310+
that whatever it is only ever REMOVES: the port under-places nothing.

test/fixtures/PROVENANCE.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,10 @@
220220
"factorioVersion": "2.1.12",
221221
"evidence": "captured 2026-08-03 by test/oracle/capture.ts vulcanus-cliff-fine-sweep against the installed binary, which pnpm refs:sync --check reported in sync at 2.1.12 at capture time. The Vulcanus region [1500,1500] at 41 values of cliff_elevation_0 (700..900 step 5) with the rule collapsed (cliff_smoothing=0, cliff_elevation_interval=1e6) and the cliffiness gate held open by routing the cliffiness PROPERTY at the literal 1. Each placed cell's orientation asserts one-sided constraints on its corners, so the sweep brackets the grid-4 cliff-elevation field to the step - it MEASURES the field oracle-vulcanus-cliff-bands could only bound from below. Overlaps that fixture at L=790 and reproduces it cell-for-cell (494/494), which is the determinism check. Each case records the cliff_settings the SURFACE reported back."
222222
},
223+
"oracle-vulcanus-cliff-suppressor-levers.seed123456.json": {
224+
"factorioVersion": "2.1.12",
225+
"evidence": "captured 2026-08-03 by test/oracle/capture.ts vulcanus-cliff-suppressor-levers against the installed binary, which pnpm refs:sync --check reported in sync at 2.1.12 at capture time. Five arms over [1500,1500] that pull two LEVERS through map_gen_settings.autoplace_settings rather than modelling a suppressor: the whole entity category off (treat_missing_as_default = false, no settings), and lava/lava-hot dropped from the tile category while every other tile is kept. Each arm reads the autoplace_settings the SURFACE reported back AND counts the lava tiles in the region it just generated, so an override that failed to apply cannot pass as a term that does not matter; the two entity-lever arms additionally dump EVERY entity in the region with its type, and every arm dumps the prototype collision geometry, all from ONE generated surface.\n\nSeed forced to 123456 on a create_surface() Vulcanus surface, like every other Vulcanus cliff fixture."
226+
},
223227
"oracle-vulcanus-cliff-ore-direction.seed123456.json": {
224228
"factorioVersion": "2.1.12",
225229
"evidence": "captured 2026-08-02 by test/oracle/capture.ts vulcanus-cliff-ore-direction against the installed binary, which pnpm refs:sync --check reported in sync at 2.1.12 at capture time. Six paired ON/OFF arms that turn the Vulcanus resources off through map_gen_settings.autoplace_controls (size = 0) and regenerate: [1500,1500] at default cliff settings with all resources on, all off, calcite only off and geyser only off, plus [0,0] with the cliff rule collapsed to a single contour at 70 with the gate held open and smoothing off, resources on and off. Each case records the autoplace controls AND the cliff_settings the SURFACE reported back, so every override is proven to have applied, and each dumps the cliffs, the resources and the prototype collision geometry from ONE generated surface so the two populations are never compared across separate worlds."

0 commit comments

Comments
 (0)