docs: #118 narrowed - partition + per-tick ParentCellId exonerated; decision-stack candidates + exit-walk harness design recorded

Read-level exonerations: the local player routes to Dynamics correctly
(ServerGuid set), and its entity ParentCellId syncs per tick from the
controller - neither is the vanish mechanism. Live candidates are the
doorway-crossing decision stack: (a) eye/cell incoherence under camera
damping (the verified #115/BR-8a divergence - we damp from our own
damped eye while the root comes from the swept cell), (b) the
exit-portal side test culling the OutsideView when the eye is
epsilon-outside while the root is still interior (retail's
AdjustPosition demotes the viewer cell the same moment), (c) the
aperture-cone tightness for an outdoor player with an indoor viewer.
Next step is the deterministic exit-walk harness (all-CPU drive of the
production decision stack over the corner-building cells); designed in
the issue entry, queued for a focused session.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-11 16:11:54 +02:00
parent 478c549b9e
commit 0e6e24faf6

View file

@ -3946,13 +3946,36 @@ AFTER the punch. Compare against the T1 (`579c8b0`) punch pass wiring.
Like when we are just outside for a moment." Transition frames where the Like when we are just outside for a moment." Transition frames where the
viewer is still indoors and the player is just outside the door. viewer is still indoors and the player is just outside the door.
**Suspects (in order):** (1) the LOCAL player entity's partition in **Narrowed (2026-06-11 post-T5 session — two suspects EXONERATED by
`InteriorEntityPartition` — T1's rule routes `ServerGuid != 0` to read):** (1) the partition is correct — the local player entity carries
Dynamics (never dropped); the local player may carry ServerGuid==0 and its ServerGuid and routes to Dynamics; (2) the entity's `ParentCellId` is
fall into a per-cell static class that drops when its cell isn't in the NOT stale — it syncs per tick from the controller
flood; (2) the landscape-through-aperture pass's plane clips slicing the (`pe.ParentCellId = result.CellId`, GameWindow ~6855).
player if it draws in that pass ("clipped" wording). Check the partition
first. **Live candidates (the doorway-crossing decision stack):**
- **Eye/cell incoherence under camera damping (#115 family / BR-8a):**
the render root comes from the sweep (`RetailChaseCamera.ViewerCellId`)
while the projection eye (`camPos`) is the DAMPED position — during a
crossing they can disagree by the damping lag. Retail damps FROM the
published collided viewer (verified divergence, plan BR-8a), so its
(eye, cell) pair stays coherent.
- **Exit-portal side test at the threshold:** with the eye ε-outside the
door plane while the root is still the interior cell,
`CameraOnInteriorSide` culls the exit portal → OutsideView EMPTY →
`SphereVisibleOutside` culls ALL outdoor dynamics (the player) for
those frames. Retail's AdjustPosition demotes the viewer cell to
outdoor the moment the point exits (seen_outside → adjust_to_outside),
making the inconsistent state structurally brief.
- The doorway-aperture cone test for an outdoor-classified player while
the viewer is legitimately still inside (cone tightness).
**Next step (apparatus, not guessing):** a deterministic exit-walk
harness over the corner-building cells — drive the production decision
stack headlessly per step of an eye+player path crossing the doorway
(viewer-cell resolution → `PortalVisibilityBuilder.Build`
`ViewconeCuller` → the `DrawDynamicsLast` visibility predicate) and
assert the player sphere stays visible on every step. All CPU; the
failing step pins which candidate fires.
--- ---