docs: close C2, sharpen the column-memo prediction, reassess REVIEW_FINDINGS

Reading session -- no build available, so: verify things instead of writing code.

- Cross-checked the eight stat declarations against their definitions and use
  sites. Identical. The one compile risk I had only eyeballed is now retired.

- REVIEW_FINDINGS: the GetDensityWithParams and BuildChunkCache splits are now
  counter-productive rather than optional -- the op stack is replacing the
  first, and FRoomGraphSource deliberately CALLS the second so a restructure
  forks what was kept unforked. The two passage enums are not duplicates and
  are UMETA-serialised into authored assets; merging them rewrites content for
  tidiness. Judged: leave, and close the item.

- CODEX-TASK-002's acceptance said "20-30% of lookups", a guess wearing a
  number. Replaced with arithmetic from the real grid: 1225 columns/tile over
  35 Z planes, load factor 0.299, ~317 colliding columns, ~12000 vs 1225
  computations = ~9.8x. Plus the reading rule that matters -- the overhang and
  cliff mods re-query the same XY and add HITS only, so compare the ratio of
  the two hypotheses, not an absolute percentage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 16:14:18 +02:00
parent b426cfcb0d
commit b5294b2d5b
3 changed files with 117 additions and 16 deletions
+56
View File
@@ -3497,3 +3497,59 @@ Three readings, and **the order matters**:
Also still unbuilt and riding along: `e002bd4` (VerticalShafts connector capsules) —
`Box verdicts over 60 VerticalShafts tiles`, **0 is the number to beat**, `violations` must stay 0.
## 2026-08-16 (d) — while Jahni was away: one bug closed on paper, one prediction sharpened
No build, no measurement available, so this was a reading session. Three results.
### 1. The last compile risk in `eb317d9` is mechanically gone
The one spot I could not rule out by eye was an identifier mismatch between the eight declarations in
`VoxelStats.h` and the eight `DEFINE_STAT`s in `VoxelStats.cpp`. Diffed the extracted symbol lists:
**identical**, and all eight use sites resolve to declared names. That risk is retired, not estimated.
### 2. ⛔ `AUDIT §C2` IS FULLY CLOSED — I was one step from spec'ing a fix for a solved bug
The handoff, the audit and my own memory all listed the live-edit half (`OC_Chunk`, `BM_Chunk`,
`FChunkBiomeCache`) as open. It is not, and has not been for a while. Every per-chunk cache carries
the layout version — `CP_Version`, `OC_Version`, `BM_Version`, `TC_SeenVersion` — and
`FChunkBiomeCache::Invalidate()` exists precisely because the validity box says nothing about the
`FBiomeContext` its cells were classified against; all four `thread_local` instances call it on a
version change. The only two other instances in the tree are **function-local**, built per task, so
they cannot go stale.
**Seventh time a confident premise reversed on reading.** The difference is that this one was checked
*before* the work rather than after: it cost a doc edit instead of a Codex run and a build cycle.
Recorded at `AUDIT-2026-07.md §C2` and struck from the handoff's open list.
### 3. The column-memo prediction is now arithmetic, not a band
`CODEX-TASK-002`'s acceptance said "2030 % of lookups", which was a guess wearing a number. The
inputs are all statically knowable, so they were read instead: `CHUNK_SIZE = 32`, `CellsPerAxis = 32`,
`GridDim = 33`, pre-sample loops over `g ∈ [-1, GridDim]` ⇒ **1225 columns per tile over 35 Z
planes** (the mesher's own "35³ floats" buffer comment confirms the dimension).
1225 keys in 4096 slots = load factor **0.299**; expected single-occupancy slots `4096·np(1-p)^(n-1)`
≈ 908, so **~317 columns (25.9 %) collide** and evict each other every plane. Op path ≈
`1225 + 34×317` ≈ **12 000** column computations per tile against the box's **1225**: **≈ 9.8×**.
⚠️ And the reading instruction changed with it: **compare the ratio of the two hypotheses, not an
absolute percentage.** The overhang and cliff mods call `GetColumn` again at the same XY, which adds
**hits only** — it drags the miss *rate* down without touching the verdict. The ~10× gap between
"confirmed" and "wrong" is what survives that.
### 4. `REVIEW_FINDINGS.md` reassessed — two items are now counter-productive, not merely optional
- `GetDensityWithParams` and `BuildChunkCache` splits: **don't.** The operator stack is *replacing*
the first archetype by archetype, so the split gets deleted and churns the eight bit-for-bit
equivalence tests; and `FRoomGraphSource` deliberately **calls** `BuildChunkCache` rather than
transcribing it, so restructuring forks the thing kept unforked on purpose. Both also sit on the
`§8.10` invariants, where a "behaviour-preserving" change once silently deleted the overhang.
- `EVoxelPassageType` vs `EVoxelPassageStyle`: **judged, leave them.** Not duplicates — one is the
global inter-strate bore shape, the other per-strate descent styling on `FStratePassageConfig`,
with different owners and value sets. Both are `UMETA`-tagged and therefore **serialised into
Jahni's authored strate assets**, so merging them rewrites saved content for cosmetic tidiness.
Recommend closing the item rather than acting on it.
- `GetGenerationParams` is flagged as the safest of the six if any is ever wanted.
Nothing here needs a decision from Jahni; it all needs the same next build.