acdream/docs/research/2026-08-30-cathedral-review-fable.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

436 lines
26 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 review — FABLE (2026-08-30)
Independent report-only review of the cathedral-terrace defect (falls
particles + marker stalks over terrain; landblock `0xF418`, camera in
`0xF4180104`/`0xF4180106`), baseline `37febd1f`, HEAD `bb9212c7`, branch
`claude/campaign-w-retail-frame-walk`.
**Evidence basis and honesty note.** Everything below marked with a citation
was read directly by this reviewer (oracle trace files, decomp pseudocode
docs + their byte-verification notes, commit messages/diffs, git topology,
ISSUES/register/memory docs, id-allocator source). Three deeper evidence
threads (fresh decomp re-reads of the alpha/particle path, a raw DAT parse
of `0xF418`, and the HEAD code-flow + probe-log audit) were dispatched but
had not returned when this report was due; every claim that depended on
them is explicitly marked **unverified**. Per the prompt's rule, unverified
is stated as unverified — nothing below is a plausible guess dressed as
fact.
---
## 1. Executive verdict (≤10 lines)
The six fixes failed because they accepted a false premise about WHERE this
scene's content sits in retail's frame. The posed oracle traces show that at
both defect poses retail's interior flood is EXACTLY ONE cell (`DC ov=1 n=1:
f4180104` / `f4180106`) — every other cathedral cell, including the falls'
stab-owner cells, draws as a *building look-in inside the landscape scope*,
pre-depth-clear, its alpha drained against full landscape depth
(`posed/terrace-center.log` F5, `posed/cathedral-arrival.log` F1-2;
`PView::DrawCells` @0x005a4840 model §5). Our pipeline instead treats the
whole complex as interior-flood content drawing post-clear, then tried to
rescue it with seals (slice 2) and a non-retail exit-plane-straddle
classifier (slices 4/5) that under-covers exactly the fully-outside falls
emitters. Fix = route every object's particles to its owner cell's actual
walk turn (look-in ⇒ landscape scope ⇒ pre-clear drain), delete the straddle
classifier, and re-land the quarantined marker-degrade port for the stalks.
---
## 2. Retail frame reconstruction (for an interior root with exit portals)
### 2.1 The frame skeleton — verified from the FW0 model + live traces
Source of truth used: `docs/research/2026-08-30-fw-walk-pseudocode.md`
(§1, §2, §3, §5, §9 — its seal loop, deferred z-clear, DEPTHTEST_ALWAYS,
punch-Z constants are recorded there as byte-verified against the raw
pseudo-C at `@0059a49af`, `@005a48a9`, `@0059be02`, `@0059bf4b`), the
extraction appendix `2026-08-30-fw-walk-pseudocode-appendix.md` (notably
the DrawBuilding/DrawMeshInternal full-sequence note at appendix line 811),
and the live cdb traces in `docs/research/2026-08-30-fw-walk-oracle/posed/`.
Order of one interior-rooted frame (`SmartBox::RenderNormalMode`
@0x00453aa0`PView::DrawInside` @0x005a5860`ConstructView`
`PView::DrawCells` @0x005a4840):
1. **Flood** (`ConstructView(CEnvCell)` @0x005a57b0): view-driven — a
neighbor cell enters `cell_draw_list` only if its portal polygon
survives `PView::GetClip` @0x005a4320 against the current view (the ONLY
CPU polygon clip in the frame). Exit portals
(`other_cell_id == 0xFFFFFFFF`) raise `outside_view`.
2. **If `outside_view.view_count > 0`** (the traces' `ov`):
a. `Render::PortalList = &outside_view`; **`LScape::draw`** @0x00506330
— the whole landscape walk THROUGH the exit views: sky, terrain
blocks far-to-near (view-CULLED per cell/block by
`draw_check_blocks`' in_view union — **never view-clipped, never
scissored**; `set_view` installs NO GPU state), buildings far-to-near,
and — per building — the **look-in machinery**:
`DrawBuilding` @0x0059f2a0 → BSP portal pass 1 punches apertures
(`DrawPortalPolyInternal` flag=1: far-Z 0.999998987, DEPTHTEST_ALWAYS,
z-write ON, alpha 0) → pass 2 recurses `ConstructView(CEnvCell)` +
`DrawCells` (**`ov=0` — no landscape, no clear, no seals**) drawing
look-in EnvCells + their objects into the punched aperture
(appendix line 811). `DrawBuilding` itself calls
**`FlushAlphaList(0f)`** before each building; `DrawBlock`
@0x005a17c0 has the mid-walk pressure valve
`FlushAlphaList(flush=0.75)` (appendix lines 700, 1027).
b. **`FlushAlphaList(0f)`** — the pre-clear boundary drain: EVERYTHING
queued during the landscape scope (terrain alpha, building alpha,
look-in cell content alpha — and the particle polys of objects drawn
in that scope) drains against **full landscape depth**. This is the
drain that occludes the falls with terrain/water/trees.
c. **Gated depth clear** (`if (forceClear || portalsDrawnCount != 0)
Clear(z)`, model §5; `portalsDrawnCount` counts ONLY flag-0 seals —
appendix line 811). Color is preserved; only depth clears.
d. **Exit seals**: for the FLOODED cells' exit portals only,
`DrawPortalPolyInternal(poly, 0)` — the portal's own projected depth,
DEPTHTEST_ALWAYS, z-write ON, invisible (model §2, §5; byte-verified
per model §9).
3. **Interior passes** (post-clear): `DrawEnvCell` far-to-near (BSP shells),
then `DrawObjCellForDummies` (the flooded cells' objects) — depth
accumulates fresh.
4. **Final drain**: `FlushAlphaList(0f)` back in `RenderNormalMode` — the
flooded cells' alpha/particles drain against interior depth + the seals.
### 2.2 The four prompt questions
**(a) clipped vs culled vs whole.** CPU-clipped: ONLY the portal chain's own
polygon (`GetClip` @0x005a4320 — the model calls it "the only CPU polygon
clip in the frame"). View-culled (coarse sphere-vs-cone,
`Render::viewconeCheck` @0x0054c250, PARTIAL draws whole): objects.
Cell/block-granular culled (in_view interval grids): terrain blocks/cells.
Drawn whole with no per-view test: everything that passes those gates —
shells, meshes, particles. No GPU clip planes/scissor exist anywhere in this
frame (`set_view` = CPU globals only, model §6).
**(b) order relative to clear and seals.** PRE-clear: sky, terrain, water
(terrain-hosted — see §3, unverified detail), building shells, building
punches, **look-in EnvCell shells + look-in cell objects + their
emitters**, and all their alpha via the boundary drain. POST-clear: seals
first, then ONLY the root flood's EnvCell shells + objects + their
emitters, drained at the final flush. Seals draw exactly the flooded
cells' exit-portal polygons at own depth, color-write effectively off
(alpha 0), depth ALWAYS + write ON.
**(c) alpha list.** ONE list. Flush sites established from the docs:
per-building `FlushAlphaList(0f)` in `DrawBuilding` (appendix 811); the
`DrawBlock` pressure valve at `flush=0.75` (~2250 meshes, appendix 1032);
the `DrawCells` pre-clear boundary `FlushAlphaList(0f)` (model §5); the
`RenderNormalMode` end-of-frame `FlushAlphaList(0f)` (model §1). Depth in
place: landscape depth at the first three; interior + seal depth at the
final one. **Unverified:** an exhaustive caller enumeration of
`D3DPolyRender::FlushAlphaList` @0x0059d2e0 from the decomp itself, and
the exact particle-poly insertion path (the dispatched decomp read had not
returned; the MP2-era digest additionally records
`CPhysicsObj::ShouldDrawParticles` @0x0050FE60 = authored degrade range +
`cell->IsInView()`, from `claude-memory/project_render_pipeline_digest.md`).
**(d) depth at final-drain time.** Aperture pixels: the seal's own depth
(near the camera) — anything beyond the exits z-fails, so interior
particles cannot repaint the vista. Vista pixels visible through the
aperture ARE aperture pixels (the opening's polys); pixels covered by
interior geometry hold that geometry's depth. The falls are never in this
drain in retail at these poses — they drained pre-clear with the landscape.
**Unverified residual:** whether any visible vista pixel can lie OUTSIDE
the union of authored exit-portal polygons at the live chase camera (slice
6's observation implies yes for the WALK's clipped views; whether that
reflects portal-poly authoring or our clip is open — §8 Q1).
### 2.3 The live traces at the defect poses (decisive, read directly)
`posed/terrace-center.log` F5 (camera cell `f4180104` — the owner's
teleloc cell):
```
DI f4180104
DC pv=009d4e38 ov=1 n=1: f4180104 ← the interior flood is ONE cell
LS
BLD f518002e … BLD f4180014 BLD f418000a BLD f418000c BLD f418000b (14 buildings)
```
`posed/cathedral-arrival.log` F1-2 (camera cell `f4180106`):
```
DI f4180106
DC pv=009d4e38 ov=1 n=1: f4180106 ← flood = root cell only
LS
BLD f3180020 … BLD f418000c
DC pv=009d4398 ov=0 n=2: f4180101 f4180100 ← look-in punch during LS
… BLD f418000b
DC pv=009d4398 ov=0 n=1: f4180104 ← 0xF4180104 IS A LOOK-IN
BLD f418000a
```
`posed/terrace-edge.log` F5 (outdoor root, camera cell `f418000b`): look-in
punches `n=1: f4180106`, `n=1: f4180101`, `n=1: f4180104` interleaved with
the building walk — no clear, no seals, everything drains against full
depth (why the owner sees a correct scene outdoors).
**Conclusion:** at the defect poses, `0xF4180104` and `0xF4180106` are in
DIFFERENT buildings' interiors (`f418000b` vs the `f418000a/c` group —
consistent with the "seam" being a building boundary), retail's interior
flood never crosses it, and ALL non-root cathedral cells + their stabs
compose in the landscape scope, pre-clear. The "toggles with which side of
the seam the camera is on" symptom is the root flip between these two
one-cell floods (and outdoor).
---
## 3. DAT geometry findings
**Verified:**
- The falls' observed particle owners `0x4F418012``0x4F418015` decode per
`src/AcDream.Core/World/InteriorEntityIdAllocator.cs:48`
(`0x40000000 | X<<20 | Y<<12 | counter`) to **interior EnvCell-stab
statics of landblock F418**, counters 0x120x15 — NOT landblock objects
(0xC0000000+ namespace) and NOT scenery (0x80000000+). The slice-5 commit
message (`0d6cd5c0`) reached the same identification ("EnvCell STAB-LIST
statics … ids minted by InteriorEntityIdAllocator").
- Retail cell topology at the poses (from the traces, §2.3): `0xF4180104`
belongs to building `f418000b`'s look-in set; `0xF4180100/0101` to
`f418000c`'s; `0xF4180106` is punched separately (arrival trace);
interior floods do not cross between them at the captured camera states.
- The prior campaign's offline sightline probe (recorded in
`claude-memory/project_pview_visibility_campaign.md` and the PV plan)
established: the exit portal of the terrace cell and the building's
never-drawn panel are the SAME surface, and the "#456 seam band" IS the
terrace cell's portal[4] polygon — i.e. at least one exit aperture is a
thin band, corroborating slice 6's live finding that scissoring terrain
to the walk's exit views starves most of the vista of depth/color.
**Unverified (the DAT parse thread had not returned):** the per-cell portal
tables (flags/0x4 exits/other_cell ids) for `0x0104/0x0105/0x0106/0x010D/
0x010F`; WHICH EnvCell's stab list carries counters 0x120x15 (the counter
is allocated in ascending cell order in `LandblockBuildFactory`
`src/AcDream.App/Streaming/LandblockBuildFactory.cs:494-503`, so the DAT
stab tables resolve it mechanically); the exit-portal polygon vertex
extents vs the visible opening; whether the lake water is terrain-hosted;
the cathedral shell GfxObj roster (`0x01001FB2/B0/B3` — asserted by the
owner's prior analysis and consistent with the PV panel model
(`0x01001FB0/B2/B3/B7` panels, PV plan §"established model" item 3), but
not independently re-read here).
---
## 4. Divergence table (ranked by causal weight for THIS defect)
| # | Divergence | Ours | Retail | Evidence |
|---|---|---|---|---|
| D1 | **Particle emission site for cell statics/dynamics** | flood-membership + `SphereStraddlesExitPlane` classifier decides pre- vs post-clear emission (slices 4/5) | the owner object's actual walk turn decides: drawn during LS (shadow-cell overlap or look-in) ⇒ landscape scope ⇒ pre-clear drain; drawn in the root flood ⇒ final drain | traces §2.3; model §5; appendix 811; commit msgs `f3a03efc`/`0d6cd5c0` |
| D2 | **Interior "flood" membership for the cell-owners route** | the production cell set treats the connected cathedral complex as interior content (slice-2/3 messages: "the cell-owners route", "the OLD apparatus flood"); walk conformance proves the WALK floods n=1, but consumers were still being cut over one at a time | flood = what survives GetClip from the root; at these poses exactly ONE cell; everything else is landscape-scope | traces §2.3; commit msgs `c40aecfc`/`5f7ccdea`; plan FW3.2b-2 "prepareCells UNIONED" |
| D3 | **Dynamics-last** (register row AD-19, `docs/architecture/retail-divergence-register.md:147`): ALL dynamics in one z-buffered final pass | per-landcell painter-ordered draws inside the landscape pass; interior per cell turn | register row (self-declared); `DrawBlock` 0x005a17c0 / DrawSortCell pc:430124 |
| D4 | **No degrade/LOD admission on this branch** — the marker stalks (Setup `0x0200085A` → GfxObj `0x010001EC`, ladder `0x1100002E` = {self at MaxDist 0, id 0 to ∞}) are DRAWN | retail selects `gfxobj[deg_level]` via `get_degrade` @0x0051E4B0 and **never draws** this model at any distance (gates in `DrawBuilding` @0x0059F2A0 and `CPhysicsPart::Draw` @0x0050D7A0) | `fce250ec` exists ONLY on `claude/cathedral-rendering-debug-47a417` (`git branch -a --contains`; `git merge-base --is-ancestor fce250ec HEAD` = false; `git grep IsNeverDrawnByDegrade -- src` = empty at HEAD) |
| D5 | **Seal/vista coverage geometry**: post-clear alpha can z-pass wherever the visible vista is not covered by a stamped seal; slice 6 proved the walk's exit views at this seam are "thin BANDS far narrower than the real opening" | retail is not exposed to this because the leaking content class isn't post-clear in the first place (D1/D2) | commit msg `bb9212c7`; PV sightline probe (campaign memory) |
| D6 | (regression candidate) straddle-classified emitters now emit pre-clear on interior roots — an interior emitter drained at the landscape flush is subsequently over-painted by the post-clear interior repaint | retail: root-cell emitters drain at the final flush, after interior geometry | mechanism prediction from `f3a03efc`/`0d6cd5c0` + model §5; matches the owner's new "particles WITHIN the cathedral are wrong" report — **unverified until probed** |
The pre-existing #451 fix (owner-accepted 2026-08-27, `docs/ISSUES.md:249-289`)
had already implemented the D1-correct contract for exterior particles
("submits attached and ownerless exterior particles inside `LScape::draw`
for every PView root"). The FW2/FW3 window (`git diff --stat
e102fb36..37febd1f -- src/AcDream.App/Rendering` = ~7,081 insertions:
the whole `Walk/` tree, `WalkFrameDriver`, the static cutover) is the
regression window that displaced it.
---
## 5. Per-commit verdicts
**`37febd1f` (slice 1 — interior outside-view slices from the walk): KEEP.**
Correct single-source-of-truth move (retail has ONE visibility structure);
fixed a real dual-path desync (the #119-family grass flash) with a real
mechanism (old-apparatus fat/degenerate exit views + walk-indexed punch
fans). Not causal for the cathedral defect either way. Its per-view terrain
slice FAN was still non-retail — superseded by slice 6, which it should be
read together with.
**`c40aecfc` (slice 2 — exit seals stamp the walk's flood): KEEP the code,
REJECT the diagnosis (wrong-mechanism).** Stamping the walk's own flood's
exit portals is exactly retail (model §5 seal loop, pc:432785-6, and the
walk flood is conformance-proven against the traces). But the commit's
premise — falls emitters submitting POST-clear is "retail's own timing" —
is refuted by the traces: retail composes those cells pre-clear as
look-ins. Seals could never fix an over-draw whose correct rendering is
"drawn pre-clear with landscape depth"; at best they would z-reject the
falls and make them wrongly INVISIBLE through the aperture. The plan's
slice-2 paragraph (`docs/plans/2026-08-30-campaign-fw-frame-walk.md`
FW4 slice 2) carries the same false premise and should be corrected.
**`5f7ccdea` (slice 3 — outside-stage predicate reads the walk flood):
KEEP.** Feeding predicates from the walk's VisitedCells (root flood +
look-in floods — "all of whose objects retail draws inside LScape::draw,
pre-clear") is the correct retail-shaped direction and removed one more
old-apparatus consumer. Insufficient alone: it gates the DYNAMIC split,
and the falls turned out to be cell statics (slice 5's own finding).
**`f3a03efc` (slice 4 — straddler dynamics' particles pre-clear, once):
WRONG-MECHANISM — revert once D1 lands.** Retail has no exit-plane-straddle
classifier for emission timing; the cited rule ("retail submits an
emitter's polys at its object's FIRST draw — the landscape stage for
anything overlapping outdoor shadow cells") is right, but the
implementation substitutes a plane-straddle test for draw-site membership.
It under-covers emitters wholly OUTSIDE the exit plane (they never
"straddle" ⇒ stay post-clear ⇒ still leak) and over-covers interior
straddlers into the pre-clear drain where the interior repaint erases them
(divergence D6 — the likely source of the new in-cathedral particle
wrongness). Drawn-once bookkeeping (each owner emits exactly once) is worth
preserving in whatever replaces it.
**`0d6cd5c0` (slice 5 — straddling cell-statics' particles pre-clear):
WRONG-MECHANISM — revert once D1 lands.** Its identification work is the
best of the six (falls = EnvCell stab statics; the shadow-cell rule
correctly cited at `DrawBlock` pc:430056-430064), but it ports the rule as
the same geometric straddle test instead of the actual membership question
("is this object drawn during the landscape scope this frame?" — for the
falls cells at these poses: yes, as building look-ins, regardless of any
plane test). Same under/over-coverage failure modes as slice 4.
**`bb9212c7` (slice 6 — interior roots draw landscape unclipped): KEEP.**
Matches retail exactly: landscape content is view-CULLED, never
view-CLIPPED (model §3: the views feed only `draw_check_blocks`' in_view
union; `set_view` installs no GPU state; no scissor exists). Its probe
finding — falls submitted pre-clear with depth LESS still passed because
the scissored terrain had left the vista without depth — is the
load-bearing discovery of the round and independently confirms the thin-band
aperture geometry. It cannot, by itself, fix emitters that still submit
post-clear on other frames/poses, and it does not address D6.
---
## 6. Why the symptom survived all six fixes
1. **A wrong premise was locked in at slice 2 and never re-examined against
the traces the campaign itself captured.** "The falls submit post-clear —
retail's own timing" is contradicted by `posed/terrace-center.log` /
`posed/cathedral-arrival.log`: retail's interior flood at these poses is
ONE cell and the falls' owner cells are landscape-scope look-ins. Every
subsequent fix (seals, predicates, straddle emission) tried to make a
post-clear world safe instead of putting the content in the pre-clear
world where retail has it.
2. **The corrective classifier is not retail's rule.** The straddle test
(slices 4/5) approximates "overlaps outdoor shadow cells" with "sphere
crosses the exit plane" — a strictly narrower predicate that misses
fully-outside emitters (the falls hang OVER the lake) and wrongly
captures interior straddlers.
3. **Mixed visibility sources during the staged cutover.** Slices 2 and 3
each discovered another consumer still reading the OLD apparatus's flood
(seal set, outside-stage predicate). The FW3.2b-2 design explicitly runs
old visibility for dynamics beside the walk for statics
(`docs/plans/2026-08-30-campaign-fw-frame-walk.md`); every such seam is
a place where the walk's correct n=1 flood is not what production
consumes. AD-19 (dynamics-last) keeps the weenie stalks post-clear
regardless.
4. **Two of the leaking content classes cannot be fixed by ANY
ordering/seal work:** the marker stalks should never be drawn at all
(D4 — the degrade admission port is quarantined off-branch), and
pre-slice-6 the vista had no depth to occlude against (D5) — so even
correct pre-clear emission "passed" its z-test into stale color.
5. **Each fix was validated against the previous fix's failure, not against
a falsifiable retail prediction.** The probes pinned real facts
(phase=pre/post, straddler classification) but the acceptance question
was "did the leak stop" rather than "does the frame now match §2.1's
shape at this pose" — so five plausible partial mechanisms shipped in
one day without any landing the frame-shape divergence (D1/D2).
---
## 7. Recommended fix plan (mechanism-first)
**Step 0 — probes before code (falsifiable predictions):**
- **P1:** With `ACDREAM_PROBE_WALK_ROOT` at the terrace pose on HEAD, the
falls owners `0x4F418012-15` will log submission OUTSIDE the landscape
scope (post-clear route or final drain) on defect frames, while the
walk's own event stream visits their owner cells at BUILDING LOOK-IN
turns (not in the interior flood, which stays n=1). If instead they
already log landscape-scope submission + pre-clear drain on defect
frames, D1 is falsified — investigate the drain's depth state
(attachment, compare op) instead.
- **P2:** The DAT stab tables will place stabs #0x12-0x15 in cell(s) OTHER
than the frame's root cell at the defect poses (look-in-reached cells).
If they are stabs of the root cell itself, the look-in theory is
falsified.
- **P3:** Forcing the falls emitters to submit at their owner cell's
look-in turn (landscape scope, drained at the pre-clear boundary flush)
removes the over-draw at EVERY camera on interior roots, while the falls
stay visible through the opening and terrain-occluded exactly as on
outdoor roots.
- **P4:** Reverting slices 4/5's straddle emission (in favor of the
walk-turn rule) makes the new "particles within the cathedral are wrong"
report disappear (root-cell emitters return to the final drain).
- **P5 (optional, owner-assisted):** a cdb capture at the terrace with a
breakpoint on the particle-poly alpha-list insertion will show falls
polys entering the list BEFORE `DrawCells`' depth clear on
interior-rooted retail frames.
**Step 1 — the emission-site port (fixes the falls).** An object's
particles submit when and where the object itself draws in the walk:
look-in cell content and outdoor shadow-cell content submit during the
landscape turn and drain at the pre-clear boundary flush; root-flood cell
content submits at its cell turn and drains at the final flush. Retail
pins: appendix 811 (look-in `DrawCells` inside the landscape scope),
`DrawBlock` pc:430056-430064 (shadow-cell object draw), model §5 (the two
drain sites). Delete `SphereStraddlesExitPlane`-based emission (slices
4/5) in the same commit; keep the emit-once ledger.
**Step 2 — finish the flood-consumer cutover (fixes the class).** Every
remaining consumer of the old apparatus's cell set (cell-statics particle
owners, dynamics routes, prepare unions) reads the walk's per-turn visited
sets. AD-19's interior-root half retires when dynamics draw at their
cell's walk turn; if that is deferred, dynamics must at minimum gate on
the walk's visited set so a non-visited cell's weenies cannot draw at all.
**Step 3 — re-land the marker-degrade admission (fixes the stalks being
visible at all).** `fce250ec`'s mechanism (never-drawn degrade ladders:
`get_degrade` @0x0051E4B0; `gfxobj[deg_level] != 0` gates) is a retail
port stranded on the quarantined branch. Re-land it cleanly on this branch
(fresh commit, not a cross-merge from quarantine), covering static AND
dynamic classifiers. If stalk-like shapes remain afterwards, identify by
guid before theorizing (they'd be weenies with a different model —
campaign-memory rule).
**Step 4 — verification gates.** The ten oracle fixtures stay green (the
walk itself is already conformant); add a fixture-level assertion that the
DRIVER's submission stream places look-in-cell content in the landscape
scope (the current conformance compares walk events, not submission
scope — that gap is how D1 shipped); then the owner matrix: terrace both
cells, seam crossing, outdoor falls, interior candles, doorway flap,
Holtburg exit.
---
## 8. Open questions
- **Q1:** Why are the walk's exit views at this seam thin bands — is the
full visible opening authored as multiple portals (0/1/2/4) of which
only portal 4 survives GetClip at these camera states, or is our
clip/winding at fault, or does the chase camera sit outside the cell
volume? (Slice 6 measured the symptom; the cause is unestablished. The
PV probe's "panel solid covers every sightline" was measured at ≤6 m
camera rises only.)
- **Q2:** Which EnvCell(s) own falls stabs #0x12-0x15, and do the falls
additionally exist as dynamics (slice 3 probed entities "f4243/f4285"
as [walk-dyn] — the relationship between those ids and the stab owners
is unestablished). **DAT parse owed.**
- **Q3:** The exact HEAD drain/depth state of `ParticleRenderer` under
Vulkan (depth attachment, compare op, write mask) at each drain site —
required to close P1's alternative branch. **Code audit owed.**
- **Q4:** Whether `ShouldDrawParticles` (@0x0050FE60) is evaluated
per-frame or per-view in our port, and against which cell set at HEAD.
- **Q5:** The gated clear's `portalsDrawnCount` semantics across frames
(seals increment it AFTER the clear check — does the first interior
frame after an outdoor frame skip the clear in retail?), and whether our
`slices>0` production gate is equivalent.
- **Q6:** Whether the seal fans at HEAD still apply the old assembly's
per-cell slice clips ("where present", slice 2) and whether that can
shrink a seal below its authored polygon.
- **Q7:** The uncharacterized in-cathedral particle wrongness (owner
report #3) — D6 is a prediction, not a diagnosis; one probe frame with
`[walk-part]`/`[walk-alpha]` at a candle would settle it.
---
*Reviewer: Fable. All decomp addresses cite the named 2013 build
(`docs/research/named-retail/`); trace lines cite files under
`docs/research/2026-08-30-fw-walk-oracle/posed/`; commit claims cite the
SHAs in §5; everything not directly read is marked unverified above.*