docs(render): FLAP settled by live-retail measurement — full retail port DECIDED (Option A) + exhaustive handoff

Attached cdb to the live 2013 retail client at the Holtburg doorway + read the decomp.
The indoor flap is a STRUCTURAL divergence, settled by measurement (not inference):

- Retail has ONE render path: DrawInside(viewer_cell) every frame. NO inside/outside
  branch (RenderNormalMode's outside branch is dead code; is_player_outside only gates
  sky/lighting). "Entering a building" is not a render event — only the camera sweep
  resolving a different viewer_cell. Same path before/after threshold -> no seam.
- Retail's eye JITTERS ~36um at rest yet membership is stable -> robustness is
  STRUCTURAL: many small per-building floods (~7/frame, ~2 cells each, via terrain BSP
  -> DrawPortal -> ConstructView(CBldPortal)), not one giant knife-edge flood.
- Our 3 divergences: (D1) invented inside/outside branch (GameWindow.cs:7498,
  clipRoot = viewerRoot ?? _outdoorNode :7396); (D2) synthetic _outdoorNode; (D3) one
  unified flood.

DECISION (user-approved): Option A — rip out branch + outdoor node, root always at the
real viewer_cell, one DrawInside, per-building rendering. Phased, conformance-tested,
visual-gated.

REFUTED by measurement (do not retry): bounded-propagation/churn (maxPop=1, 0/63k
reciprocals empty); byte-stable eye (retail's jitters ~36um — rest-snap cd974b2 failed +
regressed, reverted 9b1857a).

Lands the canonical exhaustive handoff for a FRESH session
(docs/research/2026-06-08-full-retail-render-port-OPTION-A-handoff.md), the CLAUDE.md
READ-THIS-FIRST banner, and reusable cdb apparatus. No project code changed; working tree
at the known-good baseline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-08 16:19:34 +02:00
parent 9b1857ac52
commit fe87e9794a
6 changed files with 629 additions and 0 deletions

View file

@ -0,0 +1,19 @@
* Retail render-state stability at the Holtburg doorway (2026-06-08)
* Central question does retail cell_draw_num (visible-cell membership) flicker
* as the camera sweeps or stay stable. Also viewer_cell ptr and eye cell.
* Offsets from flap-render-lookup PView +0x60 cell_draw_num +0x74 cell_todo_num
* +0x48 draw_landscape SmartBox +0x50 viewer_cell +0x08 viewer.objcell_id
* Auto-detach via .detach after threshold (cdb ignores qd inside bp actions)
* No semicolons in comment lines they split into commands
.logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\thirsty-goldberg-51bb9b\flap-render-retail-sweep.log
.sympath C:\Users\erikn\source\repos\acdream\refs
.symopt+ 0x40
.reload /f acclient.exe
r $t0 = 0
bp acclient!SmartBox::update_viewer "r $t0 = @$t0 + 1; .printf \"[uv] h=%d eyeCell=%x viewerCellPtr=%x\\n\", @$t0, poi(@ecx+0x08), poi(@ecx+0x50); .if (@$t0 >= 2500) { .detach } .else { gc }"
bp 0x005a57b0 "r $t0 = @$t0 + 1; .printf \"[cv-cell] h=%d drawNum=%d todoNum=%d land=%d root=%x\\n\", @$t0, poi(@ecx+0x60), poi(@ecx+0x74), poi(@ecx+0x48), poi(@esp+4); .if (@$t0 >= 2500) { .detach } .else { gc }"
bp 0x005a59a0 "r $t0 = @$t0 + 1; .printf \"[cv-bld] h=%d drawNum=%d todoNum=%d land=%d\\n\", @$t0, poi(@ecx+0x60), poi(@ecx+0x74), poi(@ecx+0x48); .if (@$t0 >= 2500) { .detach } .else { gc }"
.printf "flap render trace armed sweep the camera at the doorway now\n"
g