# P0 — Conformance apparatus notes (characterized topology + goldens) 2026-06-03. Companion to [`docs/superpowers/plans/2026-06-03-p0-conformance-apparatus.md`](../superpowers/plans/2026-06-03-p0-conformance-apparatus.md). Source of truth for the cell ids + golden inputs the P0 conformance tests pin. All values below were **characterized from the real client dats** (not guessed) by `CottageDoorwayCharacterizationTests` against `%USERPROFILE%\Documents\Asheron's Call`. ## Characterized Holtburg (landblock 0xA9B4) indoor neighborhood Scanned `0xA9B40140..0xA9B4017F`. All cells load with a real ContainmentBsp and `seenOutside=1`. Cells share a per-BUILDING world origin (the building's reference frame). The distinct buildings: | Cell range | World origin | Stab | Identity | |---|---|---|---| | `0140..0150` (17 cells) | (130.50, 11.50, 94.00) | 17 | **Cottage-with-cellar** (#98 cellar saga; exit portals at 0145,014C,014E,014F,0150) | | `0151..0169` (25 cells) | (107.50, 36.00, 94.00) | 24 | Larger building (inn) | | `016A..016E` (5 cells) | (79.50, 37.50, 94.00) | 4 | Small building | | **`016F..0175` (7 cells)** | **(161.93, 7.50, 94.00)** | 6 | **THE doorway-threshold building (master-plan 0170/0171)** | | `0176..0178` | (65.21, 156.63, 66.00) | 2 | — | | `0179..017A` | (158.18, 37.71, 94.00) | 1 | — | | `017B..017F` | (161.72, 105.05, 66.00) | 4 | — | ## The pinned threshold topology (master-plan `0031↔0170↔0171`) Building at world origin **(161.93, 7.50, 94.00)**: | Cell | Role | Portal dests | seenOutside | BSP | |---|---|---|---|---| | `0xA9B40170` | **vestibule / doorway** | `[0xFFFF (exit→outdoor), 0x0171]` | 1 | real | | `0xA9B40171` | **room** (behind the door) | `[0x0170, 0x0173, 0x0175]` | 1 | real | Grid math confirms the outdoor side: origin (161.93, 7.50) → gridX = ⌊161.93/24⌋ = 6, gridY = ⌊7.5/24⌋ = 0 → landcell id `6*8 + 0 + 1 = 49 = 0x31` → **outdoor landcell `0xA9B40031`**. So the player crossing the doorway traverses `0031 (outdoor) → 0170 (vestibule, via the 0xFFFF exit portal) → 0171 (room)` — exactly the master-plan ping-pong `0031↔0170↔0171`. **Verified real.** > Naming note: a 2026-05-21 capture dir called `0170/0171` the "inn 2nd floor"; that label was > loose. By geometry it is the 7-cell building at (161.93, 7.50). Identity (cottage vs inn) is > irrelevant to the conformance — what matters is `0170` carries the exit portal (the doorway) and > `0171` is the room behind it. ## Golden interior points (verified `point_in_cell == true`) Cell-LOCAL points whose `EnvCell.PointInCell(world)` returns true (the world form is `Vector3.Transform(local, cellPhysics.WorldTransform)`): | Cell | Interior LOCAL point | Interior WORLD point | Notes | |---|---|---|---| | `0xA9B40170` | (5.865, -8.449, 0.417) | (156.06, 15.95, 94.42) | 115/125 grid-inset points inside (small/irregular vestibule) | | `0xA9B40171` | (6.55, -3.25, 4.60) | (157.01, 13.69, 95.53)* | bounds-center = bsphere origin; 125/125 inside (clean box) | \* world recomputed by the test at runtime via the cell's WorldTransform; the value above is the firstInside probe — the canonical bsphere-origin local (6.55,-3.25,4.60) is also fully interior. These are **retail-faithful by construction**: the ContainmentBsp is loaded from the same dats retail loads, so a geometrically-correct containment answer is the retail answer. ## Golden provenance summary | Golden | Provenance | Status | |---|---|---| | `point_in_cell` (interior true, far-away false) | geometric (real dat BSP) | autonomous (Task 3) | | `find_cell_list` deep-inside picks `0171`/`0170` | geometric (real dat cells) | autonomous (Task 4) | | `find_cell_list` doorway-threshold pick | **retail cdb trace** | Task 6 — USER GATE / mine existing traces | | PVS visible-set | retail cdb `cell_draw_list` trace | deferred to P4 (Task 7 scaffold) | ## Existing retail traces — mined, NOT usable for membership `docs/research/2026-05-21-a6-captures/*/retail.log` + `retail.decoded.log` were grepped for `change_cell` / `curr_cell` / `find_cell_list` / `cell=0x` / `insert_into_cell`. **Zero matches in any retail log** — all 15,492 membership/cell-id matches are in the paired `acdream.log` files (our own probe output). The committed retail traces are collision-only (`find_collisions` hit-counters, `set_neg_poly_hit`, etc.); they carry no membership cell-id or position. So the 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 **Autonomous apparatus: COMPLETE + GREEN.** (Conformance suite 58 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. - ✅ 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). **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.