Skip to content

test(cliffs): the grid-4 channel HAS an oracle now, and it moves the defect (#84) - #106

Merged
wormeyman merged 1 commit into
mainfrom
cliffs/grid4-band-oracle
Aug 3, 2026
Merged

test(cliffs): the grid-4 channel HAS an oracle now, and it moves the defect (#84)#106
wormeyman merged 1 commit into
mainfrom
cliffs/grid4-band-oracle

Conversation

@wormeyman

Copy link
Copy Markdown
Collaborator

Closes the blocker #84 named: the grid-4 cliff-elevation channel had no per-corner oracle. It needed no mod - the cliff generator is itself the readout.

With cliff_smoothing = 0 and cliff_elevation_interval = 1e6, crossesCliff collapses to min(a,b) < e0 <= max(a,b), so one run is a 1-bit comparator on all 4,225 corners of a region at once, and cliff_orientation says which side is high. The levels are the real bands (70 + 120k), which is the entire placement-relevant content of the channel: crossesCliff never compares the field against anything else.

richness = 4 was never opening the gate

Every collapsed arm since 2026-08-01 held the gate open that way. cliffiness_basic is clamp(0.5*log2(richness) + qmn, 0, 1) + 0.5, so at richness 4 the clamp is clamp(1 + qmn, 0, 1) - still 0, gate still shut, wherever qmn <= -1. Routing the cliffiness property at the literal 1 places strictly more cliffs at 13 of 15 levels, by up to 135 at one.

The second-order problem is worse: richness 4 shifts the clamp by exactly +1, so the corners that decide that gate are the ones the default field clamps flat - the 8,409-of-12,675 population no fixture validates. Both arms are captured for that reason.

What the oracle says

region bands verdict
[0,0] 70, 190, 310 EXACT, both arms
[-1200,800] 70, 190 EXACT, both arms (317/317, 407/407)
[1500,1500] 70 .. 1150 exact at 310/430/550, wrong at the HIGH bands

[1500,1500] constant-1 arm as wrong/surplus: L70 1/3, L190 2/2, L310 0/0, L430 0/0, L550 0/0, L670 8/5, L790 36/42, L910 22/41, L1030 2/2, L1150 2/2.

Two of three regions reproduce the game's cliffs exactly with nothing between the field and the placement.

Every cheap explanation eliminated, each with a control

  • Not the smoothing - it is 0.
  • Not the gate - constant by construction, and the disagreement is larger there than under richness 4.
  • Not fixImpossibleCells - 0 of the 73 disputed cells have a code our repair changed. (It is also working: turning it off makes agreement worse, 44 wrong vs 33 at L790.)
  • Not the rejections - a post-filter cannot alter a neighbour's orientation, and both sides place these cells.
  • Not the query window - centre-filtered, so test(cliffs): the recall gap was a QUERY-WINDOW ARTIFACT - recall is 0.9961 (#84) #101's bbox artefact is out.
  • Not a boundary tie - median 18.8, max 69.0 units from the level.

The paradox that replaces it

At 72 of 73 disputed edges the game's own tile channel straddles the level and agrees with our value (worst 18.9, almost all 0). So the game's cliff generator reads a field differing from the game's own calculate_tile_properties elevation there, while the port has the two equal.

multisample cannot be it: at those corners our grid-4 and grid-1 variants are identical, and the two natural widenings of the min-filter score 791 and 735 wrong against 73. It lives in the mountains branch of vulcanus_elev (the only branch reaching 670+) and is region-local.

Next: a fine level sweep (700..900 step 5 at [1500,1500]) brackets the game's cliff-channel value per corner and turns "differs by at least 69" into the actual field. ~40 runs, no new machinery.

Vacuity: perturbing the field by 0.5 fails 6 of the spec's 8 tests.

Item of #84; the issue stays open.

🤖 Generated with Claude Code

https://claude.ai/code/session_011DckiyMmb4zDPBV8NSyxTg

…defect (#84)

The blocker was "the grid-4 cliff-elevation channel has no per-corner oracle
at all". It needed no mod: the cliff generator is the readout, driven
through `cliff_settings`.

With `cliff_smoothing = 0` and `cliff_elevation_interval = 1e6`,
`crossesCliff` collapses to `min(a,b) < e0 <= max(a,b)`, so one run is a
1-bit comparator on all 4,225 corners of a region at once and the entity's
orientation says which side is high. The levels are the REAL bands
(70 + 120k) rather than a uniform sweep, because that is the entire
placement-relevant content of the channel - `crossesCliff` never compares
the field against anything else.

**`richness = 4` was never opening the gate.** `cliffiness_basic` is
`clamp(0.5*log2(richness) + qmn, 0, 1) + 0.5`, so at richness 4 the clamp is
`clamp(1 + qmn, 0, 1)` - still 0, gate still shut, wherever `qmn <= -1`.
Routing the `cliffiness` property at the literal 1 places strictly more
cliffs at 13 of 15 levels. Worse, richness 4 shifts the clamp by exactly +1,
so the corners deciding that gate are the 8,409-of-12,675 the default field
clamps flat - the population no fixture validates. Both arms are captured.

What it says:

- `[0,0]` and `[-1200,800]` are **EXACT at every band, both arms** - same
  cells, same orientations, nothing spare, with nothing between the field
  and the placement.
- `[1500,1500]` is exact at 310/430/550 and wrong at the HIGH bands
  (L790 36 wrong / 42 surplus, L910 22/41).

Every cheap explanation is eliminated with a control: not the smoothing
(off), not the gate (constant by construction, and the disagreement is
LARGER there), not `fixImpossibleCells` (0 of 73 disputed cells have a code
our repair changed), not the rejections (they cannot alter a neighbour's
orientation), not the query window (centre-filtered), not a boundary tie
(median 18.8, max 69.0 units from the level).

The paradox that replaces it: at **72 of 73** disputed edges the game's OWN
TILE channel straddles the level and agrees with our value. `multisample`
cannot be the difference - at those corners our grid-4 and grid-1 variants
are identical, and the two natural widenings of the min-filter score 791 and
735 wrong against 73. So it lives in the mountains branch of `vulcanus_elev`
and the port does not model it at all.

Vacuity: perturbing the field by 0.5 fails 6 of the spec's 8 tests.

Item of #84; the issue stays open.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011DckiyMmb4zDPBV8NSyxTg
@wormeyman
wormeyman merged commit c439ca1 into main Aug 3, 2026
2 checks passed
@wormeyman
wormeyman deleted the cliffs/grid4-band-oracle branch August 3, 2026 14:50
wormeyman added a commit that referenced this pull request Aug 3, 2026
…lusion (#84) (#107)

#106 concluded, from the band oracle, that the port's grid-4 cliff-elevation
field is wrong at [1500,1500]'s high bands, and handed over "it lives in the
mountains branch of vulcanus_elev". This sweep was run to quantify that. It
refutes it.

Sweeping `cliff_elevation_0` across [700,900] step 5 under the same
collapsed rule turns each placed cell's orientation into one-sided
constraints on its corners - a crossing at L says "this corner > L, that one
< L" - so 41 levels bracket a corner to the step. Only POSITIVE observations
are used, which is what makes it sound: an absent cliff is ambiguous (the
lava/ore rejections drop whole cells) but a present crossing is not, because
`fixImpossibleCellsSweep` only ever writes 0 and the rejections never touch
the edge registers.

- **996 of 998** two-sided brackets contain the port's value, mean bracket
  width **5.72**, in the worst region.
- The other two miss by **6.7e-4** - the port sits ON a swept level, where
  the strict test yields no observation. The open endpoint, not an error.
- At the disputed-edge corners: **26 of 26** bracketed ones contain it.

So the field is exonerated by direct measurement, and the lattice is
re-confirmed on the way: a wrong sampling site could not put 996 of 998
values inside 5-unit brackets.

**Where #106 went wrong.** It established what the residual is NOT (not
smoothing, not the gate, not the repair, not the rejections, not a boundary
tie) and treated the field as the last man standing - but it never measured
the game's field, only that OUR value sits a median 18.8 from the level.
"Everything else is excluded, so it must be X" is only as good as the list,
and the list was not closed. The lower bound was real; the attribution was
not. Same shape as #88.

What is left: across all 41 levels the game's code is the port's **minus
edges** in **1231 of 1235** disputed cells. The lead is the coverage number
- only 26 of 72 disputed corner slots get a bracket, and 661 of 1,659
corners in range get none, because the game emits nothing beside them. One
chunk at L=790 shows it directly: cell 1634,1706.5 keeps its TIGHT edge
(margin 5.9) and loses its WIDE one (margin 69), and the cell sharing that
wide edge is absent from the game entirely. That points at the
emission/rejection path - stated as a hypothesis, with the control named.

Determinism check: the two fixtures overlap at L=790 and agree 494/494.
Vacuity: shifting the field by 10 fails 3 of the spec's 5 tests.

Item of #84; the issue stays open.


Claude-Session: https://claude.ai/code/session_011DckiyMmb4zDPBV8NSyxTg

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
wormeyman added a commit that referenced this pull request Aug 3, 2026
…ot worth capturing (#84) (#109)

#108's handoff proposed ~40 more headless captures - "a sweep well outside
[700,900] is the measurement that would close the gap". Don't capture it.
`oracle-vulcanus-cliff-bands`'s constant1 arm already covers the SAME region
under the SAME collapsed rule at 70..1150, so its observations fold straight
into the fine sweep's and answer the question for free.

**The field's exoneration is much wider than #107 stated.** That PR checked
998 two-sided brackets and left the ONE-SIDED bounds unused - but those
falsify just as well, since "this corner is above 910" is refuted by a port
value of 800. **1,711 one-sided bounds, 0 contradicting the port.**

**The silence is not the field running out of range.** Widening the window 5x
rescues exactly **1** of the 681 corners the fine sweep left unbracketed. 294
corners whose port value sits in [700,900] get no constraint of any kind
across all 50 levels, while the port asserts **8,906** crossings on their
edges over the same levels - and there is not one of the 294 where the port
is silent too. A field error would have to move those corners outside
[70,1150] entirely AND leave all 1,711 one-sided bounds satisfied.

**Two suppressor candidates refuted, each against a base rate:**

| population | n | rock in box | default gate shut |
| --- | --- | --- | --- |
| matched (base) | 18654 | 7.03% | 46.0% |
| surplus | 1200 | 10.58% | 51.4% |
| wrong orientation | 693 | 5.05% | 44.9% |

Rocks - `wouldCollide`'s unported ENTITY half, the obvious candidate - do not
survive: 1.5x on the surplus is weak and the wrong-orientation cells are
ANTI-correlated at 5.05% against 7.03%. A suppressor cannot be
anti-correlated with half the defect it is supposed to cause.

**The gate row is worth more than the refutation it came from.** It was a
confound check, not a candidate: if routing `cliffiness` at a literal 1 had
silently not taken, the whole residual would just be the gate. The game emits
**8,588** cells the default gate would have blocked outright, so the routing
genuinely opened it - the collapsed-rule oracle that #106, #107 and #108 all
rest on is not confounded on this axis, which had never been checked.

Excluded for the suppression now: the field (twice over), rocks, the
cliffiness gate, the smoothing, the repair, and since #108 the STAGE. What
remains is WHICH cells the game refuses, and the list is stated as open -
#106's trap is available here, so the next candidate needs a positive
measurement rather than promotion by elimination.

Item of #84; the issue stays open.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ExK3ASs5i2KMm9NwWqnZuj
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.

1 participant