diff --git a/docs/ISSUES.md b/docs/ISSUES.md index a776a181..52320d4e 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -48,10 +48,36 @@ Copy this block when adding a new issue: ## #145 — Portals only work once per session (can't run in, run out, re-enter) -**Status:** CORE FIXED + user-verified 2026-06-20 (in→out→re-enter repeatedly works; no ACE errors; world renders). Remaining facets (server objects + own-avatar not rendering after a teleport-out) split to **#138** — they are entity render/lifecycle, a different subsystem from the cell-rooting bug this issue was. -**Severity:** HIGH (blocks repeated portal/dungeon travel — user, 2026-06-20) +**Status:** REOPENED 2026-06-21 — RESIDUAL: a teleport to a FAR town triggers a per-frame **resolver runaway** (the 2026-06-20 source-drop fix holds for Holtburg↔dungeon, but far-town destinations regress). #138 (objects come back) is confirmed SEPARATE + fixed. Root cause under research (retail-decomp oracle workflow). +**Severity:** HIGH (blocks far-town portal travel; breaks collision after the teleport — user, 2026-06-21) **Filed:** 2026-06-20 -**Component:** net/streaming — teleport (0xF751) + PortalSpace + arrival + cell rooting +**Component:** net/streaming/physics — teleport (0xF751) + PortalSpace + arrival + per-frame cell-resolve / coordinate-frame rebase + +**⚠️ REOPENED 2026-06-21 — far-town teleport resolver runaway (capture in hand):** +Teleport dungeon (0,7) → far town **(201,91) = 0xC95B** (reached via the Town Network hub). The +client PLACES the player correctly via the #145 verbatim path +(`[snap] claim=0xC95B0001 pos=(14.8,0.3,12.005) branch=NO-LANDBLOCK -> verbatim`), then the +**very next per-frame physics resolve runs away**: cell membership marches one landblock SOUTH per +frame (`0xC95B → 0xC95A → … → 0xC900`, the landblock Y byte counting down) while the position +drifts (X +0.12/frame, Y −0.38/frame) and the player falls (Z 12 → −6.5) — i.e. the resolve never +REBASES the local position into the new landblock's frame, so it keeps "crossing" boundaries. It +settles "on ground" at cell `0xC900` local `(−6.1, −30.2, 12)`. ACE then sees a move from the true +spot `C95B0001 [14.8,0.3,12]` to `C9000008 [34.7, 17410, 24]` — landblock Y byte = 0 but local +Y = **17410 ≈ 91 landblocks of leaked offset** — an inconsistent (cell, local) pair → rejects every +move (`MOVEMENT SPEED` / `failed transition`) → no server-confirmed position → **collision gone** +(player falls through the world). `reason=resolver` (per-frame physics), NOT `teleport`. +Holtburg↔dungeon works because Holtburg is the startup center; the far town exposes the gap. +**Re-hydrate (#138) EXONERATED:** the re-hydrate fired only for Holtburg + the dungeon (log lines +412/498/710); it did NOT fire for the far town during the runaway (746+) — and it only adds RENDER +entities, never the physics `_landblocks` the resolver iterates. +**Apparatus:** `[cell-transit]` trail (`ACDREAM_PROBE_CELL=1`) + `desync-capture.jsonl` (72,401 +`ResolveWithTransition` frames, `ACDREAM_CAPTURE_RESOLVE`). Suspected: the per-frame outdoor resolve +(`PhysicsEngine.Resolve` / `AdjustPosition` iterating `_landblocks`) does not normalize the local +position across a landblock crossing the way retail's `set_position`/`change_cell`/`AdjustPosition` +does — port that. Research workflow running (acdream resolver code + retail named-decomp/Ghidra +oracle + capture characterization → synthesis → adversarial verify). + +**[ORIGINAL #145 — source-frame overlap, FIXED 2026-06-20; history below]** **Description (user, 2026-06-20):** A portal can only be used ONCE per session. The first teleport works; a subsequent portal use (run out, or re-enter) does not. Goal: run in, run out, repeatedly.