docs: #111 closed - three-layer fix chain (bestCell clobber, triangle-soup grounding, entity snap parity), user-gated at two buildings

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-10 14:34:53 +02:00
parent 2735695a6b
commit 33662b35b6

View file

@ -3709,52 +3709,45 @@ stable now; this is a draw-order/depth oscillation localized to the door surface
---
## #111 — Indoor login from an ACE-mutated restore starts outdoor-classified (transparent interior until door-press)
**Status:** OPEN
**Severity:** MEDIUM (UX; no wedge — always controllable, heals on door-press)
**Filed:** 2026-06-10 (split out of #107's gate runs)
**Component:** physics / player snap (grounding) + membership lateral recovery
**Symptom (user-gated ×3, wedge-107-gate3/4/5 logs):** logging in indoors, the
interior renders transparent (walls see-through, own char invisible) until the
player presses into the DOORWAY, which promotes membership into the proper room
and everything renders. Collision works throughout. "It feels like I'm logging
in a step up" — correct: ACE restores the player ~1 m above the floor (or 1.8 m
below, in the cellar volume).
**Mechanism (fully evidenced):** ACE does not persist our reported (cell, pos)
pair — `GameActionAutonomousPosition.Handle``SetRequestedLocation` feeds
ACE's SERVER-SIDE physics player, and the logout save is ACE's physics state:
same XY as ours verbatim, but ACE's own Z + cell (observed: claim 0x172 z=95.0;
claim 0x147 z=92.226 cellar; claim 0x14F z=94.85 — stacked volumes under/over
the room 0x171 the user actually stood in at z=94.0). Our entry snap
(PhysicsEngine.Resolve + retail AdjustPosition, #107) validates the claim at
the RESTORED point — geometrically valid for the lofted/sunk point — but never
GROUNDS and re-validates: the first movement drops the player to the floor
where the stacked claim no longer contains them → the pick (correctly
portal-local, P1-validated) cannot laterally recover the 2-hop room → demote
to outdoor INSIDE the building → render (downstream of membership) draws the
outdoor flood → transparent interior until the doorway portal promotes.
**Fix direction (retail-anchored):** retail `SetPositionInternal` does NOT
commit the raw restored position — after AdjustPosition it runs
`CheckPositionInternal → CTransition::find_valid_position` (:283426, :280070),
settling the sphere onto valid floor BEFORE committing, then stores the
SETTLED position. Port shape: at the snap, ground the position (floor under
the point within the claim's visible graph), re-run AdjustPosition at the
settled foot-center (for the gate-5 case: z 95.0→94.0, then 0x172's stab list
corrects to 0x171), commit the corrected pair. ⚠️ Open sub-question: the
gate-5 snap committed the lofted pair VERBATIM (z=95.0, cell unchanged) even
though Resolve's indoor floor-snap should have grounded to the closest floor —
instrument which early-out fired (suspects: `physics is null` landblock-lookup
miss at snap time; step-height reject; bestCell null). Logs:
wedge-107-gate3/4/5-indoor-login.log; scans in Issue107SpawnDiagnosticTests.
---
# Recently closed
## #111 — ACE-mutated indoor restores: transparent interior / wrong placement at login — [DONE 2026-06-10 · 5f1eb7c + 5706e0e + 2735695]
**Status:** DONE (user-gated: clean indoor logins at two different buildings —
"it worked", "looked great"; further self-testing across houses ongoing)
**Closed:** 2026-06-10 (late)
**Commits:** `5f1eb7c` (claim-authoritative snap + [snap] apparatus) →
`5706e0e` (ground via physics walkable polygons) → `2735695` (entity snap parity)
**Component:** physics / player snap
**The peel (each layer caught live by the [snap] apparatus):**
1. **bestCell clobber** (`5f1eb7c`): the legacy Resolve floor-pick scanned every
CellSurface in the landblock (123 at Holtburg) and broke same-height ties by
iteration order — it clobbered ACE's CLEAN validated claim 0xA9B40171 with
0xA9B4013F, seeding the poison loop (our heartbeats reported the clobbered
cell; ACE persisted it; the next login inherited it). Fix: a VALIDATED indoor
claim is authoritative (retail SetPositionInternal commits the AdjustPosition
cell and only settles Z); the snap grounds onto the claim's own floor.
2. **Triangle-soup grounding** (`5706e0e`): CellSurface includes ceiling/roof TOP
faces — first-hit grounded onto 0x171's 99.475 ceiling (then poisoned ACE's
save with the roof height); nearest-to-reference self-confirmed the poison.
Fix: ground via the PHYSICS walkable polygons (normal.Z ≥ PhysicsGlobals.FloorZ,
retail find_walkable's filter) — `WalkableFloorZNearest`, cell-local plane drop.
Verified eating the poisoned restore: claim (0x171, z=99.475) → grounded 94.000.
3. **Entity snap asymmetry** (`2735695`): login entry snapped only the CONTROLLER;
the renderer kept the entity at the restored height ("spawned 2 m in the air"
over a fully-correct interior). Fix: entity.SetPosition + ParentCellId at entry,
parity with the teleport-arrival path.
The ACE-side behavior (server persists ITS physics state, not our reports —
`SetRequestedLocation` feeds ACE's server-side player) is by design and now fully
survivable: every restore shape observed tonight (clean / adjacent-room /
cross-building / cellar-sunk / roof-lofted) lands correctly placed or loudly
corrected ([spawn-adjust]/[snap] lines). The [snap] diagnostic stays (one line
per login/teleport).
## #107 — Indoor-login spawn wedge — [DONE 2026-06-10 · 1090189]
**Status:** DONE (live-verified incl. ACE's own poisoned teleport; final indoor