After merging Phase 1 + Phase 2 to main at 1af49b7, file a pickup prompt
that orients a fresh Claude Code session: what shipped, what's open, the
four ranked candidate next phases (indoor lighting / M2 / #88 vibration /
triage), and key file pointers for whichever path is chosen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.3 KiB
Indoor walking Phase 2 shipped — fresh-session pickup prompt
Status: Indoor walking Phase 1 (Cluster A — BSP cluster) + Phase 2 (Portal-based cell tracking) both merged to main at 1af49b7 on 2026-05-19. 18 commits between them; dotnet build + dotnet test green; visual-verified by user (walls block from inside, multi-room navigation works, walking out through a door works).
This doc is the start-of-session brief for whoever picks up the next phase.
What landed on main
Indoor walking Phase 1 — BSP cluster (commits 27d7de1 … 1f11ba9):
[indoor-bsp]+[cell-cache]diagnostic probes (ACDREAM_PROBE_INDOOR_BSP/ACDREAM_PROBE_CELL_CACHE).WorldPickercell-BSP occlusion via newCellBspRayOccluder→ closes #86 (click selection no longer penetrates walls).- Phase D's
ResolveOutdoorCellId→ResolveCellIdrename + AABB-based indoor cell promotion (partial fix for #84 — un-stuck the spawn-in-building case; the wall-pass-through portion stayed open until Phase 2).
Indoor walking Phase 2 — Portal-based cell tracking (commits 1969c55 … eb0f772):
- Extended
CellPhysicswithCellBSP(third BSP for point-in-cell),Portals(fromenvCell.CellPortals),PortalPolygons(resolved visible polys),VisibleCellIds. Deleted Phase D'sLocalAabbMin/Max+TryFindContainingCell. - New
CellTransitstatic class — ports retail'sCObjCell::find_cell_listfamily:FindTransitCellsSphere(indoor portal-neighbour walk),AddAllOutsideCells(24m landcell grid),FindCellList(top-level BFS driver),CheckBuildingTransit(outdoor→indoor entry viaBuildingObjportals). BSPQuery.PointInsideCellBspretyped fromPhysicsBSPNode?→CellBSPNode?(was dead code; safe retype).- New
BuildingPhysicscache +CacheBuilding/GetBuildingonPhysicsDataCache. GameWindow caches eachLandBlockInfo.Buildingsentry at landblock-load. PhysicsEngine.ResolveCellId: indoor seeds delegate toCellTransit.FindCellList; outdoor seeds keep terrain-grid resolution + hookCheckBuildingTransitfor outdoor→indoor entry.- Critical production fix at
3ffe1e4: passsp.GlobalSphere[0].Origin(foot sphere CENTER) instead ofsp.CheckPos(entity reference at the feet) toResolveCellId. Without this fix the test point was always 0.02m below cell floor due to the +0.02f Z-bump → portal traversal never engaged in production. - Indoor walkable-plane synthesis at
eb0f772: when the indoor cell-BSP returns OK (no wall collision), find the floor poly under the player and callValidateWalkablewith the indoor plane instead of falling through to outdoor terrain. Closes the "stuck in falling animation" bug.
Closed: ISSUES.md #84, #85, #86, #87 all fully resolved.
Filed for follow-up:
- #88 — Indoor static objects vibrate (bookshelves, open furnaces). Pre-existing; user spotted during Phase 2 testing.
- #89 — Port
BSPQuery.SphereIntersectsCellBspfor retail-faithfulCheckBuildingTransit. Currently uses radius-lessPointInsideCellBsp; entry fires ~0.5m later than retail.
Diagnostic infrastructure that persists:
[indoor-bsp]— per cell-BSPFindCollisionscall. Toggle:ACDREAM_PROBE_INDOOR_BSP=1or DebugPanel.[cell-cache]— per cached EnvCell at landblock load. Toggle:ACDREAM_PROBE_CELL_CACHE=1.[cell-transit]— every player CellId change. Toggle:ACDREAM_PROBE_CELL=1.[check-bldg]— per portal lookup insideCheckBuildingTransit. Gated onACDREAM_PROBE_INDOOR_BSP(reused).
How to start a fresh session
Copy the block below into a fresh Claude Code session in this repo. The model will load CLAUDE.md automatically and find the handoff docs on its own.
Pick up the acdream project. Indoor walking Phase 1 + Phase 2 just merged
to main at 1af49b7 (2026-05-19). Indoor walking is functionally complete:
walls block from inside, walking between rooms via doors works, walking
back outside through a door works.
1. Read docs/research/2026-05-19-indoor-walking-phase2-shipped-handoff.md
— that's the canonical record of what just shipped.
2. Read docs/ISSUES.md and note the open issues. The three follow-ups
most-directly related to the just-shipped work:
- #88: indoor static objects vibrate (bookshelves, furnaces)
- #89: port BSPQuery.SphereIntersectsCellBsp for retail-faithful entry
- #80: 2nd-floor goes very dark (pre-existing lighting issue, may be
part of a broader Cluster B lighting phase)
3. Per CLAUDE.md's work-order autonomy rule, YOU pick the next phase.
Candidates ranked by my best guess at priority:
A) Indoor lighting cluster (closes #79/#80/#81/#82) — completes the
"indoor feels right" visual story. The wall-blocking is done; the
visible darkness on upper floors and broken atmospheric lighting
indoors is the next thing the player notices. ~1-2 weeks.
B) Continue M2 critical path — F.2 (Inventory panel), F.3 (Combat
math + damage flow), F.5a (dev panels), L.1c (combat animation),
L.1b (command router). Kill-a-drudge demo. ~6-10 weeks total but
can be sliced per-phase.
C) #88 indoor vibration — quick to fix once diagnosed; pre-existing
annoyance. 1-3 commits depending on root cause.
D) Triage docs/ISSUES.md to clear chronic-open items (#2 lightning,
#4 sky horizon-glow, #28 aurora, #29 cloud thinness, #37 humanoid
coat, #41 remote-motion blips). ~1 hour, surfaces what's actually
blocking M2 vs nice-to-have.
My recommendation: A. Indoor lighting closes the indoor-experience
loop. The user explicitly mentioned darkness as a noticeable issue
during Phase 2 testing, and the diagnostic infrastructure from
Phase 2 is still warm. But pick based on your read of the codebase
+ recent commits.
4. CLAUDE.md rules apply:
- No workarounds; fix root causes.
- Use superpowers skills for major work (brainstorming → writing-plans
→ subagent-driven-development → finishing-a-development-branch).
- Drive autonomously — Claude picks what to work on next; user reviews.
- Visual verification by the user is the acceptance test for any
rendering / collision / lighting fix.
5. The diagnostic infrastructure is ready for any indoor-cell-related
investigation. Probes are runtime-toggleable via the DebugPanel
("Indoor: BSP collision" checkbox + the Cluster A render-side ones).
State the milestone and your chosen phase in the first action you take.
Then begin.
Quick reference for the user
To start the new session: open a fresh Claude Code in the acdream repo and paste the boxed prompt above. Or just say:
"Read
docs/research/2026-05-19-indoor-walking-phase2-pickup-prompt.mdand start on the next phase."
Quick reference for the helper
Key files for the next phase (whichever path A/B/C/D you pick):
docs/superpowers/specs/2026-05-19-indoor-portal-cell-tracking-design.md— the spec that just shipped. Reference for how Phase 2 was scoped.docs/research/2026-05-19-indoor-walking-phase2-shipped-handoff.md— full Phase 2 evidence + commit list.docs/ISSUES.md— current OPEN items (note new #88 + #89 from Phase 2).docs/plans/2026-04-11-roadmap.md— shipped table; Indoor walking Phase 2 row is most recent.
If picking Path A (indoor lighting):
- Start by re-reading the existing Cluster B sketches in the original Cluster A handoff:
docs/research/2026-05-19-indoor-followup-handoff.md— section "The 9 follow-up issues" lists #79/#80/#81/#82 as Cluster B. - Lighting code surfaces:
src/AcDream.App/Rendering/GameWindow.cs::UpdateSunFromSky(indoor branch around line 8330+),src/AcDream.App/Rendering/Shaders/mesh_modern.frag(accumulateLights + indoor ambient),src/AcDream.Core/Lighting/LightInfoLoader.cs. - Probe surface: there is no
[lighting]probe yet — adding one will likely be the first commit in the brainstorm.
If picking Path C (#88 vibration):
- Likely candidates from the bug report:
EntityScriptActivator.OnCreate/OnRemovere-firing on rapid CellId promotion/demotion (now less likely after Phase 2 stabilized cell tracking, but worth investigating); per-frame transform recompute drift on cell-staticWorldEntityinstances; particle-emitter offset accumulation. - File this as a Phase rather than an issue if the root cause turns out to be the per-frame transform pipeline (multi-commit refactor).