6.4 KiB
HANDOFF — #113 phantom exterior staircase (A9B3) / misplaced-interior-cell suspect
Date: 2026-06-10 (very late). Branch: claude/thirsty-goldberg-51bb9b, HEAD 77d7ea1.
Pick rationale: the user's standing directive from tonight — "we should not have to
verify all houses like this" — wants systemic fixes. #113 is the cheapest
highest-information probe: if the misplaced-cell hypothesis holds, ONE bug class explains
phantom geometry + containment gaps (#112) + some collision gaps across every affected
house. Rider task: the #112 residual oracle read (same code area, ~30 min).
Read the physics digest (claude-memory/project_physics_collision_digest.md) first —
its top banners carry tonight's #107/#111/#112 arc. Render digest unchanged except #105.
1. The issue (user side-by-side vs retail, 2026-06-10)
An A9B3 building (near the #112 hill cottage; NPCs Aun Kielerea + The Sentry adjacent; the user stood at ~world (183, −111, 116), which is A9B3-local (183, 81, 116)) shows a stone-and-wood staircase attached to its exterior wall in acdream. Retail shows a plain wall with a window. Screenshots are in the session transcript (2026-06-10); the spot is trivially re-findable — it's next to the A9B3 hill cottage with interior cells 0x100/0x103/0x104 at z=116.
Key fact: the stairs are NOT pickable — clicks select the NPCs behind them
(issue112-gate1.log:37032+). Not a stab/WorldEntity ⇒ building-shell geometry or an
interior EnvCell's geometry drawn outside.
2. The hypothesis to test FIRST
A misplaced interior EnvCell — an indoor staircase cell whose world transform (Position.Origin/orientation from the dat, or our application of it) places its geometry outside the shell. One misplaced cell would unify, at this building:
- the phantom exterior stairs (its geometry pokes through/outside the wall),
- an interior containment dead-zone (#112's gap = the volume is where the geometry ISN'T — note the #112 scan found a real gap inside the HILL COTTAGE; check whether the staircase building and the hill cottage are the same building or neighbors),
- missing collision on objects inside (their owning cell volume is elsewhere).
3. Attribution plan (cheap, ordered)
- ACViewer oracle (
feedback_acviewer_as_oracle): open landblock A9B3 in ACViewer and look at the same building. Stairs present there too ⇒ shared dat-interpretation (both projects misread the dat — go to the dat bytes); absent ⇒ OUR transform/draw path (EnvCell world-transform application or the building shell draw). This single check halves the space. - Identify the building + cell: dump A9B3's
LandBlockInfo.Buildings(model id, Position) + every interiorEnvCell.Position(dats.Get<EnvCell>(0xA9B301xx)). The conformance harness pattern is ready-made:ConformanceDats.LoadEnvCell+ a scratch test withITestOutputHelper(seeIssue112MembershipTests.csfor the loader shape; A9B3-local frame: world y + 192, world x unchanged, center A9B4). Look for a cell whose origin/AABB escapes its building's footprint, and specifically for a STAIR-shaped Environment near the user's spot (stairs = the EnvironmentId's CellStruct will have ramp polys). - Cross-check the #112 gap: the gap point A9B3-local (184.9, 82.5, 116.5) — which cell SHOULD cover it per the dat layout? If the misplaced cell's correct position covers the gap, the hypothesis is proven end-to-end.
- Fix per finding; conformance test the transform (golden origins from the dat).
4. Rider: #112 residual (same session, ~30 min)
Issue112MembershipTests.A9B3CottageGap_..._DocumentsResidual pins it: at the doorway
gap, the pick demotes via the NORMAL outdoor-candidate path (NOT the removed hatch).
Oracle read needed: retail CEnvCell::find_transit_cells (around pc:317499) — is
add_all_outside_cells gated on sphere-proximity to the exterior portal POLYGON or on
mere graph reachability? If proximity-gated, tighten our port and flip the
DocumentsResidual assert to keep-curr (0xA9B30104). Re-promotion at doorways already
works — this residual self-heals walking in; it's polish, not a stranding.
5. Tonight's shipped state (do not redo — see digests + ISSUES.md)
| Issue | State | Commits |
|---|---|---|
| #105 white walls | CLOSED (per-frame texture flush restored) | c787201 |
| #110 near plane | CLOSED (retail 0.1 re-landed, corner gated) | d4b5c71 |
| #107 login wedge | CLOSED (snap validation + PortalSpace fix + wire pairs + hold) | 1090189, e4f6750 |
| #111 login placement | CLOSED user-gated (claim-authoritative snap, walkable-poly grounding, entity parity) | 5f1eb7c, 5706e0e, 2735695 |
| #112 transparent-while-walking | PRIMARY FIX shipped (hatch removed, lateral stab recovery, retail keep-curr); residual documented; live cottage re-walk gate pending | 2d6954e |
| #113 phantom stairs | FILED (this handoff) | 77d7ea1 |
Key new invariants: server (cell,pos) pairs are VALIDATED at the snap
(PhysicsEngine.Resolve head: retail AdjustPosition :280009 + walkable-poly grounding
WalkableFloorZNearest + [snap]/[spawn-adjust] log lines, one per login/teleport);
the per-tick pick keeps curr_cell on null result (retail pc:308788-308825) with lateral
stab-graph recovery. ACE persists ITS OWN physics state, not our reports
(SetRequestedLocation — ACE source confirmed) — every restore shape it produced
tonight is survivable.
6. Ops notes
- Launch protocol: standard PowerShell launch (CLAUDE.md) +
ACDREAM_PROBE_RESOLVE=1ACDREAM_PROBE_CELL=1; tee a log. In-world markerauto-entered player mode. Graceful close ⇒ ~5 s ACE hold; hard kill ⇒ ~3 min exit-29.
- Character
+Acdreamis parked near the A9B3 staircase building (outdoors) — login is clean with tonight's fixes regardless of where ACE restores. - ⚠️ Never bulk-edit source with PS5.1 Get/Set-Content (mojibake). Tee logs = UTF-16LE.
- Baseline: Core 1383 green + 4 pre-existing #99-era failures (DoorBugTrajectoryReplay ×2 / DoorCollisionApparatus / BSPStepUp) + 1 skip; App 223 / UI 420 / Net 294. Gates that must stay green: P1 membership conformance (FindCellListConformance, ThresholdPortalCrossing, CottageDoorway, CameraCornerSeal), CornerFloodReplayTests, Issue107SpawnDiagnosticTests, Issue112MembershipTests.
- After #113: #108 (cellar grass-sweep) + #109 (far-door oscillation) render residuals, then #99/A6.P4 per-cell shadow architecture (the big systemic debt).