docs: #106 pinned — outdoor membership freezes at landblock boundaries

The 53MB flap-probe capture (user live-reproduced the broken-house entry)
plus 3-agent analysis settles the day: playerCell froze at 0xA9B40031 for
10,449 frames spanning ~130m of outdoor walking into landblock A9B3 and a
stand INSIDE an A9B3 cottage. Within-landblock outdoor flips are 96/96
clean; all 10 successful indoor entries were same-landblock buildings; the
single cross-landblock entry failed. The render flood independently drew the
A9B3 interior cells the whole time — rendering is downstream and healthy;
membership is the broken layer (feedback_render_downstream_of_membership,
proven again). The stale render anchor also explains the outdoor running
distortion; the capture refutes flood-level causes outdoors (26,960/26,960
outdoor frames rigid at outPolys=1 vis=1).

Files #106 (HIGH, physics/membership) with fix pointers: ResolveCellId /
AddAllOutsideCells cross-landblock proposal, the b3ce505 outdoor-sweep gate
(possible stopgap fallout, like #99), retail find_cell_list :308742 +
LandDefs.get_outside_lcoord. Reframes #105: largely superseded by #106;
residual (single wall missing while membership indoor-correct) stays open
with all tripwires armed. Handoff:
docs/research/2026-06-09-105-capture-analysis-membership-landblock-pin.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-09 22:38:19 +02:00
parent 0a38d934fd
commit 12fb408972
2 changed files with 148 additions and 12 deletions

View file

@ -44,6 +44,49 @@ Copy this block when adding a new issue:
---
## #106 — Outdoor player-cell membership FREEZES at landblock boundaries (whole interiors unenterable)
**Status:** OPEN
**Severity:** HIGH
**Filed:** 2026-06-09
**Component:** physics, membership
**Description:** Walking outdoors across a landblock boundary does NOT update the player's
outdoor cell: `playerCell` stays pinned to the last cell of the previous landblock,
indefinitely. Every downstream consumer degrades: entering any building in the new landblock
never fires the outdoor→indoor membership transition (the interior never renders — "I'm inside
but it looks like I'm standing outside"), and the render root stays anchored at the stale
outdoor cell, producing the "screen distorted with world background" artifacts while running.
**Root cause / status:** PINNED by live capture 2026-06-09 (`flap-105-capture.log`, 53 MB,
analyzed in `docs/research/2026-06-09-105-capture-analysis-membership-landblock-pin.md`):
playerCell froze at `0xA9B40031` at log line 93363 and never changed for 10,449 frames —
spanning ~130 m of outdoor walking into landblock `0xA9B3` (player y reaching 109 in
A9B4-local coords) and an 8,929-frame stand inside an A9B3 cottage. Within-landblock outdoor
transitions are clean (96/96); all 10 successful indoor entries were same-landblock buildings;
the single failure was the only cross-landblock building entered. The render flood
independently SAW the A9B3 interior cells (`0xA9B301xx` in `[render-sig]`) — rendering is
downstream and healthy; membership is the broken layer. Suspects for the fix session: the
outdoor candidate-cell proposal in `PhysicsEngine.ResolveCellId` / `CellTransit.AddAllOutsideCells`
(a coord-convention bug there was fixed 2026-05-25; cross-landblock proposals may still be
missing or gated), and the `b3ce505` #98 stopgap which GATED the outdoor sweep (the physics
digest carries this workaround debt — this may be its fallout). Retail oracle:
`CObjCell::find_cell_list` Position-variant (`acclient_2013_pseudo_c.txt:308742-308783`) +
`LandDefs` outside-cell coordinate handling.
**Files:** `src/AcDream.Core/Physics/PhysicsEngine.cs` (ResolveCellId),
`src/AcDream.Core/Physics/CellTransit.cs` (AddAllOutsideCells),
`src/AcDream.Core/Physics/` membership chokepoint (UpdateCellId).
**Research:** `docs/research/2026-06-09-105-capture-analysis-membership-landblock-pin.md`.
**Acceptance:** walk outdoors from Holtburg across each neighboring landblock boundary —
`[cell-transit]` (ACDREAM_PROBE_CELL=1) shows the outdoor cell updating to the new landblock's
cells; enter a cross-landblock building — membership transitions indoor and the interior
renders; the running-distortion artifacts stop accumulating with distance.
---
## #105 — Intermittent silent dat-load failure: white/missing cottage walls until relaunch
**Status:** OPEN
@ -58,18 +101,21 @@ windows) draw normally. Once broken, broken for the whole session — the failed
cached (mesh batches build once, hydration runs once). The failure has never produced a single
log line: every dat-read failure on the walls-relevant paths exits silently.
**Root cause / status:** NOT YET ATTRIBUTED — but heavily narrowed (full evidence:
`docs/research/2026-06-09-dat-reader-thread-safety-investigation.md`). Refuted: the dat
library's concurrent read path (Chorizite.DatReaderWriter 2.1.7) is exonerated by line-level
source audit + the in-tree hammer test (`DatConcurrencyStressTests`, ~1.1M concurrent reads,
zero anomalies). Fixed nearby: the teardown dispose-during-read AccessViolation (`8fadf77`).
Remaining candidates: a lifecycle/ordering race in our hydration/streaming pipeline, or a
GL-side staged-upload / bindless-residency failure under load. Tripwire log lines
(`[dat-miss]` / `[tex-miss]` / `[tex-skip]` / `[cell-miss]`, commit `7433b70`) now cover every
silent exit; the next occurrence self-attributes in the launch log. Discriminator: magenta
walls = TextureCache decode miss; see-through + `[tex-skip]`/`[dat-miss]` = mesh-build miss;
see-through + `[cell-miss]` = hydration miss; broken with NO tripwire output = GL-side —
instrument `WbMeshAdapter.Tick`'s upload drain next.
**Root cause / status:** LARGELY SUPERSEDED BY #106 (2026-06-09 evening): the live capture
pinned "whole interior missing / enter house and see outside" to the cross-landblock outdoor
membership freeze — most "broken house" reports were that. What REMAINS under #105 is the
narrower residual observed twice earlier: a single wall section missing (sky/clear color)
**while membership and viewer cell were demonstrably correct and INDOOR** (`viewerCell=0171`,
props drawn, collision present). All data/upload/registration layers are exonerated for it:
four rounds of tripwires (`[dat-miss]`/`[tex-miss]`/`[tex-skip]`/`[cell-miss]`,
`[geom-null]`/`[geom-misroute]`/`[up-null]`, `[finalize-replace]`/`[late-register]`) were
silent across every reproduction, the dat library is exonerated (`DatConcurrencyStressTests`,
~1.1M concurrent reads), and the capture analysis shows no never-flooding building and no
empty indoor floods. The teardown dispose-during-read AccessViolation was fixed nearby
(`8fadf77`). Known-benign noise: `[up-null]` for `0x010002B4`/`0x010008A8` (deterministic,
legitimately empty meshes). If the residual reproduces, the remaining suspects are the
draw-level clip path (the §4 edge-on clip family) — note `BuildFromExterior` has NO pv-trace
hook yet (add one for attribution). Keep all tripwires until this closes.
**Files:** `src/AcDream.App/Rendering/Wb/ObjectMeshManager.cs` (texture chains),
`src/AcDream.App/Rendering/Wb/DatCollectionAdapter.cs` (`DatDatabaseWrapper.TryGet`),