ship(phys): A6.P3 slice 1 — Indoor ContactPlane retention COMPLETE
Slice 1 ships the strip-synthesis + Mechanism B (LKCP restore) fix
addressing A6.P2 Finding 2. Includes:
- scen3_inn_2nd_floor_postfix paired capture (retail.log + decoded
+ acdream.log) as verification artifact. acdream cp-write count
dropped from 86,748 to 25,082; per-unit-of-activity rate dropped
63x (164.61 -> 2.60 cp-writes per cell-cache event).
- Findings doc (docs/research/2026-05-21-a6-cdb-capture-findings.md)
appended with slice 1 SHIPPED section: commit map, scen2/scen3
pre/post comparison tables, user happy-test results, status of
each A6.P2 finding (Finding 1 CLOSED as side-effect, Finding 2
PARTIALLY CLOSED with remaining 99.3% from L622 seed flagged
as #96, Finding 3 + #95 still open), slice 2 recommendation.
- Issue #96 filed: "Per-tick PhysicsEngine.ResolveWithTransition CP
seed contributes 99.3% of post-slice-1 CP writes." Slice 2 target.
Sketch options: remove entirely / gate by change-detection / no-op
guard inside SetContactPlane.
- Issue #97 filed: "Phantom collisions + occasional fall-through on
indoor 2nd floor." User-reported during happy-testing. HYPOTHESIS:
side-effect of #96; falsifiable by re-testing post-slice-2.
- CLAUDE.md updated: Currently-working-toward block now points at
A6.P3 slice 2 (#96) as the active phase. M1.5 building/cellar
demo half is ACHIEVABLE NOW (slice 1 unblocked the physics).
- Roadmap updated: A6.P3 broken into 3 slices, slice 1 marked
SHIPPED with commit history.
KEY USER-VISIBLE OUTCOME: stairs + cellar descent now WORK in acdream
(user happy-test confirmed walking up/down inn stairs multiple times,
walking down to cellar). A6.P2 Finding 1 (dispatcher entry frequency
mismatch) confirmed as secondary effect of Finding 2 — closed without
explicit Finding 1 work, as A6.P2 hypothesized.
REMAINING CONCERNS for slice 2 + future:
- L622 per-tick seed (#96) still firing 24,906 times in scen3 postfix
- Phantom collisions + fall-through on 2nd floor (#97)
- See-through-walls indoors (#95, separate scope)
- Indoor lighting broken (A7 scope)
Test suite: 1148 pass + 8 pre-existing fail (baseline maintained;
T3 IndoorContactPlaneRetentionTests adds the +1).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
066568a711
commit
f04ea90050
7 changed files with 127435 additions and 24 deletions
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -282,3 +282,75 @@ Per spec §5.1: "highest-confidence single-cause fix first."
|
|||
- **A6.P1.5** (optional, ~1 hour): extend cdb probe with paired entry/exit BPs to capture `adjust_sphere_to_plane` output delta (Table 1) and `find_collisions` exit-path discrimination (Table 2). Only needed if A6.P3 fixes don't close the symptoms and we need sharper data. Defer until after A6.P3 first attempt.
|
||||
- **Issue #95** (separate work surface): portal-graph visibility blowup. Schedule outside A6 since fixing it unblocks scen6-9 captures and any future dungeon physics work.
|
||||
- **Symptom roster update:** add "indoor sling-out" to M1.5 symptom list (Finding 3 family); already captured here as a finding, but M1.5 doc should reflect it.
|
||||
|
||||
---
|
||||
|
||||
## A6.P3 slice 1 — SHIPPED 2026-05-21
|
||||
|
||||
Strip-synthesis + Mechanism B (LKCP restore) fix landed in 8 commits across this same session:
|
||||
|
||||
| Commit | Task | What |
|
||||
|---|---|---|
|
||||
| `ba9655f` | plan | A6.P3 slice 1 implementation plan written |
|
||||
| `6b4be7f` + `c6bc2b9` | T1 | Research note: retail's `CTransition::validate_transition` LKCP-restore (line 272565-272583) + insertion-point identified in our `Transition.ValidateTransition` at TransitionTypes.cs:2849 |
|
||||
| `869edd9` | T2 | Test instrumentation: `CollisionInfo.ContactPlaneWriteCount` counter |
|
||||
| `36975ef` + `a32f569` | T3 | Failing regression: `IndoorContactPlaneRetentionTests` — asserts ≤5 CP writes across 60 flat-floor frames |
|
||||
| `5aba071` | T4 | Mechanism B (LKCP restore) inserted in `ValidateTransition` + proximity-check sphere bug fix (`GlobalSphere[0]` → `GlobalCurrCenter[0]`) |
|
||||
| `5f7722a` + `39fc037` + `bd5fe2e` | T5 | Indoor branch of `FindEnvCollisions` stripped to match retail's tiny `CEnvCell::find_env_collisions` shape; test redesigned as real regression sentinel (validated 60-writes-pre-strip → 0-writes-post-strip) |
|
||||
| `066568a` | T6/T7 partial | scen2_inn_stairs_postfix acdream capture proves stairs now work |
|
||||
| (this commit) | T6 + T8 | scen3_inn_2nd_floor_postfix capture + bookkeeping (findings doc + roadmap + CLAUDE.md + issues #96/#97 filed) |
|
||||
|
||||
### scen3 re-capture results (postfix)
|
||||
|
||||
scen3 (Holtburg inn 2nd floor flat-walk) re-captured in this slice-1 ship commit:
|
||||
|
||||
| Metric | Pre-fix (4b5aebc) | Post-fix | Reduction |
|
||||
|---|---:|---:|---:|
|
||||
| acdream cp-write (absolute) | 86,748 | 25,082 | 3.5× |
|
||||
| acdream cell-cache events (proxy for session length) | 527 | 9,629 | 18× longer session |
|
||||
| **cp-write per cell-cache (normalized)** | **164.61** | **2.60** | **63.2× per-unit-of-activity** |
|
||||
| retail BP7 set_contact_plane | 0 | 0 | unchanged (oracle) |
|
||||
|
||||
Per-unit-of-activity drop is the meaningful number — a longer post-fix session naturally accumulates more total writes, but the rate per "unit of activity" (cell-cache events ~ landblocks traversed) collapsed 63×.
|
||||
|
||||
### scen2 re-capture results (postfix — UNEXPECTED WIN)
|
||||
|
||||
scen2 (Holtburg inn stairs) acdream re-captured at commit `066568a`. **Pre-fix: physics hammered BSP trying to resolve stairs (failure mode). Post-fix: user walked up and down stairs multiple times with no failure.** Tag shape shifted:
|
||||
|
||||
| Tag | Pre-fix (stair FAIL) | Post-fix (stair SUCCESS) | Signal |
|
||||
|---|---:|---:|---|
|
||||
| indoor-walkable | 859 | **0** | synthesis gone (as designed) |
|
||||
| push-back-cell | 1,478 | 879 (-40%) | multi-cell iteration relaxed |
|
||||
| push-back | 51 | 345 (+577%) | real step_up firing |
|
||||
| push-back-disp | 4,156 | 6,055 (+46%) | real BSP traversal |
|
||||
| cp-write | 33,969 | 57,846 | L622 seed (slice 2 work) |
|
||||
|
||||
Stairs working post-slice-1 confirms A6.P2's hypothesis that **Finding 1 (dispatcher entry frequency mismatch) was a secondary effect of Finding 2** — fixing CP retention also closes the cell-array iteration storm that prevented stair-step resolution.
|
||||
|
||||
### Visual verification (user happy-testing, 2026-05-21)
|
||||
|
||||
User report from happy-testing session post-slice-1:
|
||||
- ✅ 2nd floor walking works (with caveats below)
|
||||
- ✅ Stairs up + down work (M1.5 demo target unblocked)
|
||||
- ✅ Cellar descent works (M1.5 demo target unblocked)
|
||||
- ❌ Phantom collisions occasionally on 2nd floor — filed as **issue #97** (hypothesis: caused by #96)
|
||||
- ❌ Occasional fall-through on 2nd floor — filed as **issue #97** (same)
|
||||
- ❌ See-through-walls indoors — **issue #95** (not A6 scope; visibility blowup)
|
||||
- ❌ Indoor lighting broken — **A7 scope**
|
||||
|
||||
### Status of A6.P2 findings post-slice-1
|
||||
|
||||
| Finding | Status post-slice-1 |
|
||||
|---|---|
|
||||
| Finding 1 — dispatcher entry frequency mismatch | **CLOSED as side-effect of Finding 2 fix** (scen2 dispatcher shape now retail-like) |
|
||||
| Finding 2 — ContactPlane resynthesis blowup | **PARTIALLY CLOSED.** Synthesis path eliminated (indoor-walkable = 0). Remaining 99.3% of post-fix CP writes come from `PhysicsEngine.ResolveWithTransition` line 622 — a per-tick body-CP seed that retail doesn't do. **Filed as issue #96** for slice 2. |
|
||||
| Finding 3 — Indoor cell-resolver sling-out | OPEN. Not addressed by slice 1. Needs scen4 re-capture to confirm whether sling-out symptom persists post-slice-1 (possible side-effect close); separate fix surface in ResolveCellId / CheckBuildingTransit otherwise. |
|
||||
| Finding 4 — Portal-graph visibility blowup | OPEN as issue #95 (not A6 scope; user-confirmed during happy-testing). |
|
||||
|
||||
### Slice 2 recommendation
|
||||
|
||||
**Highest-value next slice: gate the L622 per-tick CP seed.** It's responsible for 99.3% of remaining post-fix CP writes (24,906 of 25,082 in scen3 postfix). Retail's equivalent code path fires zero `set_contact_plane` calls during flat-floor walks. Either remove the seed entirely (rely on Mechanism A/B for CP propagation) OR gate it to fire only when the body's CP has changed since last seed.
|
||||
|
||||
After slice 2, re-test phantom collisions + fall-through (issue #97) — they may close as side-effects (same family of "CP state being unstable across ticks"). If not, that becomes slice 3 territory + Finding 3 work.
|
||||
|
||||
A6.P4 (workaround removal + visual verification) can proceed in parallel with slice 2 if scope allows.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue