Files the independent review corpus (fable/opus/external + audit, DAT-format, F418 DAT-geometry, retail decomp reconstruction) and the synthesis that adjudicates their disagreements: retail roots INTERIOR at the posed terrace defect pose with a ONE-CELL flood and ov=1 (the free captures rooted outdoor - both were real); the falls are outdoor landblock emitters 0xCF418000-13; the "thin seam bands" claim is DAT-refuted (full-size exits; the seam is a coincident double exit-to-outside plane at y=48); clear+seals live inside retail''s ov>0 block with a one-frame seal latch. Carries the instrument-first plan (falls-owner trace, depth checkpoints, pose conformance) and the decomp-pinned repair sequence toward FW4''s single-owner goal. Also sweeps in the probe scaffolding slice 5''s path-limited add had missed (RenderingDiagnostics field + the launch-options row wording). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
9.1 KiB
Cathedral rendering review — independent troubleshooting prompt
You are an independent reviewer investigating a persistent rendering defect in acdream (a modern C# .NET 10 Asheron's Call client; the code is modern, the behavior must be retail). This is a report-only investigation: read anything, run read-only commands (git log/diff/show, grep, dat inspection), but do NOT edit code, do NOT build, do NOT launch clients, and do NOT commit. Your single deliverable is a written report (the path is given at the end).
Where the code is
- Git worktree (the active campaign branch, work here):
C:\Users\erikn\source\repos\acdream\.claude\worktrees\peaceful-blackburn-5333f0 - Branch:
claude/campaign-w-retail-frame-walk - HEAD at review time:
bb9212c7(FW4 slice 6) - Baseline before ANY cathedral-specific fix:
37febd1f— the owner first reported this defect on a build of that commit. Six fix commits followed (see below). The owner's verdict: nothing has fixed anything. - Main repository (for main-branch history):
C:\Users\erikn\source\repos\acdream
The defect (owner-observed, on a live ACE server at 127.0.0.1:9000)
At the cathedral terrace, landblock 0xF418, standing in interior EnvCells
0xF4180104 / 0xF4180106 (owner teleloc: 0xF4180104 [31.9 57.3 169.8]):
- Waterfall particles (the blue falls over the lake outside) render on
top of terrain, water, and other content that should occlude them.
Intermittent — toggles with which side of "the seam" (the terrace's
interior/outdoor boundary) the CAMERA is on. Standing outdoors near the
falls (
0xF418000B,0xF4180015) they look correct. - "Stalks" (dark monster-marker shapes near the lake-edge trees,
server-spawned weenies, e.g. entities parented at
0xF418010D) leak over trees and scenery. This predates the current campaign. - NEW (after the sixth fix): the owner reports particles WITHIN the cathedral are also wrong (uncharacterized — treat as a regression candidate of the fix stack).
- A previous session's analysis (owner-supplied) adds: the visible
cathedral shell is assembled from multiple authored GfxObjs
(
0x01001FB2,0x01001FB0,0x01001FB3) + EnvCells + a portal graph; cell0xF4180104has exterior portals 0/1/2/4 and interior portal 3 →0xF4180105; "if an incorrect depth or portal route prevents one wall's colour pass from drawing, the wall appears transparent even though its geometry and opaque texture are present."
The oracle fact that anchors everything: the RETAIL client connected to the SAME ACE server renders this scene perfectly. So a correct client-side mechanism exists; the task is to find what retail actually does for this scene and where our port diverges.
What you must do
-
Reconstruct retail's actual frame for this scene from the named decomp:
docs/research/named-retail/acclient_2013_pseudo_c.txt(18,366 PDB-named functions; grep byclass::method) anddocs/research/named-retail/acclient.h. Key functions:SmartBox::RenderNormalMode@0x00453aa0,PView::DrawInside@0x005a5860,PView::DrawCells@0x005a4840 (landscape draw pc:432719, gated depth clear pc:432731-2, exit seals pc:432785-6),LScape::draw@0x00506330,RenderDeviceD3D::DrawBlock@0x005a17c0 (per-shadow-cell object draw pc:430056-430064),RenderDeviceD3D::DrawSortCell@0x0059f140,RenderDeviceD3D::DrawBuilding@0x0059f2a0,CPhysicsObj::ShouldDrawParticles@0x0050FE60,D3DPolyRender::FlushAlphaList@0x0059d2e0,PView::GetClip@0x005a4320,PView::InitCell@0x005a4b70. A Ghidra MCP HTTP server may be live athttp://127.0.0.1:8081(/decompile_function?address=0x...) serving the same 2013 build with PDB names — use it when grep is too noisy. Answer specifically: for an interior root whose cell has exit portals, (a) what exactly gets view-clipped vs view-culled vs drawn whole; (b) when does each content class (terrain, sky, building shells, EnvCell shells, cell-static objects + their emitters, dynamic objects + their emitters, unattached emitters, water) draw relative to the gated depth clear and the exit seals; (c) how does the ONE alpha list drain (which flush sites, what depth is in place at each); (d) what depth does the frame hold at the aperture and at the vista at final-drain time. -
Read the cathedral's actual geometry from the installed DATs (
%USERPROFILE%\Documents\Asheron's Call\, DatCollection is the in-tree reader;references/ACVieweris a rendering oracle): landblock0xF418— the LandblockInfo object list, the EnvCells0x0100-0x0115-ish (esp.0x0104/0x0105/0x0106), their portal polygons (which are exits, flag 0x4 → other_cell 0xFFFF), their stab lists (the falls objects: local static ids0x4F418012-15were observed as the falls' particle owners; setup/gfx ids of waterfall objects), and where the water surface geometry lives. Establish: are the falls objects EnvCell stabs, landblock objects, or both? What shape/extent are the exit portal polygons vs the real visible opening (the prior campaign claims they are thin "seam bands")? -
Audit our implementation against that reconstruction, at BOTH
37febd1f(baseline) andbb9212c7(HEAD). The relevant code:src/AcDream.App/Rendering/Walk/(RetailFrameWalk, WalkPView, WalkFrameDriver, WalkViews, WalkScreenClip, WalkProductionWorldData),src/AcDream.App/Rendering/RetailPViewRenderer.cs,RetailPViewPassExecutor*.cs,ClipFrameAssembler.cs,ClipPlaneSet.cs,ParticleRenderer.cs,RetailAlphaQueue.cs,PortalVisibilityBuilder.cs(the legacy visibility layer FW4 is deleting),Scene/RenderScenePViewFrameProduct.cs. -
Judge the six fix commits individually — each claims a retail citation; decide keep / revert / wrong-mechanism for each:
37febd1fFW4 slice 1 — interior outside-view slices from the walk (was: old PortalVisibilityBuilder slices; also fixed punch-fan index aliasing).c40aecfcslice 2 — exit seals stamp the walk's own flood.5f7ccdeaslice 3 — outside-stage predicate reads the walk flood.f3a03efcslice 4 — exit-plane straddler DYNAMICS' particles emit pre-clear once (was: deliberately last-pass).0d6cd5c0slice 5 — straddling CELL-STATIC particles emit pre-clear (retail shadow-cell rule claim).bb9212c7slice 6 — interior roots draw terrain+sky UNCLIPPED (view-culled only), one terrain turn (was: per-exit-view scissor+clip slices). Evidence from the live probes is in%LOCALAPPDATA%\Temp\fw3-*.logand%LOCALAPPDATA%\Temp\fw4-*.log([walk-root],[walk-part],[walk-alpha],[walk-dyn],[walk-portal],[walk-emit]lines; the probe isACDREAM_PROBE_WALK_ROOT, documented indocs/launch-options.md).
-
Explain why the symptom survived all six fixes, and produce a concrete, mechanism-first fix plan (what to change, where, what retail evidence pins it, and what a falsifiable test/probe for it looks like BEFORE any code is written).
Required background reading (in this order)
claude-memory/project_pview_visibility_campaign.md(the #456 campaign memory — the proven mechanism model, the do-not-retry list; note:claude-memory/is a junction in the MAIN repo root atC:\Users\erikn\source\repos\acdream\claude-memory\; the same files are atC:\Users\erikn\.claude\projects\C--Users-erikn-source-repos-acdream\memory\)docs/plans/2026-08-30-campaign-fw-frame-walk.md(the active campaign plan — stages FW0-FW6, the FW1 conformance status, the FW4 slice log)claude-memory/project_render_pipeline_digest.md(render SSOT + DO-NOT-RETRY table)docs/research/2026-08-30-fw-walk-oracle/(the ten retail cdb traces the walk is conformance-tested against)docs/plans/2026-08-30-pview-visibility-campaign.md(the abandoned PView campaign — what was tried and refuted)
Hard rules
- The decomp is ground truth; ACE/ACViewer/WorldBuilder are interpretation aids. Where sources disagree, the decomp wins.
- Do not propose workarounds (suppression flags, grace periods, symptom-site early-outs). Root mechanisms only.
- Respect the do-not-retry lists in the memory docs (e.g., depth stamps as "retail's mechanism" is decomp-refuted; the panels are portal polys, not inert decoration).
- Every claim in your report needs a citation: a decomp address, a DAT field, a file:line in our tree, a probe-log line, or a commit SHA.
- If you cannot verify a claim, say so explicitly — an honest "unverified" beats a plausible guess. This investigation has already burned six fix rounds on plausible guesses.
Deliverable
Write your full report to: docs/research/2026-08-30-cathedral-review-<YOURNAME>.md
(replace <YOURNAME> with your model name, e.g. fable, opus,
external). Structure: Executive verdict (≤10 lines) → Retail frame
reconstruction → DAT geometry findings → Divergence table (ranked) →
Per-commit verdicts → Why the symptom survived → Recommended fix plan →
Open questions. Length: as long as it needs to be; completeness beats
brevity.