docs(handoff): strategic pickup prompt for all 6 open items
After the 2026-05-21 session merged A1/A1.5/A1.6/A1.7 to main, six discrete items remain. This doc maps them as a landscape rather than single-phase: - Collision (M2 critical path): A4 multi-cell BSP iteration → verify stairs → A2 PHSP inversion → A3 synthesis removal - Rendering (M7 polish): indoor lighting + spotlight-projection bugs The recommended order is A4 first (biggest user payoff, unblocks A3), then stairs verification, A2 + A3 paired, lighting in a separate session. A3 must NOT ship before A4 — that's the Bug A regression from 2026-05-20. Includes a pasteable session-start prompt that the user can box into a fresh Claude Code session. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f80b53763f
commit
fd9daddb37
1 changed files with 307 additions and 0 deletions
307
docs/research/2026-05-21-open-items-pickup-prompt.md
Normal file
307
docs/research/2026-05-21-open-items-pickup-prompt.md
Normal file
|
|
@ -0,0 +1,307 @@
|
||||||
|
# Open items pickup prompt — 2026-05-21 session aftermath
|
||||||
|
|
||||||
|
After the 2026-05-21 collision-fix session, six discrete items remain.
|
||||||
|
This doc gives a fresh session the full landscape: how the items
|
||||||
|
relate, what depends on what, what order makes sense.
|
||||||
|
|
||||||
|
The pasteable session-start prompt is at the bottom of this doc.
|
||||||
|
|
||||||
|
## The landscape at a glance
|
||||||
|
|
||||||
|
| # | Item | Domain | Depends on | M2-blocker? |
|
||||||
|
|---|---|---|---|:---:|
|
||||||
|
| A4 | Walls walk-through in vestibule cells — multi-cell BSP iteration | Collision | — | **YES** |
|
||||||
|
| stairs | Stairs walk-through — likely falls out of A4 | Collision | A4 | YES (if still broken after A4) |
|
||||||
|
| A2 | PHSP inversion — `polygon_hits_sphere` early-return logically inverted vs retail | Collision math | — | Low (subtle correctness only) |
|
||||||
|
| A3 | Synthesis removal — delete `TryFindIndoorWalkablePlane`, rely on retail CP retention | Architectural | A4 + A2 | No (cleanup, retail-faithful) |
|
||||||
|
| L-indoor | Lighting indoors broken | Rendering | — | No (M7 polish) |
|
||||||
|
| L-spotlight | Items projecting spotlight on walls | Rendering | — | No (M7 polish) |
|
||||||
|
|
||||||
|
## Two domains, one critical-path chain
|
||||||
|
|
||||||
|
The 6 items split cleanly:
|
||||||
|
|
||||||
|
**Domain 1 — Collision (M2 critical path).** A4, stairs, A2, A3.
|
||||||
|
These block "kill a drudge" because dungeons have drudges and dungeons
|
||||||
|
have walls/stairs/floors that need to behave correctly. The dependency
|
||||||
|
chain is:
|
||||||
|
|
||||||
|
```
|
||||||
|
A4 (multi-cell iteration)
|
||||||
|
│
|
||||||
|
┌──────────┴──────────┐
|
||||||
|
▼ ▼
|
||||||
|
stairs (verify A3 (remove
|
||||||
|
post-A4) synthesis,
|
||||||
|
relies on
|
||||||
|
A4 retention)
|
||||||
|
▲
|
||||||
|
│
|
||||||
|
A2 (PHSP fix
|
||||||
|
— also useful
|
||||||
|
standalone)
|
||||||
|
```
|
||||||
|
|
||||||
|
A4 is the biggest user-visible win and it unblocks A3. A2 is a small
|
||||||
|
self-contained correctness fix that pairs naturally with A3. Stairs
|
||||||
|
are likely an A4 side-effect.
|
||||||
|
|
||||||
|
**Domain 2 — Rendering (M7 polish).** L-indoor + L-spotlight. These
|
||||||
|
don't affect gameplay correctness — the world just looks wrong.
|
||||||
|
Different code paths (lighting, not physics), different files,
|
||||||
|
different domain knowledge. Best tackled in their own session,
|
||||||
|
ideally after collision is solid so the visual artifacts are easier
|
||||||
|
to isolate.
|
||||||
|
|
||||||
|
## Why this order
|
||||||
|
|
||||||
|
1. **A4 first.** Biggest user-visible improvement. Closes the
|
||||||
|
"vestibule cells don't block walls" gap by querying every cell
|
||||||
|
the sphere overlaps, not just the one cell the player's center
|
||||||
|
is in. Retail oracle: `CTransition::check_other_cells` at
|
||||||
|
`acclient_2013_pseudo_c.txt:272717-272798`. Existing
|
||||||
|
`CellTransit.FindCellList` already enumerates the right cells;
|
||||||
|
A4 wires that into `FindEnvCollisions`. Probably 1-2 days.
|
||||||
|
|
||||||
|
2. **Verify stairs after A4.** If A4 closes vestibule walls, it
|
||||||
|
probably also closes stairs (same architectural gap — stairs
|
||||||
|
span cells). If stairs still walk-through after A4, investigate
|
||||||
|
per-cell physics-poly coverage for stair geometry as a separate
|
||||||
|
sub-issue.
|
||||||
|
|
||||||
|
3. **A2.** One-line flip in `PolygonHitsSpherePrecise`
|
||||||
|
([BSPQuery.cs:117](src/AcDream.Core/Physics/BSPQuery.cs:117)) plus
|
||||||
|
a unit test for the tangent boundary. Improves correctness across
|
||||||
|
every BSP query (walls, step-up, step-down). Pairs cleanly with A3.
|
||||||
|
|
||||||
|
4. **A3.** Once A4 + A2 land, the architectural cleanup becomes safe.
|
||||||
|
Delete `TryFindIndoorWalkablePlane` (TransitionTypes.cs:1294) and
|
||||||
|
the synthesis call site. Retail's grounded path doesn't synthesize
|
||||||
|
CP — it retains via Mechanisms A/B/C (already in our code at
|
||||||
|
BSPQuery.cs:1615, TransitionTypes.cs:2618, TransitionTypes.cs:896).
|
||||||
|
The 2026-05-20 session tried A3 prematurely (Bug A) and reverted
|
||||||
|
because the doorway-exit case relied on multi-cell iteration that
|
||||||
|
wasn't there. A4 closes that gap.
|
||||||
|
|
||||||
|
5. **Lighting (M7).** Separate session. Different domain. Defer until
|
||||||
|
M2 ships.
|
||||||
|
|
||||||
|
## Per-item starter notes
|
||||||
|
|
||||||
|
### A4 — multi-cell BSP iteration
|
||||||
|
|
||||||
|
**Read first:**
|
||||||
|
- §"Phase A4" of `docs/research/2026-05-21-collision-fixes-shipped-handoff.md`
|
||||||
|
- `acclient_2013_pseudo_c.txt:272717-272798` (`check_other_cells`)
|
||||||
|
- [`src/AcDream.Core/Physics/TransitionTypes.cs:1407-1559`](src/AcDream.Core/Physics/TransitionTypes.cs:1407) (`FindEnvCollisions` — change site)
|
||||||
|
- [`src/AcDream.Core/Physics/CellTransit.cs`](src/AcDream.Core/Physics/CellTransit.cs) (helpers already exist)
|
||||||
|
|
||||||
|
**Approach:**
|
||||||
|
- Extract a "cell_array" set from the player's current cell via the
|
||||||
|
existing CellTransit BFS.
|
||||||
|
- Iterate each cell, run `BSPQuery.FindCollisions` against each one.
|
||||||
|
- Combine results: any cell returning Collided/Adjusted halts; any
|
||||||
|
cell returning Slid is remembered; all OK = return OK.
|
||||||
|
|
||||||
|
**Acceptance:** Walk into the Holtburg inn vestibule (cell `0xA9B40164`).
|
||||||
|
Walls in cell `0xA9B40157` should now block when the player's sphere
|
||||||
|
extends into them, even though the player's center is still in the
|
||||||
|
vestibule.
|
||||||
|
|
||||||
|
### Stairs walk-through
|
||||||
|
|
||||||
|
**Strategy:** verification-only, after A4. Launch with the same probe
|
||||||
|
set, walk up the inn stairs, watch the `[indoor-bsp]` results. If
|
||||||
|
stair hits fire correctly, done. If not, investigate the cell's
|
||||||
|
physics-poly data — stairs may be packed as static objects rather
|
||||||
|
than cell-structure polys.
|
||||||
|
|
||||||
|
### A2 — PHSP inversion fix
|
||||||
|
|
||||||
|
**Bug:** [`BSPQuery.cs:117`](src/AcDream.Core/Physics/BSPQuery.cs:117)
|
||||||
|
has `if (MathF.Abs(dist) > rad) return false;` — bails when sphere
|
||||||
|
is FAR from plane. Retail's `polygon_hits_sphere_slow_but_sure` at
|
||||||
|
`acclient_2013_pseudo_c.txt:322509-322517` does the opposite — bails
|
||||||
|
when sphere is OVERLAPPING plane.
|
||||||
|
|
||||||
|
**Fix:** flip the comparison. New unit test for the tangent boundary
|
||||||
|
(sphere center at `radius` distance from plane → continue, not
|
||||||
|
reject).
|
||||||
|
|
||||||
|
**Caveat:** doesn't fix walkable synthesis on its own —
|
||||||
|
`AdjustSphereToPlane` also rejects at the tangent boundary (strict
|
||||||
|
`<` check on interp). The two together gate the synthesis. Fixing A2
|
||||||
|
alone changes which side of the boundary the rejection happens on
|
||||||
|
but doesn't close the gap. Pair with A3 for the full benefit.
|
||||||
|
|
||||||
|
**Read first:**
|
||||||
|
- §"Phase A2" of `docs/research/2026-05-21-collision-fixes-shipped-handoff.md`
|
||||||
|
- `docs/research/2026-05-21-walk-miss-capture-findings.md` (the
|
||||||
|
smoking-gun analysis of the 2 cm boundary)
|
||||||
|
|
||||||
|
### A3 — synthesis removal
|
||||||
|
|
||||||
|
**Bug:** retail's grounded path doesn't re-synthesize ContactPlane.
|
||||||
|
It retains via three mechanisms (Path 4 land, LKCP proximity restore,
|
||||||
|
post-OK step-down probe — all already in our code). Our
|
||||||
|
`TryFindIndoorWalkablePlane` runs every frame and is unfaithful.
|
||||||
|
|
||||||
|
**Fix:** delete `TryFindIndoorWalkablePlane` ([TransitionTypes.cs:1294](src/AcDream.Core/Physics/TransitionTypes.cs:1294))
|
||||||
|
and its call site. ~500 lines deleted.
|
||||||
|
|
||||||
|
**Critical prerequisite:** A4 must ship first. The 2026-05-20 session
|
||||||
|
tried A3 prematurely (Bug A) and reverted because doorway transitions
|
||||||
|
caused free-fall — Mechanism C couldn't find a floor poly at the
|
||||||
|
threshold because the indoor cell's BSP had no coverage past the
|
||||||
|
doorway, and multi-cell iteration wasn't there to query the adjacent
|
||||||
|
cell.
|
||||||
|
|
||||||
|
**Read first:**
|
||||||
|
- `docs/research/2026-05-20-indoor-walking-bug-a-handoff.md`
|
||||||
|
(Bug A's premise + reversion)
|
||||||
|
- §"Phase A3" of the 2026-05-21 handoff
|
||||||
|
|
||||||
|
### L-indoor — lighting broken inside
|
||||||
|
|
||||||
|
**Symptom:** lights inside buildings don't illuminate correctly.
|
||||||
|
|
||||||
|
**Likely areas:**
|
||||||
|
- Cell-light association (which lights belong to which cell)
|
||||||
|
- Light visibility culling (visible-cells set + light bounds)
|
||||||
|
- Per-light projection matrix indoors
|
||||||
|
|
||||||
|
**Domain:** rendering, not physics. Separate session.
|
||||||
|
|
||||||
|
### L-spotlight — items projecting spotlight on walls
|
||||||
|
|
||||||
|
**Symptom:** held items (torches, etc.) project spotlight effects
|
||||||
|
onto walls in unexpected directions.
|
||||||
|
|
||||||
|
**Likely areas:**
|
||||||
|
- Per-entity light direction transform
|
||||||
|
- LightingHookSink owner-tracking
|
||||||
|
|
||||||
|
**Domain:** rendering, not physics. Separate session.
|
||||||
|
|
||||||
|
## CLAUDE.md rules to remember
|
||||||
|
|
||||||
|
1. **Work-order autonomy.** You pick what to work on. Recommended
|
||||||
|
order above but adjust if you find something blocking.
|
||||||
|
2. **No workarounds, retail-faithful.** Same rule that drove A1
|
||||||
|
through A1.7. If a fix starts to look like a band-aid, stop.
|
||||||
|
3. **Probe-first, design-second.** Already have rich probes
|
||||||
|
(`[indoor-bsp]`, `[cell-transit]`, `[cell-cache]`,
|
||||||
|
`[walk-miss]`, `[floor-polys]`, `[resolve-bldg]`). Capture before
|
||||||
|
theorizing.
|
||||||
|
4. **Visual verification is the acceptance test.** Walk the building
|
||||||
|
after each fix.
|
||||||
|
5. **Stop signals.** Three failed visual verifications in a session =
|
||||||
|
write a handoff, don't push for a fourth.
|
||||||
|
6. **Don't enable `ACDREAM_PROBE_RESOLVE` for live play.** It lagged
|
||||||
|
the client last session (400k+ lines at 30 Hz).
|
||||||
|
7. **Subagent policy: Sonnet for implementers, Opus only for
|
||||||
|
load-bearing review.**
|
||||||
|
8. **Worktrees.** Use the `superpowers:using-git-worktrees` skill to
|
||||||
|
create a fresh worktree branched from main before touching code.
|
||||||
|
|
||||||
|
## Launch command (light probes only)
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$env:ACDREAM_DAT_DIR = "$env:USERPROFILE\Documents\Asheron's Call"
|
||||||
|
$env:ACDREAM_LIVE = "1"
|
||||||
|
$env:ACDREAM_TEST_HOST = "127.0.0.1"
|
||||||
|
$env:ACDREAM_TEST_PORT = "9000"
|
||||||
|
$env:ACDREAM_TEST_USER = "testaccount"
|
||||||
|
$env:ACDREAM_TEST_PASS = "testpassword"
|
||||||
|
$env:ACDREAM_DEVTOOLS = "1"
|
||||||
|
$env:ACDREAM_PROBE_INDOOR_BSP = "1"
|
||||||
|
$env:ACDREAM_PROBE_CELL = "1"
|
||||||
|
$env:ACDREAM_PROBE_CELL_CACHE = "1"
|
||||||
|
dotnet build -c Debug
|
||||||
|
dotnet run --project src\AcDream.App\AcDream.App.csproj --no-build -c Debug 2>&1 |
|
||||||
|
Tee-Object -FilePath "launch.log"
|
||||||
|
```
|
||||||
|
|
||||||
|
UTF-16LE → UTF-8 conversion for grep:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Get-Content launch.log -Encoding Unicode |
|
||||||
|
Out-File launch.utf8.log -Encoding utf8
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## The pasteable session-start prompt
|
||||||
|
|
||||||
|
Open a new Claude Code session in the main acdream worktree
|
||||||
|
(`C:\Users\erikn\source\repos\acdream`, branch `main` at SHA
|
||||||
|
`f80b537` or later). Then paste:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```
|
||||||
|
Pick up the acdream open-items cleanup. After the 2026-05-21 session,
|
||||||
|
6 items remain across collision + rendering.
|
||||||
|
|
||||||
|
1. Read docs/research/2026-05-21-open-items-pickup-prompt.md FIRST.
|
||||||
|
It maps the 6 items, their dependencies, and the recommended
|
||||||
|
order (A4 → verify-stairs → A2 → A3 → lighting in a separate
|
||||||
|
session). Each item has its own "Read first" anchor list inside.
|
||||||
|
|
||||||
|
2. Branch state: main is at f80b537 with all 2026-05-21 fixes
|
||||||
|
landed (A1, A1.5, A1.6, A1.7 + probe spike + handoff docs).
|
||||||
|
Build green, 1129-test baseline holds, four user-visible
|
||||||
|
improvements visually verified. Local main is ahead of
|
||||||
|
origin/main (origin at 7034be9); push only if explicitly asked.
|
||||||
|
|
||||||
|
3. **Set up isolation FIRST.** Use the superpowers:using-git-worktrees
|
||||||
|
skill to create a fresh worktree from main. Don't work directly
|
||||||
|
in the parent worktree. The 2026-05-21 session's worktree
|
||||||
|
(claude/lucid-goldberg-1ba520) is identical to main and can be
|
||||||
|
removed.
|
||||||
|
|
||||||
|
4. Recommended first phase: **A4 (multi-cell BSP iteration)**. It
|
||||||
|
has the biggest user-visible payoff (closes vestibule-cell wall
|
||||||
|
walk-through, likely closes stairs too) and unblocks A3
|
||||||
|
architectural cleanup. Retail oracle is at
|
||||||
|
acclient_2013_pseudo_c.txt:272717-272798 (CTransition::check_other_cells).
|
||||||
|
Existing CellTransit helpers (FindCellList, FindTransitCellsSphere,
|
||||||
|
AddAllOutsideCells) already enumerate the right cells; A4's
|
||||||
|
work is wiring them into Transition.FindEnvCollisions.
|
||||||
|
|
||||||
|
5. Use the superpowers:brainstorming skill before writing A4 code.
|
||||||
|
A4 is a real architectural change (multi-day, 2 files modified +
|
||||||
|
tests) and deserves its own spec + plan. Don't shortcut it.
|
||||||
|
|
||||||
|
6. CLAUDE.md rules:
|
||||||
|
- No workarounds. Retail-faithful.
|
||||||
|
- Probe-first, design-second.
|
||||||
|
- Visual verification at Holtburg inn cell 0xA9B40164 vestibule
|
||||||
|
is the A4 acceptance test (walls in adjacent cell 0xA9B40157
|
||||||
|
should block when the player straddles the boundary).
|
||||||
|
- Don't enable ACDREAM_PROBE_RESOLVE for live play (lags the
|
||||||
|
client). Use [indoor-bsp] + [cell-transit] + [cell-cache] only.
|
||||||
|
- Three failed visual verifications = handoff, not a fourth attempt.
|
||||||
|
|
||||||
|
7. M2 ("kill a drudge") is the active milestone. A4 + stair
|
||||||
|
verification + A2 + A3 are all on the M2 critical path because
|
||||||
|
dungeons need walkable indoor space. Lighting is M7 polish;
|
||||||
|
defer.
|
||||||
|
|
||||||
|
8. Launch command (light probes only):
|
||||||
|
$env:ACDREAM_DAT_DIR = "$env:USERPROFILE\Documents\Asheron's Call"
|
||||||
|
$env:ACDREAM_LIVE = "1"
|
||||||
|
$env:ACDREAM_TEST_HOST = "127.0.0.1"
|
||||||
|
$env:ACDREAM_TEST_PORT = "9000"
|
||||||
|
$env:ACDREAM_TEST_USER = "testaccount"
|
||||||
|
$env:ACDREAM_TEST_PASS = "testpassword"
|
||||||
|
$env:ACDREAM_DEVTOOLS = "1"
|
||||||
|
$env:ACDREAM_PROBE_INDOOR_BSP = "1"
|
||||||
|
$env:ACDREAM_PROBE_CELL = "1"
|
||||||
|
$env:ACDREAM_PROBE_CELL_CACHE = "1"
|
||||||
|
dotnet build -c Debug
|
||||||
|
dotnet run --project src\AcDream.App\AcDream.App.csproj --no-build -c Debug 2>&1 |
|
||||||
|
Tee-Object -FilePath "launch.log"
|
||||||
|
|
||||||
|
State the milestone + chosen phase in your first action.
|
||||||
|
```
|
||||||
Loading…
Add table
Add a link
Reference in a new issue