|
23 | 23 | > the last two sections, which are post-fix and are where this banner's numbers |
24 | 24 | > come from. Each of the last three corrects the one before it - read all three, |
25 | 25 | > in order, or you will act on a superseded number. |
| 26 | +> |
| 27 | +> ## UPDATE, 2026-08-02: the FIELD is exonerated; the residual is two defects |
| 28 | +> |
| 29 | +> The last section, **`## The residual is TWO defects, and the field is not |
| 30 | +> either of them`**, supersedes the "the defect is in the grid-4 cliff-elevation |
| 31 | +> field" lead that #91 handed over. That field is now measured correct, along |
| 32 | +> with `cliffiness_basic` (over its unclamped corners), the smoothing stencil on |
| 33 | +> both axes, and `cliff_smoothing = 1` read back from the game. Read that section |
| 34 | +> before touching anything: **with `cliff_smoothing = 0` the port is exact at |
| 35 | +> `[0,0]` and `[-1200,800]` and still 21-wrong at `[1500,1500]`**, so there is no |
| 36 | +> single cause left to look for. |
26 | 37 |
|
27 | 38 | Factorio 2.1.12 (build 87038, mac-arm64). Ported 2026-07-26. Companion to |
28 | 39 | `cliffs-NOTES.md`, which holds the reverse-engineering of the placement rule |
@@ -1204,3 +1215,108 @@ prompt to find the independent evidence, not as the evidence. |
1204 | 1215 | The route that worked here was: stop tuning shapes against the metric, and go |
1205 | 1216 | read what the engine does. The binary is unstripped and the whole chain took |
1206 | 1217 | three `lldb` calls. |
| 1218 | + |
| 1219 | +## The residual is TWO defects, and the field is not either of them (2026-08-02) |
| 1220 | + |
| 1221 | +The handoff into this session (#91) named one lead: "the defect is in the |
| 1222 | +**grid-4 cliff-elevation field** - the one input in the chain with no direct |
| 1223 | +per-corner oracle", with the next step being to capture `cliff_elevation` at the |
| 1224 | +4-tile corner lattice. **That lead is refuted.** The grid-4 field is correct, and |
| 1225 | +so is everything else upstream of the crossing test. What is left splits into two |
| 1226 | +defects that live in different regions and have different causes, which is why a |
| 1227 | +single number ("37 wrong orientations") could never be chased to a single cause. |
| 1228 | + |
| 1229 | +### What was eliminated, and how |
| 1230 | + |
| 1231 | +Each of these is a measurement, not a reading. Do not re-derive them. |
| 1232 | + |
| 1233 | +| input | verdict | how | |
| 1234 | +| --- | --- | --- | |
| 1235 | +| grid-1 `vulcanus_elevation` | exact, worst **4.8e-2** | all **12,675** corners of `oracle-vulcanus-cliff-corner-fields-entity-regions` | |
| 1236 | +| grid-4 `multisample` min-filter | exact | through the CLIFF GENERATOR at `[0,0]` **and** `[1500,1500]`; grid 1 / 2 / 8 / centred all score far worse | |
| 1237 | +| `multisample(e, 0, 0)` | the identity in this channel | arm A ≡ arm B, cell for cell, both regions | |
| 1238 | +| `cliffiness_basic` | exact, worst **6.4e-6** | over the **4,266 UNCLAMPED** corners (see the vacuity note below) | |
| 1239 | +| `cliff_smoothing = 1` | **measured**, not inferred | read back off the planet's own surface with nothing overridden | |
| 1240 | +| the smoothing stencil | exact | delta probe, both axes, `test/cliffSmoothingModel.spec.ts` | |
| 1241 | +| `crossesCliff` | exact | disassembly, `0x10160c914` | |
| 1242 | +| `crossingsForChunk`'s smoothing | matches `smoothingKnots` | disassembly, `0x10160c9cc` (**the VA in cliffs-NOTES.md had moved**) | |
| 1243 | +| `fixImpossibleCells` give-up branch | never fires | **0** chunks in these regions need even one retry | |
| 1244 | + |
| 1245 | +Two of those deserve their own note. |
| 1246 | + |
| 1247 | +**The `cliffiness_basic` exoneration was two-thirds vacuous and is now not.** |
| 1248 | +`cliffiness_basic` is `clamp(qmn, 0, 1) + 0.5`, and **8,409 of the 12,675 |
| 1249 | +captured corners sit ON a clamp** (6,330 at the floor, 2,079 at the ceiling). |
| 1250 | +Agreeing there says nothing whatever about `qmn`; it says both sides clamped. The |
| 1251 | +comparison that carries information is the 4,266-corner interior, and it agrees |
| 1252 | +to 6.4e-6. Any future "field X is exact" claim about a clamped expression has to |
| 1253 | +report the interior separately or it is measuring the clamp. |
| 1254 | + |
| 1255 | +**The smoothing stencil was measured, not just disassembled.** The probe is a |
| 1256 | +DELTA on one corner column: `1 + 1000 * if(1 - abs(x - X0), 1, 0)` routed onto |
| 1257 | +`cliff_elevation` with smoothing left at 1. Every corner but one carries the |
| 1258 | +constant 1, so the smoothed field is exactly `1 + 1000 * w(i)` for the stencil |
| 1259 | +weight `w`, and the game's cliffs trace `w = 0.5` directly. The design's teeth |
| 1260 | +are the **in-chunk-index-3 arms**: 3 is not a knot, so the model predicts the game |
| 1261 | +places *nothing at all*, and the game places nothing at all. An arm whose |
| 1262 | +predicted output is EMPTY cannot be satisfied by a stencil that is merely close - |
| 1263 | +which is the failure mode of every weight-matching check. |
| 1264 | + |
| 1265 | +### The split |
| 1266 | + |
| 1267 | +Force `cliff_smoothing = 0` and leave every other term real, and the port's |
| 1268 | +grid-4 field is scored with no interpolation in the way: |
| 1269 | + |
| 1270 | +| region | smoothing = 0 | smoothing = 1 (ships) | |
| 1271 | +| --- | --- | --- | |
| 1272 | +| `[0,0]` | **0** wrong | 7 wrong | |
| 1273 | +| `[-1200,800]` | **0** wrong, precision 1.0000 | 4 wrong | |
| 1274 | +| `[1500,1500]` | **21** wrong | 26 wrong | |
| 1275 | + |
| 1276 | +So `[0,0]` and `[-1200,800]` carry a defect that exists ONLY under smoothing, |
| 1277 | +while `[1500,1500]` carries one that survives smoothing being switched off |
| 1278 | +entirely. `[1500,1500]`'s 21 are all **over-detections**, all at the HIGH bands |
| 1279 | +(670 / 790 / 1030), with margins of **0.69 - 46.6 elevation units** - far too |
| 1280 | +large for float32, and the cliffiness there sits up to 1.0 clear of its gate. |
| 1281 | + |
| 1282 | +**This is why one region was never enough.** `[0,0]` alone says "smoothing off is |
| 1283 | +exact, therefore the residual is the smoothing", and that is false for 21 of the |
| 1284 | +37. Two of three regions agreeing is exactly the evidence that produces a |
| 1285 | +confident wrong conclusion - the same shape as #88. |
| 1286 | + |
| 1287 | +Note also what this does to `docs/noise/...` note "cliff_smoothing is NOT the |
| 1288 | +residual (#79, #80)". That was measured **before #83 fixed the multisample grid**, |
| 1289 | +when the field was wrong everywhere and so nothing downstream could be scored. It |
| 1290 | +has expired: with the field right, smoothing off is exact in two regions of three. |
| 1291 | + |
| 1292 | +### The smoothing-side defect is NOT in the stencil |
| 1293 | + |
| 1294 | +The stencil arms are exact in six of eight; the two that are not are exact |
| 1295 | +everywhere except one four-cell vertical run at `x = 1750`, rows 1526.5-1538.5, |
| 1296 | +which appears in both arms regardless of which delta column is used. It is not |
| 1297 | +the collision rejection - the game's tiles over `x 1742..1760, y 1518..1546` are |
| 1298 | +all `volcanic-*` ground tiles with **no lava at all**, and only `lava`/`lava-hot` |
| 1299 | +carry the `water_tile` layer the cliff mask collides with. |
| 1300 | + |
| 1301 | +That is the same signature as the `[0,0]` **blob** below, and they are probably |
| 1302 | +one thing. |
| 1303 | + |
| 1304 | +### The blob: a place the game puts no cliff, whatever field it is given |
| 1305 | + |
| 1306 | +`#84` item 2 ("over-placement below elevation 120") is not spread over the low |
| 1307 | +band at all. In region `[0,0]` **every** excess cell, at every level of the |
| 1308 | +19-level sweep and in both probe arms, sits in one contiguous patch: cells |
| 1309 | +`cx 43-48, cy 34-40` (world `x 172-196, y 136-164`). The game places **zero** |
| 1310 | +cliffs there under real settings, under all four collapsed arms, at all 19 sweep |
| 1311 | +levels, and with a completely synthetic `cliff_elevation` routed onto it. |
| 1312 | + |
| 1313 | +A field-independent hole is not a field error. The obvious suspect, lava, is |
| 1314 | +mostly ruled out: most of those cells have no lava within 10 tiles by our |
| 1315 | +resolver, and our resolver is right about lava there to 4 tiles in 483 (those 4 |
| 1316 | +being lava the game HAS and we miss - note the 994-position capture that |
| 1317 | +"exonerated the mask" sampled neighbourhoods of tiles OUR mask calls lava and |
| 1318 | +therefore structurally could not find that class of error). |
| 1319 | + |
| 1320 | +**This is the sharpest open lead**, and a much better one than "we over-place at |
| 1321 | +low elevation": it is a bounded, contiguous, field-independent suppression, so |
| 1322 | +whatever causes it is a rule the port does not implement at all. |
0 commit comments