docs(p2): correct the handoff — B1 was the Path 5 near-miss gate, not the climb

The prior localization (step-up CLIMB) was disproven by an ITestOutputHelper
capture. Records the real root cause (A6.P4 near-miss missing retail's
num_sphere>1 gate, fixed in abbd761), that the door blocks faithfully with a
real floor, and that the remaining red tests are separate (apparatus
synthetic-floor artifact, LiveCompare buggy-captures, D4 airborne) — not
simple "flip to green" targets. Next is the user visual gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-04 09:35:14 +02:00
parent abbd7615ee
commit f984e92e37

View file

@ -1,5 +1,37 @@
# P2 pickup handoff — door / building-shell collision = BSP Path 5 grounded step-up
> **🔴 CORRECTED 2026-06-04 — the localization below (the step-up CLIMB) was WRONG; B1 is FIXED.**
> An `ITestOutputHelper` capture of B1 (xunit swallows `Console.WriteLine`) proved the climb code
> (`find_walkable`/`AdjustSphereToPlane`/`step_sphere_down`/`DoStepUp`/`DoStepDown`) is **correct** and
> matches ACE exactly. The real B1 bug was the **A6.P4 near-miss dispatch in `BSPQuery.FindCollisions`
> Path 5 (Contact branch)**, which diverged from retail three ways: (1) recorded a near-miss
> `NegPolyHit` **unconditionally** — retail gates both `set_neg_poly_hit` calls behind
> `if (num_sphere > 1)` (`acclient_2013_pseudo_c.txt:323852`); (2) checked the foot near-miss before
> the head's (retail checks the head/sphere1 first); (3) reversed the `neg_step_up` mapping (retail:
> head index0→FALSE/slide, foot index1→TRUE/step-up, per `SPHEREPATH::set_neg_poly_hit` :323279).
> For B1's single foot sphere the spurious near-miss → outer `!NegStepUp → Collided` → revert → the
> mover wedged at x=0.1, never reached the wall to step up. **Verbatim fix committed (`abbd761`):**
> the gate+order+mapping now match retail; B1 climbs (foot→(0.6,0,0.25)); the Holtburg door blocks
> faithfully (slab `(0,-1,0)` normal) when the scenario has a real floor.
>
> **Remaining red (NOT simple flips — all separate from B1):**
> - `Apparatus_Grounded_50cmOffCenter` — its tick-0 `(0,0,1)` "block" is a **synthetic-test artifact**:
> the apparatus sets `terrain=-1000` so the only BSP is the door slab; the contact-maintenance
> step-down finds no floor underfoot → false Collided/revert, then the mover walks through. With a
> real floor (`terrain=0`) the door blocks faithfully at Y≈11.5 with `(0,-1,0)`. Fix = give the
> grounded test a real floor + assert the block normal is the door's ±Y (NOT the tick-0 `(0,0,1)`
> contact-maintenance hiccup, which is a separate cold-seed first-frame artifact). Do **NOT** just
> flip to `Assert.True(blocked)` — that blesses the artifact.
> - `LiveCompare_DoorOffCenterWalkthrough_Tick13558` / `_DoorBlocksFromOutside_Tick22760` — compare
> against captured **buggy-live** positions; a correct fix makes the harness diverge (blocks earlier).
> Re-baseline to the corrected behavior or retire as documents-the-bug.
> - `D4_AirborneMover_TallWall_PersistsSlidingNormalAcrossFrames`**airborne (Path 6)**, a separate
> sliding-normal-persistence issue, unrelated to the Path 5 grounded near-miss. Pre-existing.
>
> See `memory/project_p2_door_stepup_findings.md`. **Next: USER VISUAL GATE** (walk through a cottage
> door cleanly; step up a stair) — the authoritative P2 acceptance. The original (wrong) analysis is
> retained below for the record.
> **Canonical pickup for the next session.** Branch `claude/thirsty-goldberg-51bb9b`
> (do NOT branch/worktree; do NOT push without asking; NEVER `git stash`/`gc`). PowerShell on
> Windows; launch logs are UTF-16. Read this FIRST.