acdream/docs/research/2026-08-30-cathedral-synthesis.md
Erik 6d990d38b3 docs: the cathedral seven-report synthesis + adjudicated FW4 plan
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>
2026-08-30 20:52:14 +02:00

8.6 KiB
Raw Blame History

Cathedral rendering — the seven-report synthesis and adjudicated plan

2026-08-30. Synthesizes: the fable review, the opus review, the external model review (owner-supplied), the code+probe-log audit, the DAT-format report, the F418 DAT-geometry report, and the retail decomp reconstruction (2026-08-30-cathedral-review-*.md). Where reports disagreed, the adjudication below names the winner and the evidence.

Adjudications (the disagreements, settled)

  1. Root kind at the terrace. The fable review said "retail never roots interior at the terrace" (top-level free traces: zero DI); the external review cited DI f4180104, ov=1, n=1. BOTH are right about different captures: posed/terrace-center.log (the defect pose) shows 39× DI f4180104 + DC ov=1 n=1; the top-level free captures rooted outdoor. VERDICT: retail roots interior at our defect pose, with a ONE-CELL flood and healthy exit views. The divergence to chase is the FLOOD SHAPE and the exit-view survival, not the root kind.
  2. The falls' identity. Opus said cell-0x106 stabs; the DAT-geometry report proves the falls emitters are OUTDOOR LANDBLOCK OBJECTS (0xCF41800013: 7 east jets Setup 0x0200085A, 7 north jets 0x02000859, 6 lake mist 0x020003C5), and 0x4F41801215 are cell 0x106's TORCHES + prop + plant. VERDICT: DAT-geometry wins (byte-exact parse); slice 5 moved torches — the in-cathedral particle regression. Confirmed by the external review. Residual: trace the 0xC owners' live route (never directly observed in any probe — instrumentation step 1).
  3. "Thin authored seam bands." REFUTED by the DAT: all exits at 0x104/0x106 are full-size (10.72×10.20 m facades, 24×9.2 m arches). Thin/empty exit views (the 66 ov==0 frames) are OUR projection/clip/traversal loss. The REAL seam: 0x104's south exit and 0x106's north exit are the SAME coincident rectangle at y=48, EACH authored exit-to-outside — two abutting buildings; retail cannot flood between these cells (they meet only through 0xFFFF portals).
  4. "Retail gates clear+seals on ov>0." Refined by the decomp reconstruction: the WHOLE landscape→drain→stamp→clear→seals block is inside ov > 0 (pc:432715), and the depth clear is additionally a ONE-FRAME LATCH armed by the previous frame's seals (portalsDrawnCount, pc:432725-32). Ours emits clear+seals unconditionally — divergence confirmed, mechanism refined.
  5. "Stale color." Retail full-clears COLOR+depth every frame at BeginScene (Clear(7), pc:68673-86). Whether our ov==0 frames show stale color depends on our world-pass color-load behavior — UNVERIFIED; the instrumentation phase settles it. Either way the ov==0 frames are wrong (retail has ov=1 at those poses).

The frame truth (retail, interior root — the decomp reconstruction)

See 2026-08-30-cathedral-review-decomp.md for the full pc-cited version. Load-bearing facts:

  • TWO PViews: the root's (draw_landscape=1) and the look-ins' (draw_landscape=0, ov always 0) — look-in floods are ISOLATED from the root flood and never trigger landscape/clear/seals.
  • Landscape (sky, terrain in_view-culled + drawn whole, buildings with punches + look-in interiors, outdoor objects INCLUDING the falls emitters' parts) all draws PRE-clear; the full alpha drain at pc:432720 resolves outdoor translucency vs outdoor depth.
  • m_nFrameStamp re-arms mid-frame (pc:432722): straddling parts draw in BOTH scopes. "Emit once" is anti-retail.
  • z-only clear (latch-gated) → exit seals: EVERY 0xFFFF portal of EVERY flooded cell, TRUE depth, DEPTHTEST_ALWAYS + write, invisible fan, clipped to the installed view.
  • Interior shells (whole, once, z-test only) → interior objects/emitters (per-view sphere-cull, whole) → final drain vs interior+seal depth.
  • Alpha lists: two FIFOs, NO sort at flush; order = the walk + per-cell CYpt insertion sort. Full-flush sites: DrawBuilding (0f!), DrawCells pre-clear, RenderNormalMode final; DrawBlock's per-cell 0.75 pressure valve (BN misread resolved — it DOES fire).
  • ShouldDrawParticles = UPDATE-time NoDraw (distance; cell test VACUOUS for interior emitters — CEnvCell inherits constant PARTIALLY_INSIDE, PDB-verified ICF fold @0x005269f0).

Why six fixes failed (unanimous)

Slices 13+6 repaired real seams of the hybrid renderer; slices 45 acted on a misidentified target (torches ≠ falls) with an invented mechanism (sphere-straddle) — and no round measured depth at the artifact pixels or verified the target's identity against the DAT before editing. The two live defect mechanisms (the ov==0 frames; the missing degrade admission for marker anchors) were never in any slice's scope.

Per-commit ledger (final)

  • 37febd1f slice 1 — KEEP (transitional; the walk owns outside views; fixed real punch-fan index aliasing).
  • c40aecfc slice 2 — KEEP the rule (seal the walk's flood); REWORK: use the walk cell's installed views for the clip, not legacy per-cell slices/no-clip fallback (plan step 4).
  • 5f7ccdea slice 3 — KEEP mechanically for now; REWORK: VisitedCells is a union of root flood + look-ins — retail stages those differently (plan step 2 splits the sets and re-sources the predicate).
  • f3a03efc slice 4 — REVERTED (7f500b97).
  • 0d6cd5c0 slice 5 — REVERTED (7f500b97).
  • bb9212c7 slice 6 — KEEP the one-turn/no-hard-clip principle; FIX: the interior terrain currently uses the full camera frustum — restore retail's in_view landcell culling under the active exit views (draw_check_blocks @0x00505f80) (plan step 8).

The plan (instrument-first; each step gated)

PHASE I — instrumentation (NO rendering edits):

  1. Falls-owner trace: watch owners 0xCF41800013 live — route (outdoor-static vs other), walk turn, submission phase, drain point, projected bounds/depth. Never infer identity from aggregate sets again.
  2. Depth checkpoints: read back depth at one known-bad pixel after terrain / around punches / before the pre-clear drain / after clear / after seals / before the final drain. Distinguishes missing terrain depth vs punch overwrite vs clear/seal mis-gating vs particle depth state.
  3. Pose conformance: drive OUR walk at posed/terrace-center's exact camera. Retail truth: DI f4180104, root flood n=1, ov=1, and separate look-ins. Compare our root flood size, exit-view survival, and the VisitedCells composition (root vs look-in members). If we produce ov=0 or a multi-cell ROOT flood there, fix WalkPView projection/side/clip math FIRST — the F6779 foundry residue is the same family, and the coincident y=48 double-exit plane is the prime suspect surface.

PHASE II — decomp-pinned repairs (one at a time, each with a falsifiable prediction and a connected check): 4. Split the stage sets: InteriorFloodCells (root flood, post-clear) / look-in cells (pre-clear, landscape scope) / VisitedLandscapeCellIds — delete every union-based stage decision (incl. slice 3's predicate source and the cell-owners particle union). 5. Gate clear+seals as retail does (the ov>0 block; note the seal-latch nuance for the clear). 6. Seals from the walk cell's installed views (drop the legacy clip borrow + unclipped fallback). 7. Retail particle staging: emitters draw at their owner cell's actual walk turn; adopt the frame-stamp boundary (mid-frame re-arm) so straddling parts draw in both scopes; delete SphereStraddlesExitPlane. 8. Alpha parity: DrawBuilding barrier = FULL flush; the queue preserves insertion order (remove the global distance sort); keep the 0.75 per-cell valve semantics. 9. Terrain: whole + unclipped (slice 6) but culled by the walk's in_view landcell set (draw_check_blocks port). 10. Re-land the runtime-hidden degrade admission for outdoor objects (the stalks = drawn never-drawn marker anchors; fce250ec is NOT an ancestor of this branch). If a stalk survives, log its live GUID→Setup→GfxObj chain.

PHASE III — FW4 completion: delete the legacy PortalVisibilityBuilder production role, legacy clip frames/viewcone feeds, packed dynamic routes; the walk becomes the sole frame-decision owner; architecture doc updated (it currently overstates single ownership).

Open questions carried

  • Depth at the leaking pixel pre-drain (Phase I.2 answers).
  • The 0xC falls owners' actual live route (Phase I.1 answers).
  • Why full-size authored portals yield thin/zero views at some poses (Phase I.3 localizes; the fix lands in WalkPView).
  • Our world-pass color-load behavior (stale color vs black on ov==0).
  • Seal/punch clip equivalence vs retail setup_view+polyClipFinish.
  • The ~1.5 MB/frame walk alloc tail (FW6).