docs+test #176/#177: 12 mechanisms refuted, apparatus shipped, probe protocol staged

The dungeon render pair (purple seam flash + stair pop-in) resisted
desk root-causing, but the investigation narrowed the space to two
live theories and shipped permanent apparatus:

- Issue176177DungeonSeamInspectionTests: dat truth — corridor floors
  ARE textured drawn PortalSide portal polys; the reciprocal is NoPos;
  the 'stairs' are 0x8A020182's ramp shell (vertical portals, zero
  statics); CellBSP partitions exactly at portal planes; DXT1 textures
  carry zero transparent-mode texels.
- Issue176177FacilityHubFloodReplayTests: production-matched flood
  replays — approach/descent/gaze-sweep/walk all healthy with coherent
  inputs; ScenarioE pins the flood's collapse-to-root sensitivity under
  incoherent (root, eye) pairs.
- Issue176177SeamTransitLagTests: the resolver flips cells within one
  tick-step of the portal plane — the 0.33-0.47m [cell-transit] 'lag'
  in the gate logs is speed*tick quantization, not membership error.

Refuted (do NOT retry — ledger in the research doc): placeholder
texture, reciprocal z-fight, seal z-fight (seals only fire for
OtherCellId==0xFFFF), root/eye incoherence (production camera sweep is
mm-exact at planes), flood bistability, #119-class statics, undefined
DXT mips (both paths decode DXT->RGBA8; the compressed-array branch is
dead code), DXT1 alpha, fog mix (ramp ~538m), lightning leak (flash==0
in production), viewer-light pops (smooth (1-d/range) ramp).

Filed #178 (A8 double-sided shell stopgap still live) and #179
(lightning flash lacks an indoor gate — dormant). The purple can only
be the fog clear color (undrawn pixels) or the outdoor ambient+sun
tint; discrimination needs ONE probe launch (ACDREAM_PROBE_LIGHT +
ACDREAM_PROBE_PVINPUT + ACDREAM_PROBE_CELL) — protocol in
docs/research/2026-07-06-176-177-render-pair-investigation.md.

Suites: Core 2587 / App 719 green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-05 21:20:03 +02:00
parent 544d4d3eef
commit b8e9e204ad
5 changed files with 1176 additions and 19 deletions

View file

@ -46,6 +46,52 @@ Copy this block when adding a new issue:
---
## #179 — Lightning flash has no indoor gate (dormant until weather strobes ship)
**Status:** OPEN (dormant — zero production impact today)
**Severity:** LOW (latent)
**Filed:** 2026-07-06
**Component:** render — scene lighting UBO / weather
**Description:** `mesh_modern.frag` adds `uFogParams.z × vec3(0.6, 0.6, 0.75)`
(the lightning-flash bump) to EVERY fragment, and `SceneLightingUbo.Build`
copies `atmo.LightningFlash` with no indoor gating (the GameWindow fog
override explicitly preserves `.z`). Today `WeatherState._flashLevel` is 0
in production ("Production never TriggerFlashes" — test hook only), so
nothing is visible. The moment storm strobes ship, sealed dungeons will
flash blue-violet with every strike. Retail's indoor lighting path (flat
ambient, sun killed via the seen_outside gate) carries no storm terms.
**Acceptance:** the flash term is zeroed for `playerInsideCell` frames (or
gated at the UBO build), verified by a storm-in-dungeon probe when weather
strobes land. Found during the #176/#177 investigation
(`docs/research/2026-07-06-176-177-render-pair-investigation.md`).
---
## #178 — Retire the A8 double-sided cell-shell stopgap (CullMode.Landblock → None)
**Status:** OPEN
**Severity:** LOW-MEDIUM (correctness/perf debt; 2× shell fragment load)
**Filed:** 2026-07-06
**Component:** render — EnvCellRenderer MDI draw
**Description:** `EnvCellRenderer.RenderModernMDIInternal` still carries the
Phase A8 visual-gate stopgap: `if (cullMode == CullMode.Landblock) cullMode
= CullMode.None;` — "render cell polys double-sided while the architectural
cause is isolated." Every cell shell draws two-sided to this day. Retail
draws cell polygons single-sided (the drawing BSP + winding decide facing).
The "architectural cause" (winding convention vs the frame-global CW
front-face) was never isolated; the stopgap outlived its gate. Retiring it
needs the winding audit (which side do CellStruct polys wind under our
extraction?) + a visual gate — walls/floors must not vanish.
**Acceptance:** cell shells draw with proper backface culling, no missing
surfaces at the Holtburg + Facility Hub gates. Found during the #176/#177
investigation (`docs/research/2026-07-06-176-177-render-pair-investigation.md`).
---
## #177 — Dungeon stairs pop in/out across levels (invisible until entering the room; last step vanishes running down)
**Status:** OPEN
@ -60,15 +106,18 @@ corridor, and (c) pops into existence on entering the room. Classic
portal-visibility miss: the stair geometry's cell is not reached by the
portal flood from the viewer's cell until the viewer crosses into it.
**Root cause / status:** unknown; the #119 class (visibility volumes /
portal flood), dungeon edition. Level connections here go through
floor-portal slabs (see the #137 topology notes — corridor floors are
portal polygons to under-rooms), which the render flood may treat
differently from wall portals. Read
`claude-memory/project_render_pipeline_digest.md` FIRST (Option A: one
DrawInside(viewer_cell); DO-NOT-RETRY table applies). Log
`launch-137-gate2.log` covers the session (cells around
`0x8A020182 → 0x8A020183` show a 6 → 9 level transition on stairs).
**Root cause / status:** INVESTIGATED 2026-07-06 (session 2) — the #119
class is REFUTED for this issue: the "stairs" are a RAMP owned by shell
cell 0x8A020182 (no statics anywhere near), connected by VERTICAL portals
(not floor-portals), and the portal flood admits 0x0182/0x0183 correctly
from every tested corridor eye/pitch (headless replays
`Issue176177FacilityHubFloodReplayTests`). Membership transits are
plane-exact; mesh/frustum/texture layers verified healthy. Twelve
candidate mechanisms refuted — full ledger + the surviving theories +
the ONE-launch probe protocol in
`docs/research/2026-07-06-176-177-render-pair-investigation.md`.
NEXT: run the probe protocol (ACDREAM_PROBE_LIGHT + ACDREAM_PROBE_PVINPUT
+ ACDREAM_PROBE_CELL) during the pending #175 door-gate launch.
**Acceptance:** the staircase renders whenever its room is visible through
the connecting opening, and stays rendered through the full descent.
@ -89,16 +138,20 @@ render; the physics fix landed (seam shake gone, user-gated) and the flash
REMAINS — so it is a render-side issue in its own right, correlated with
camera angle.
**Root cause / status:** unknown. Suggestive topology fact from the #137
work: the corridor floor tiles ARE portal polygons (PortalSide floor
portals to under-rooms — e.g. 0x8A02016E polys 1/3/5 → 0x011E, spans in
`Issue137CorridorSeamInspectionTests.CorridorCell_PortalPolygonWorldSpans`),
so "the floor at the seams" is exactly where portal surfaces live —
suspect the portal polygon being drawn with a placeholder/uninitialized
surface under some flood/culling state ([[feedback_ui_resolve_zero_magenta]]:
magenta = the 1×1 placeholder texture class). Angle-dependence points at
the visibility/stencil state, not geometry. Read
`claude-memory/project_render_pipeline_digest.md` FIRST.
**Root cause / status:** INVESTIGATED 2026-07-06 (session 2) — the
placeholder-texture theory is REFUTED (all surfaces resolve; the floor
IS drawn: the textured PortalSide floor-portal strips are included by
CellMesh.Build; the under-hall reciprocal is NoPos). So are eleven other
mechanisms (seal z-fight, root/eye incoherence, flood bistability, DXT
alpha/undefined mips, fog mix, lightning leak, viewer-light pops…) —
full refutation ledger, the two surviving theories (T-A outdoor-ambient
flip on playerRoot gaps: sun-on-floors explains the FLOOR selectivity;
T-B flood misbehavior under real production inputs), and the ONE-launch
probe protocol in
`docs/research/2026-07-06-176-177-render-pair-investigation.md`.
The purple itself can only be the fog-tinted clear color (undrawn
pixels) or the outdoor ambient+sun tint — every other purple source in
the pipeline is now excluded. NEXT: the probe launch (see #177).
**Acceptance:** no purple/placeholder flashes on dungeon floors from any
camera angle at the corridor seams.