test(p0): retail-trace golden captured — membership criterion divergence pinned (P0 GATE MET)
P0 Task 6 complete. Captured live retail membership at the 0031<->0170<->0171 doorway via cdb on CPhysicsObj::change_cell (symbol-driven; offsets verified by discover-types.cdb; PDB MATCH). 22 transitions, clean monotonic sequence, NO ping-pong (retail is correct-by-construction). Golden: Conformance/Fixtures/find-cell-list-threshold.log. ROOT-CAUSE FINDING (the central P1 work): retail transitions membership at the PORTAL CROSSING (CEnvCell::find_transit_cells @ 0x52c820 pc:309968 — sphere crosses the doorway polygon plane), while acdream's FindCellList re-picks by POINT-IN-CELL containment at the foot. Retail commits room 0171 while the foot is STILL inside vestibule 0170's BSP (in_0171=0); acdream lags. ALL 22 transitions diverge for this one criterion mismatch — not a per-cell hysteresis or a building-entry-only split. This is master-plan §0 'hysteresis gap' confirmed against the real client. FindCellList_DoorwayThreshold_DivergesFromRetail_PendingP1 (documents-the-bug, GREEN) + ThresholdDivergenceDiagnosticTests (per-transition containment print) pin it; both flip when P1 ports the directed portal crossing. Conformance 59 pass / 1 skip / 0 fail; full Core 1308 pass / 5 fail (baseline) / 1 skip — no new failures. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1662da8731
commit
bb4dead0ae
7 changed files with 253 additions and 59 deletions
|
|
@ -74,29 +74,60 @@ hit-counters, `set_neg_poly_hit`, etc.); they carry no membership cell-id or pos
|
|||
retail-trace-backed threshold golden **cannot** be built from existing data — a live capture is
|
||||
required (`tools/cdb/find-cell-list-capture.cdb`).
|
||||
|
||||
## P0 status / P1-entry checklist
|
||||
## Retail capture — DONE (2026-06-03). The P0 gate is MET.
|
||||
|
||||
**Autonomous apparatus: COMPLETE + GREEN.** (Conformance suite 58 pass / 1 skip / 0 fail.)
|
||||
Captured live from retail (cdb on `CPhysicsObj::change_cell`, symbol-driven, PDB MATCH) at the
|
||||
"Agent of Arcanum" house — which by geometry IS the `0170`/`0171` building. **22 transitions, a
|
||||
perfectly clean monotonic `0031↔0170↔0171` sequence, NO ping-pong** (retail's membership is
|
||||
correct-by-construction, as the master plan asserts). Golden fixture committed at
|
||||
`tests/AcDream.Core.Tests/Conformance/Fixtures/find-cell-list-threshold.log`. Capture+decode
|
||||
tooling: `tools/cdb/find-cell-list-capture.cdb` + `tools/cdb/decode_fcl_capture.py`.
|
||||
|
||||
## ★ ROOT-CAUSE FINDING (the central P1 work) ★
|
||||
|
||||
The per-transition containment diagnostic (`ThresholdDivergenceDiagnosticTests`) shows **all 22
|
||||
transitions diverge**, for ONE reason:
|
||||
|
||||
| retail transition | retail picks | acdream `FindCellList` | foot `in_seed` | `in_0170` | `in_0171` |
|
||||
|---|---|---|---|---|---|
|
||||
| `0170→0171` (enter room) | **0171** | 0170 | 1 | 1 | **0** |
|
||||
| `0171→0170` (leave room) | **0170** | 0171 | 1 | 0 | **1** |
|
||||
| `0170→0031` (exit bldg) | **0031** | 0170 | 1 | 1 | 0 |
|
||||
| `0031→0170` (enter bldg) | **0170** | 0031 | 0 | 0/1 | 0 |
|
||||
|
||||
**Retail transitions membership at the PORTAL CROSSING** (`CEnvCell::find_transit_cells` — the
|
||||
sphere crosses the doorway polygon plane). **acdream's `FindCellList` re-picks by POINT-IN-CELL
|
||||
containment at the foot.** So retail commits the neighbour cell BEFORE the foot point is
|
||||
geometrically inside it (it enters room `0171` while the foot is still inside vestibule `0170`'s
|
||||
BSP, `in_0171=0`), and acdream lags. This is the master-plan §0 "hysteresis gap" diagnosis
|
||||
confirmed against live retail — and it is NOT a per-cell hysteresis or a building-entry-only split;
|
||||
it is a single criterion mismatch (directed portal crossing vs point-in-cell) that affects EVERY
|
||||
threshold transition.
|
||||
|
||||
**P1's central job:** port `CEnvCell::find_transit_cells` (`@ 0x52c820 pc:309968`) directed
|
||||
portal-crossing so membership transitions at the doorway plane, not at the BSP-containment
|
||||
boundary. (Plus intrinsic building entry A3 + uniform `find_env_collisions` B1.) The
|
||||
documents-the-bug test `FindCellList_DoorwayThreshold_DivergesFromRetail_PendingP1` PASSES while
|
||||
this diverges and FAILS when P1 lands → rewrite it to assert the full sequence then.
|
||||
|
||||
## P0 status / P1-entry checklist — COMPLETE
|
||||
|
||||
**Apparatus: COMPLETE + GREEN.** (Conformance suite 59 pass / 1 skip / 0 fail.)
|
||||
- ✅ Dat-backed fixture loader (`ConformanceDats`).
|
||||
- ✅ Characterized + pinned cottage-doorway topology (`0031↔0170↔0171` verified real).
|
||||
- ✅ `point_in_cell` goldens vs real dat BSP.
|
||||
- ✅ `find_cell_list` unambiguous goldens (interior picks + stale-seed re-pick stability).
|
||||
- ✅ Retail-trace parser (`RetailTrace`, 4 tests) + cdb capture script + README.
|
||||
- ✅ Retail-trace parser + cdb capture script + decoder + README.
|
||||
- ✅ PVS-golden scaffold (skipped; filled in P4).
|
||||
- ⏳ `FindCellList_DoorwayThreshold_MatchesRetailTrace` — wired, **skips until the capture fixture
|
||||
`Conformance/Fixtures/find-cell-list-threshold.log` exists**.
|
||||
|
||||
**P0 gate for P1 (`≥1 retail-trace-backed assertion`): PENDING the one user-gated capture.**
|
||||
The existing traces don't satisfy it (collision-only). To meet the strict gate, run
|
||||
`tools/cdb/find-cell-list-capture.cdb` against live retail at the cottage doorway (its README is
|
||||
the runbook), decode, drop the log at the fixture path, and re-run the threshold test:
|
||||
- GREEN → acdream already matches retail at the threshold; P1's membership port preserves it.
|
||||
- RED → the P1 divergence, captured as a documents-the-bug conformance test (do not weaken).
|
||||
- ✅ **Retail-trace golden captured + the threshold divergence pinned (documents-the-bug, GREEN).**
|
||||
- ✅ **P0 GATE MET: ≥1 retail-trace-backed assertion exists. P1 may begin.**
|
||||
|
||||
**Re-scope note for P1 (discovered during P0):** this branch already carries the membership
|
||||
"Stage 1" work the master plan's §2 "acdream now" column lists as partial — `CellArray` (ordered
|
||||
CELLARRAY / R1 flap fix), `FindCellSet`'s interior-wins pick (cites pc:308788-308825),
|
||||
`RunCheckOtherCellsAndAdvance` (collide-then-pick), swept `sp.CurCellId` return, player-only
|
||||
`UpdatePlayerCurrCell`. P1's REAL remaining scope is narrower: intrinsic building entry (delete
|
||||
`CheckBuildingTransit`) + uniform `find_env_collisions` (delete the `cellLow >= 0x0100` fork) +
|
||||
demote `ResolveCellId` to seed-only. Re-confirm against the code when P1 starts.
|
||||
`UpdatePlayerCurrCell`. But the ROOT-CAUSE finding shows the pick CRITERION itself is wrong
|
||||
(point-in-cell, not portal-crossing) — so P1 is NOT just "delete CheckBuildingTransit"; it is
|
||||
**port `find_transit_cells`' directed portal crossing as the membership transition mechanism**,
|
||||
then delete `CheckBuildingTransit` + unify `find_env_collisions`, then demote `ResolveCellId` to
|
||||
seed-only. Re-confirm against the code when P1 starts.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue