docs: dat-reader investigation handoff + file #105 (white walls, tripwired)

Records the 2026-06-09 dat-reader thread-safety investigation: concurrent
READS on Chorizite.DatReaderWriter 2.1.7 exonerated (source audit + 1.1M-read
hammer, b3920d8); the real crash was dispose-during-read at teardown (fixed,
8fadf77); the white-walls mechanism remains open as #105 with every silent
dat-miss exit tripwired (7433b70) so the next occurrence self-attributes.

Also corrects project lore: the A.1-era rule that all dat reads must stay on
one thread does not hold for the 2.1.7 read path, and both investigation
subagents'' claimed ReadBlock instance-field race does not exist in the
shipped source — verify agent claims against source before acting on them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-09 21:29:06 +02:00
parent b3920d83f6
commit 8dc707d43b
2 changed files with 172 additions and 0 deletions

View file

@ -44,6 +44,47 @@ Copy this block when adding a new issue:
---
## #105 — Intermittent silent dat-load failure: white/missing cottage walls until relaunch
**Status:** OPEN
**Severity:** HIGH
**Filed:** 2026-06-09
**Component:** render, dat, streaming
**Description:** Intermittently (twice user-confirmed: once under heavy probe logging
2026-06-08, once on a completely clean launch 2026-06-09), the Holtburg cottage wall surfaces
render as background/clear color while the cells' static objects (paintings, furniture,
windows) draw normally. Once broken, broken for the whole session — the failed result is
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.
**Files:** `src/AcDream.App/Rendering/Wb/ObjectMeshManager.cs` (texture chains),
`src/AcDream.App/Rendering/Wb/DatCollectionAdapter.cs` (`DatDatabaseWrapper.TryGet`),
`src/AcDream.App/Rendering/TextureCache.cs` (`DecodeFromDats`),
`src/AcDream.App/Rendering/GameWindow.cs` (`BuildInteriorEntitiesForStreaming` hydration).
**Research:** `docs/research/2026-06-09-dat-reader-thread-safety-investigation.md`.
**Acceptance:** the next white-wall occurrence is attributed by a tripwire line (or by their
collective silence, pointing GL-side); the attributed root cause is fixed; walls survive 10+
launches including heavy-load ones. Tripwires can then be stripped (or kept as permanent
anomaly logging — decide at close).
---
## #104 — Scene VFX particles not clipped to the PView visible cell set
**Status:** OPEN