ship(phys): A6.P3 slice 2 — L622 seed investigation + #98 filed

Slice 2 v1 (`892019b`) attempted to close issue #96 by removing the
PhysicsEngine.cs L622 per-tick CP seed. v1 build/test green, CP-write
count dropped 91% in scen3 re-capture, BUT user happy-test surfaced
a regression: BSP step_up at the last step of stairs failed because
sub-step 1's AdjustOffset had no ContactPlane to compute the lift
direction.

Slice 2 v2 (`f8d669b`) reverted the seed removal + added a no-op-if-
unchanged guard inside CollisionInfo.SetContactPlane. The guard
early-returns when called with values matching current ci state.

Outcome:
- #96 PARTIALLY ADDRESSED, scope updated in ISSUES.md to "accepted as
  documented retail divergence." The seed is load-bearing for step_up;
  closing #96 fully would require deeper refactor (AdjustOffset
  fallback to body.ContactPlane). Guard is benign improvement.
- Slice 2 v2 verification capture (scen3_inn_2nd_floor_slice2v2/
  acdream.log) committed as evidence — 226,464 cp-writes from L624
  seed confirms guard doesn't trigger for fresh-ci-per-tick pattern.
- Slice 2 v1 verification capture (scen3_inn_2nd_floor_slice2/
  acdream.log) also committed — confirms v1 actually reduced cp-writes
  (2,690 total) but the step_up regression made it unshippable.

NEW M1.5 BLOCKER FILED — issue #98: cellar ascent stuck at last step.
Evidence in slice2v2 capture's cell-transit chain:
  0xA9B4014B → 0xA9B4014A → 0xA9B4013F → 0xA9B4014A → 0xA9B4014B → ...
  (Z stable ~96.4; CellId ping-pongs every tick)
This is Finding 3 family (cell-resolver hysteresis missing) — same
root cause as #90 workaround + scen4 sling-out. Retail oracle:
CObjCell::find_cell_list Position-variant at
acclient_2013_pseudo_c.txt:308742-308783.

NEXT — A6.P3 slice 3:
- Port retail's cell-array hysteresis into ResolveCellId +
  CheckBuildingTransit.
- Closes #98 (cellar-up), possibly #97 (phantom collisions same
  instability family), enables #90 workaround removal.

Documents updated:
- ISSUES.md — #96 scope updated, #98 filed
- docs/plans/2026-04-11-roadmap.md — A6.P3 slice 2 marked SHIPPED,
  slice 3 scope added
- CLAUDE.md — Currently-working-toward block updated to slice 3

Test suite: 1148 pass + 8 pre-existing fail (baseline maintained).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-05-22 11:58:05 +02:00
parent f8d669be88
commit d868946537
5 changed files with 279969 additions and 44 deletions

View file

@ -192,18 +192,32 @@ successfully 2026-04-30 for the steep-roof case. Matching binaries
PARTIALLY CLOSED — 99.3% of remaining cp-writes come from L622
per-tick body-CP seed at `PhysicsEngine.ResolveWithTransition:622`
(filed as issue #96 for slice 2).
- **A6.P3 slice 2 — Gate L622 per-tick CP seed** (issue #96,
~1 day). Either remove the L622 seed entirely (rely on Mechanism
A + Mechanism B for CP propagation) OR gate it to fire only on
`body.ContactPlane` change. Verify slope walking + stair-climb +
cellar still work. Target: scen3 cp-write ≤ 100 (matches retail
BP7 ~0). Re-test phantom collisions + fall-through (issue #97,
hypothesized side-effect of #96) post-slice-2.
- **A6.P3 slice 3 — Finding 3 (cell-resolver sling-out)** (if not
closed as side-effect of slice 1+2). Re-capture scen4 first to
confirm whether sling-out persists. Otherwise: narrow fix in
`ResolveCellId` + `CheckBuildingTransit` cell-stickiness; remove
#90 workaround.
- **✓ SHIPPED — A6.P3 slice 2 — L622 seed investigation + no-op guard**
(2026-05-22, commits `892019b` v1 + `f8d669b` v2). v1 removed the
L622 seed entirely; broke BSP step_up at the last step of stairs
(user happy-test surfaced the regression). v2 reverted v1 + added
a no-op-if-unchanged guard inside `CollisionInfo.SetContactPlane`.
**#96 PARTIALLY ADDRESSED — accepted as documented retail
divergence.** The seed is load-bearing for `AdjustOffset`
slope-projection on sub-step 1 which BSP step_up depends on.
Matching retail would require deeper refactor (e.g. AdjustOffset
fallback to body.ContactPlane). Guard is benign improvement;
further #96 closure deferred.
- **A6.P3 slice 3 — Finding 3 (cell-resolver stickiness)** (NEXT,
~1-2 days). New M1.5-blocking bug surfaced during slice 2
verification: **user cannot walk UP from cottage cellar — stuck
at last step due to cell-resolver ping-pong** (issue #98). Same
family as #90 (existing workaround) + scen4 sling-out (Finding 3
from A6.P2). Retail oracle: `CObjCell::find_cell_list`
Position-variant at `acclient_2013_pseudo_c.txt:308742-308783`.
Port retail's cell-array hysteresis: prefer previous tick's
CellId when sphere is close to (but slightly outside) previous
cell's CellBSP volume. May close issues #98 (target), #97
(phantom collisions; same instability family), #90 (workaround
removal), and scen4 sling-out together. **No re-captures
required for slice 3 scope decision** — issue #98 evidence already
captured in `docs/research/2026-05-21-a6-captures/scen3_inn_2nd_floor_slice2v2/acdream.log`
cell-transit chain.
- Issue #95 (visibility blowup) NOT in A6.P3 scope — separate work
surface.
- **A6.P4 — Remove workarounds + visual verification** (~1 day after