docs(render): S3 chunk 4 fix round 1 — loop-shape weather pin, one weather gate, dead terrain-clip stack, sky drawn once

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-03 13:33:45 +02:00
parent 62c2231d0a
commit 386b1327b5
2 changed files with 59 additions and 2 deletions

View file

@ -730,6 +730,63 @@ DELETE (no retail counterpart):
- the register: no row is added (every deletion removes an acdream-only
rule); any KEEP item still lacking a CPU/GPU equivalence pin gets one.
### 10.4 Chunk 4 fix round 1 (lead, 2026-09-03, after the three-lens review of `6ba4b0b87`; round 1 of the two the plan allows)
Retail lens PASS. Build and renderer lenses FAIL on one blocking item plus
real leftovers. Every item lead-verified.
- **K1 — a once-per-frame weather pin that can fail (blocking).** The
replacement pin (`Assert.Single` over `DrawWeatherOnce` call sites) passes
with a `foreach` wrapped around the single call — the exact round-1
regression. IL-offset ORDER pins have now failed three times to be
discriminating; use a LOOP-SHAPE pin instead: with the existing
`CompiledCallGraph`/`CompiledBranch` reader, assert that NO backward branch
in `RetailPViewRenderer.DrawLandscapeDynamicsPhase` (a branch whose target
offset is lower than its own offset) spans the `DrawWeatherOnce` call's
offset. MUTATION: wrap the call in `foreach (var slice in
clipAssembly.OutsideViewSlices)` → the pin fails (quote it); restore.
- **K2 — one weather gate for the print and the draw (minor).** The Collect-
time `OC` print fires on `ctx.WeatherGateOpen`; the Replay draw adds a
second condition (`clipAssembly.OutsideViewSlices.Length > 0`). Derive BOTH
from one predicate on the frame context (the walk's own "a landscape turn
ran with the weather gate open") so the transcript can never report a
weather turn the frame did not draw; pin: gate closed → neither; gate open
→ both.
- **K3 — delete the dead terrain-clip producer stack (minor).** No producer
writes the terrain clip any more: delete `IWorldPassSurface.SetTerrainClip`,
`RhiWorldPassSurface.SetTerrainClip`, `ClipFrame.SetTerrainClip` and their
unit test, `PrepareClipFrame`'s terrain-clip publish half, and the
TerrainClip UBO section binding if no shader reads it (verify: if the
terrain/sky shaders declare the section, keep the section bound as an
all-zero disabled block and say so).
- **K4 — the sky is drawn ONCE, unclipped, like the terrain and the weather
(major, same rule).** `DrawWalkSky` still draws the sky dome per active view
under `BeginDoorwayScissor` + `BindTerrainClip` + `EnableClipDistances`.
Retail draws the sky once (`GameSky::Draw(sky, 0)` @0x0050633c) before the
blocks; aperture exactness for an interior root comes from the depth clear,
the exit seals and the interior repaint (§9 R4 / FW4 slice 6's own
argument). Draw it once at the Sky leaf, no scissor, no clip; then
`BeginDoorwayScissor`, `BindTerrainClip`, `EnableClipDistances`/
`DisableClipDistances` lose their last consumer — delete them with K3
(the `EnableClipDistances`/`DisableClipDistances` pair around the exit-seal
and punch draws is DIFFERENT: those are the kept translated clips — keep
those calls). Gate: the four-pose self-gate + the cathedral-arrival pose
show no sky through interior walls (the seals/repaint cover it).
- **K5 — plan inventory (note).** The plan's S5 cleanup inventory still lists
the six `ACDREAM_PROBE_CATHEDRAL_*` flags — the lead updates the plan.
- **K6 — the punch-fan equivalence pin runs through production (minor).**
Build the slice with `ClipFrameAssembler.Assemble` (the real
`outsideSlicesList.Add(new ClipViewSlice(slot, AabbOf(poly), planes))`
path) and read it back through `clipAssembly.OutsideViewSlices[i].Planes`,
not a hand-built `ClipViewSlice`.
- **K7 — restore the look-in slot assertion (note).** Put back the deleted
`Assert.NotEqual(0u, clipSlot)` on a look-in slice (the exit-seal KEEP
reads `_clipFrame.GetSlotPlanes(slice.ClipSlot)`).
- **K8 — the rain emitters now submit after the weather mesh (note).** Retail
imposes no order between acdream's two substitutes; state that in
`DrawWeatherOnce`'s comment so the order change is on record.
- Gates: §10.3 unchanged; InstalledDat exactly the four known failures.
## 11. Chunk 1 contract — transcript kinds, fixtures, and the print-only emitter (lead, 2026-09-03; runs AFTER chunk 3, because `LC`/`SC` only exist once terrain is per cell)
### 11.1 What exists (verified in the tree at `542b049b`)