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

155 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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).