From 4ba53f2edee089015c7b9af7c3f62b6f120d438e Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Sun, 16 Aug 2026 18:36:40 +0200 Subject: [PATCH] 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 --- OPSTACK-PROGRESS.md | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/OPSTACK-PROGRESS.md b/OPSTACK-PROGRESS.md index a5165e4..c94b263 100644 --- a/OPSTACK-PROGRESS.md +++ b/OPSTACK-PROGRESS.md @@ -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 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 10–30% 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.**