From 6d2218cac3c02114f52744ac003a4af1b3ca0dd6 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 10 Jun 2026 15:28:44 +0200 Subject: [PATCH] docs: #113 pickup handoff - phantom-stairs/misplaced-cell attribution plan + #112 residual rider + tonight's shipped-state table Co-Authored-By: Claude Fable 5 --- ...3-phantom-stairs-misplaced-cell-handoff.md | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 docs/research/2026-06-10-issue113-phantom-stairs-misplaced-cell-handoff.md diff --git a/docs/research/2026-06-10-issue113-phantom-stairs-misplaced-cell-handoff.md b/docs/research/2026-06-10-issue113-phantom-stairs-misplaced-cell-handoff.md new file mode 100644 index 00000000..50bcdc32 --- /dev/null +++ b/docs/research/2026-06-10-issue113-phantom-stairs-misplaced-cell-handoff.md @@ -0,0 +1,102 @@ +# 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) + +1. **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. +2. **Identify the building + cell**: dump A9B3's `LandBlockInfo.Buildings` (model id, + Position) + every interior `EnvCell.Position` (`dats.Get(0xA9B301xx)`). + The conformance harness pattern is ready-made: `ConformanceDats.LoadEnvCell` + + a scratch test with `ITestOutputHelper` (see `Issue112MembershipTests.cs` for 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). +3. **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. +4. 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=1` + + `ACDREAM_PROBE_CELL=1`; tee a log. In-world marker `auto-entered player mode`. + Graceful close ⇒ ~5 s ACE hold; hard kill ⇒ ~3 min exit-29. +- Character `+Acdream` is 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).