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:
parent
0a38d934fd
commit
12fb408972
2 changed files with 148 additions and 12 deletions
|
|
@ -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`),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue