docs: T1.d is blocked by CONFIG not code (Cave Bail Not Op Stack = 80%); retract memo claim

Part B paid for itself on its first flight. Over the caves, Tiles Classified
== Tiles Meshed (nothing skipped at all) and CaveBailNotOpStack accounts for
~80% of cave-branch attempts. That counter has exactly one cause:
UsesOperatorStackForChunk returned false -- so either the strate flown over has
not ticked bUseOperatorStack, or a chunk in the tile's box belongs to an
adjacent strate that has not, since the per-chunk sweep requires every chunk to
agree. CaveBailStackVerdict being non-zero (0.32) corroborates: where the flag
did hold for the whole box, the stack built fine and merely returned Mixed.
The machinery works; it is mostly not being reached.

RETRACTION: I called the column-memo port a regression after comparing 14.7%
from one flight against 23.3% from another. Invalid -- the miss rate is
strongly location-dependent (~10-30%) and was in that band before the port.
Comparing single-flight averages from different routes measures the route. A
real before/after needs the same seed and route; parked until then, and not
urgent.

Kept while diagnosing: GSurfColCache is a 6-box LRU, not one box. My spec said
"a direct-indexed box" and Codex implemented one faithfully, so any recentre
now wipes all 6561 cells where the old table lost one entry. Plausible thrash
source, unmeasured. Port the LRU if the memo is revisited.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 18:36:40 +02:00
parent 3ad2720d0a
commit 4ba53f2ede
+55
View File
@@ -4019,3 +4019,58 @@ control flow of `ClassifyTile` is untouched, which is the invariant that matters
Good sign for `49a9959`, not proof — it was a race, and races hide. The stronger signal is the Good sign for `49a9959`, not proof — it was a race, and races hide. The stronger signal is the
absence of any `generation pause timed out` log: the drain completes well inside its 5 s deadline. absence of any `generation pause timed out` log: the drain completes well inside its 5 s deadline.
## 2026-08-16 (m) — ⚠️ T1.d's cause NAMED in one flight. And a retraction about the memo.
### ⛔ RETRACTION: "the column-memo fix made it worse" was a bad read
I compared 14.7% (one flight) against 23.3% (a different flight) and called the fix a regression.
**Invalid.** Jahni: *"it was already like that when I first told you about it, it just is very
random, being between 10 and I'd say at least 30% sometimes, not much the fix Codex just did."*
**The miss rate is strongly location-dependent — roughly 1030% depending on where you fly — and it
was in that band BEFORE the direct-indexed-box port.** Comparing single-flight averages from
different routes measures the route, not the change. The very error this project has a lesson for,
committed against my own instrument.
**The memo port is neither vindicated nor implicated.** A real before/after needs the *same seed
and the same route*, which is exactly the discipline used for the box-verdict numbers and which I
skipped here because a single average looked conclusive. **Do not re-litigate it from these
screenshots.** Parked until it can be measured properly; not urgent.
### 📌 Noted while diagnosing, worth keeping: the port is incomplete vs its reference
`GSurfColCache` is **not one box — it is a 6-box LRU** (`NumBoxes = 6`, `Acquire()` picks/evicts by
`LastUse`), each `Dim = 2·(CHUNK_SIZE+8)+1 = 81` square. My spec said "a direct-indexed box" and
Codex faithfully implemented **one**. Consequence: on a single box, *any* recentre (leaving the XY
footprint, or a `ColumnKey` change) wipes all 6561 cells, where the old hashed table lost exactly one
entry per key mismatch. With several strates or regions interleaved on one worker, that is a
plausible thrash source — **plausible, not measured.** If the memo is revisited, port the LRU too.
### ✅ THE REAL RESULT — Part B named T1.d's blocker on its first flight
Flying over the caves:
```
Tiles Classified 1.77 Tiles Meshed 1.77 ← nothing skipped at all
Cave Bail Not Op Stack 1.42 ← Cave Bail Stack Verdict 0.32
Cave Bail Params 0.03 Cave Bail Mixed Content (never fired)
```
**`CaveBailNotOpStack` accounts for ~80% of cave-branch attempts.** That counter fires on exactly one
condition: `UVoxelStrateManager::UsesOperatorStackForChunk(CC)` returned **false** — either the
initial check or the per-chunk sweep over every chunk the tile's box touches.
⚠️ **So T1.d is blocked by CONFIGURATION, not by code.** All 8 archetypes are in the ported list, so a
`false` means either `bUseOperatorStack` is not ticked on the strate being flown over, or a chunk in
the box belongs to an adjacent strate that has not ticked it — the sweep requires **every** chunk in
the box to agree, so one un-ticked neighbour kills boundary tiles.
That `Cave Bail Stack Verdict = 0.32` is non-zero is the corroborating detail: for those tiles the
flag *was* on for the whole box and the stack built fine — the verdict itself came back `Mixed`.
So the machinery works; it is mostly not being reached.
**Next step is Jahni's, and it is not a code change:** confirm which strate assets actually have
`bUseOperatorStack` ticked. This is the second time today that a fact living in `.uasset` data
drove hours of work in the wrong direction — see 2026-08-16 (h). **The counter did in one flight what
six hours of reasoning could not: it named the cause instead of listing candidates.**