diff --git a/docs/superpowers/specs/2026-06-02-phase-w-transition-membership-and-pview-render-design.md b/docs/superpowers/specs/2026-06-02-phase-w-transition-membership-and-pview-render-design.md index 963b26c..0f0af09 100644 --- a/docs/superpowers/specs/2026-06-02-phase-w-transition-membership-and-pview-render-design.md +++ b/docs/superpowers/specs/2026-06-02-phase-w-transition-membership-and-pview-render-design.md @@ -47,6 +47,39 @@ membership-return fix alone is expected to stop the flicker; the prune is correc after. (This makes the shipped W2b doubly wrong — wrong location *and* wrong mechanism — and it is reverted.) +## 1a. Stage-1 gate finding (2026-06-02) — the deeper root is `FindEnvCollisions:1947` + +Stage 1 (return `sp.CurCellId`) shipped (`3e1d502`) and was visually gated. **The doorway strobe +PERSISTS:** `[cell-transit]` (now fed by `sp.CurCellId`) still flips `0170↔0031` at a ~0.2 m +jitter. So the swept cell is itself tainted — Codex's "verify before delete" caution was correct. + +**Airtight root (code analysis):** `Transition.FindEnvCollisions` re-derives the cell from the +**static** sphere origin via `engine.ResolveCellId(sp.GlobalSphere[0].Origin, …)` at +`TransitionTypes.cs:1947` at the *start* of every sweep pass and overwrites `sp.CheckCellId` +(`:1949`). `ValidateTransition` then latches that into `sp.CurCellId`. This is a **second, earlier +static re-derive** the four studies under-analyzed (they all targeted the late return-site). It is +the **only** path that can set an indoor swept cell to outdoor: the containment pick +(`FindCellSet`/`BuildCellSetAndPickContaining` at `:2075`) skips outdoor landcells (no `CellBSP`), +so `:1947→:1949` is the sole outdoor-taint source. Stage 1's return fix was necessary but +insufficient; `:1947` is the load-bearing taint. + +**Why it's not a one-line delete:** `:1947` is dual-purpose — it is *both* the jitter source *and* +the only indoor→outdoor exit mechanism acdream has (naive removal fixes the strobe but strands the +player indoors, unable to walk out). Stage 2 must **replace** it with a retail-faithful directed +exit-portal crossing (`CEnvCell::find_transit_cells` exit-portal path — become outdoor by crossing +the doorway polygon, not by a static re-resolve) plus the `do_not_load_cells` prune for indoor +candidate stability, and re-gate `CellTransit.FindTransitCellsSphere`'s unconditional +`exitOutside=true` (`CellTransit.cs:95-123`). This is the genuine transition-cell-tracking rework; +it is `#98`-area (FindEnvCollisions/CheckOtherCells) and must be approached carefully, not guessed. + +**Render residuals seen at the Stage-1 gate (all expected; Stages 3-5):** outside-looking-in shows +no interior (walls/floor missing, cellar mouth shows ground) = no PView exterior→interior portal +(U.5); bluish background + all particles/NPCs at the threshold/stairs = ungated entities + the +strobe-induced render-root flip (Stage 2 stabilizes the flip; Stage 4 seals); sky-through-door is +blue/no-clouds and down/up portals show blue = `OutsideView`/portal not drawn (Stage 4); cellar +renders best (walls+roof) with a blue flicker over the exit = closest to sealed, residual portal. +None of these are Stage-1 regressions. + ## 2. Target architecture (retail-faithful) **One cell graph, one membership authority, render obeys it.**