docs(plans) Campaign FW: implementation plan, roadmap entry, spec approval
Stages FW0-FW6: walk oracle fixtures -> pure-CPU RetailFrameWalk/PViewSet -> order-preserving submitter -> static cutover with the perf stop-rule -> entity/particle/dynamics cutover deleting the patch apparatus -> retail camera envelope -> closeout. The plan carries the recon-verified seam map (frame chain, replace-vs-reuse split in the dispatcher, the complete visibility-consumer list, the streaming atomicity facts, exact patch-apparatus sites) and the binding rules (fail loud, transition checklist, no dual path). Campaign renamed W->FW: the roadmap already owns Phase W (UCG). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
b8e5162c13
commit
fabb966c57
3 changed files with 357 additions and 2 deletions
|
|
@ -518,6 +518,26 @@ Plus polish that doesn't get its own phase number:
|
||||||
|
|
||||||
## Phases ahead — agreed order
|
## Phases ahead — agreed order
|
||||||
|
|
||||||
|
### Campaign FW — the retail frame walk (ACTIVE 2026-08-30)
|
||||||
|
|
||||||
|
**Tagline:** retail owns every frame decision; modern code only moves bytes.
|
||||||
|
|
||||||
|
**Filed:** 2026-08-30 after Campaign PV's halt (the PView graft onto the
|
||||||
|
gather/regroup renderer failed; owner verdict). Replaces the ~4.7K-line
|
||||||
|
accumulated visibility/composition layer (`PortalVisibilityBuilder`,
|
||||||
|
`RetailPViewRenderer`/`PassExecutor`, `CellVisibility` BFS, `ClipPlaneSet`
|
||||||
|
gating) and the dispatcher's material regrouping with a verbatim port of
|
||||||
|
retail's frame walk (`SmartBox::RenderNormalMode` rooting,
|
||||||
|
`PView::DrawCells` recursion, `LScape::draw`, building look-ins, stage
|
||||||
|
interleave, depth semantics, camera incl. the retail zoom envelope). The
|
||||||
|
WB-derived asset/residency layer is untouched. Gated by a cdb walk oracle
|
||||||
|
(retail's captured per-frame draw sequence as replayable fixtures), a
|
||||||
|
standing transition checklist, and a dense-Arwic perf stop-rule at FW3.
|
||||||
|
Stages FW0–FW6; no long-lived dual path.
|
||||||
|
|
||||||
|
**Spec:** [`docs/superpowers/specs/2026-08-30-campaign-w-retail-frame-walk-design.md`](../superpowers/specs/2026-08-30-campaign-w-retail-frame-walk-design.md).
|
||||||
|
**Plan + ledger:** [`docs/plans/2026-08-30-campaign-fw-frame-walk.md`](2026-08-30-campaign-fw-frame-walk.md).
|
||||||
|
|
||||||
### Phase O — DatPath Unification — SHIPPED 2026-05-21
|
### Phase O — DatPath Unification — SHIPPED 2026-05-21
|
||||||
|
|
||||||
**Tagline:** ONE thing touches the DATs.
|
**Tagline:** ONE thing touches the DATs.
|
||||||
|
|
|
||||||
331
docs/plans/2026-08-30-campaign-fw-frame-walk.md
Normal file
331
docs/plans/2026-08-30-campaign-fw-frame-walk.md
Normal file
|
|
@ -0,0 +1,331 @@
|
||||||
|
# Campaign FW — the retail frame walk (implementation plan)
|
||||||
|
|
||||||
|
**Status:** ACTIVE (opened 2026-08-30; spec approved by owner 2026-08-30).
|
||||||
|
**Spec (approved):**
|
||||||
|
[`docs/superpowers/specs/2026-08-30-campaign-w-retail-frame-walk-design.md`](../superpowers/specs/2026-08-30-campaign-w-retail-frame-walk-design.md)
|
||||||
|
— note: the campaign letter is **FW** (frame walk); the spec predates the
|
||||||
|
rename (the roadmap already owns "Phase W" for the historical Unified Cell
|
||||||
|
Graph program).
|
||||||
|
**Branch:** `claude/campaign-w-retail-frame-walk` off main `e102fb36`.
|
||||||
|
**Predecessor:** Campaign PV, halted 2026-08-30
|
||||||
|
(`docs/plans/2026-08-30-pview-visibility-campaign.md`); its back half is
|
||||||
|
quarantined on `claude/cathedral-rendering-debug-47a417` and nothing merges
|
||||||
|
from it.
|
||||||
|
|
||||||
|
**One-sentence goal:** retail owns every frame decision (rooting, portal
|
||||||
|
views, cone gating, landscape walk, buildings, stage order, depth
|
||||||
|
semantics, degrade, particles, camera); modern code owns only pixel-neutral
|
||||||
|
GPU mechanics; the ~4.7K-line accumulated visibility layer and its patch
|
||||||
|
apparatus are deleted at their stages.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Binding rules (all stages, binding on subagents)
|
||||||
|
|
||||||
|
1. **The ownership line is the campaign invariant.** If a modern component
|
||||||
|
makes a decision retail did not make, that is a campaign bug regardless
|
||||||
|
of pixels. Every ported function cites its named retail symbol.
|
||||||
|
2. **Grep named first.** `docs/research/named-retail/acclient_2013_pseudo_c.txt`
|
||||||
|
by `class::method` before any fresh decompilation; pseudocode notes in
|
||||||
|
`docs/research/` before C# (the mandatory workflow).
|
||||||
|
3. **Fail loud, never silently drop.** The PV3 post-mortem rule: any
|
||||||
|
admission/seeding/ordering filter that rejects work must log the
|
||||||
|
rejection under a diagnostic flag or fall open — silent drops produced
|
||||||
|
this week's hollow-world regressions.
|
||||||
|
4. **The transition checklist is a standing self-run gate.** Every
|
||||||
|
candidate build gets, before the owner sees it: portal-in arrival
|
||||||
|
frames, a Holtburg house exit, a teleport-to-Holtburg stopwatch, and a
|
||||||
|
steady-state fps read (drive.ps1 + screenshots). No terrace-only
|
||||||
|
verification, ever again.
|
||||||
|
5. **No long-lived dual path.** Campaign V precedent: a stage that cuts
|
||||||
|
over deletes the code it replaces in the same stage. Short-lived
|
||||||
|
scaffolding inside one stage is fine; a toggle that survives a stage
|
||||||
|
boundary is not.
|
||||||
|
6. **Register discipline.** Deviations add their row in the same commit;
|
||||||
|
ported mechanisms delete rows in the same commit
|
||||||
|
(`docs/architecture/retail-divergence-register.md`).
|
||||||
|
7. **Suites green at every stage close** (hermetic filter
|
||||||
|
`Lane!=InstalledDat&Lane!=Linux&Lane!=Manual&Lane!=Timing&Lane!=Live&Lane!=PreparedPackage`),
|
||||||
|
plus the stage's own gates. Sonnet implements; Opus reviews stage
|
||||||
|
boundaries (architectural + retail-faithfulness lenses).
|
||||||
|
|
||||||
|
## Verified seam map (recon 2026-08-30; cite these, do not re-derive)
|
||||||
|
|
||||||
|
**Frame chain today:** `GameWindow.OnRender` (GameWindow.cs:1785/1809) →
|
||||||
|
`GameFrameGraphSlot.Render` → `RenderFrameOrchestrator.Render`
|
||||||
|
(RenderFrameOrchestrator.cs:206/226) → `VulkanWorldScenePhase`
|
||||||
|
(VulkanCompositionFramePhases.cs:113, owns the backbuffer pass) →
|
||||||
|
`WorldSceneRenderer.Render` (WorldSceneRenderer.cs:128) →
|
||||||
|
`RetailPViewRenderer.DrawInside` (RetailPViewRenderer.cs:112), which builds
|
||||||
|
`PortalVisibilityFrame` internally (line 122) and drives
|
||||||
|
`RetailPViewPassExecutor` through the packed route contract
|
||||||
|
(`RenderFrameCandidateRoute`: LandscapeOutdoorStatic → LandscapeBuildingShell
|
||||||
|
→ LookInObject → LandscapeOutsideDynamic → CellStatic → DynamicLast;
|
||||||
|
`WbDrawDispatcher.PackedOracle.cs:108/171` enforces in-order consumption).
|
||||||
|
|
||||||
|
**What the walk-order submitter REPLACES:** `GroupKey` material bucketing
|
||||||
|
(`ClassifyBatches` WbDrawDispatcher.cs:3292, `ClassifyPackedBatches`
|
||||||
|
PackedOracle.cs:610, `_groups`/`_packedGroups`), `PartitionInstanceGroups`
|
||||||
|
(:2232), and the two distance sorts (`CompareOpaqueSubmissionOrder` :2865,
|
||||||
|
`CompareTransparentSubmissionOrder` :2871). Note: the deferred-alpha path
|
||||||
|
(`DeferTransparentGroups` :2619 → `RetailAlphaQueue`) already reconstructs
|
||||||
|
draw-local order per instance — the transparent side is half-way to
|
||||||
|
walk-order today and is the SSBO-layout pattern to follow.
|
||||||
|
|
||||||
|
**What is REUSED unchanged:** `GlobalMeshBuffer` arena (GlobalMeshBuffer.cs:84),
|
||||||
|
`WbMeshAdapter`/`ObjectMeshManager` mesh prep + self-heal
|
||||||
|
(WbMeshAdapter.cs:328/435), `TextureCache` GpuTextureSlot resolution
|
||||||
|
(WbDrawDispatcher.cs:3421), the ring-section SSBO writers + shared
|
||||||
|
`WorldTransformFrameArena` (Rhi.cs:913/945), `MeshPipelineSet` (Rhi.cs:49),
|
||||||
|
and the terminal MDI recorder `DrawIndirectRangeRhi` (Rhi.cs:798).
|
||||||
|
|
||||||
|
**Caveats that shaped the stages:** three parallel classifiers exist
|
||||||
|
(classic, packed, directional-shadow — WbDrawDispatcher.DirectionalShadows.cs:1021)
|
||||||
|
and must agree until each is cut over; `EntityClassificationCache` and
|
||||||
|
`PackedProjectionClassificationCache` assume group-bucketed submission and
|
||||||
|
retire with their routes; `StageImmediateGroup` lays per-instance SSBOs by
|
||||||
|
group-order cursor, so the walk submitter re-derives layout from stream
|
||||||
|
order (start per-instance like deferred alpha; merge adjacent runs after
|
||||||
|
correctness).
|
||||||
|
|
||||||
|
**Visibility consumers to re-point at the walk output** (the complete
|
||||||
|
production list — radar, audio, and picking do NOT consume visibility):
|
||||||
|
- Particles: `WorldSceneRenderer.cs:263` → `ParticleVisibilityController`
|
||||||
|
→ `ParticleSystem.ApplyRetailView` (Core/Vfx/ParticleSystem.cs:313), fed
|
||||||
|
outdoors by `TerrainModernRenderer.VisibleCellIds`.
|
||||||
|
- Lights: `WorldSceneRenderer.cs:264` → `RuntimeWorldFrameEnvironmentPreparation`
|
||||||
|
(WorldRenderFrameBuilder.cs:543) → `LightManager.BuildPointLightSnapshot`
|
||||||
|
(Core/Lighting/LightManager.cs:284).
|
||||||
|
- EnvCell prepare filter: `RetailPViewPassExecutor.cs:276` →
|
||||||
|
`EnvCellRenderer.PrepareRenderBatches` (EnvCellRenderer.cs:456).
|
||||||
|
- Entity routes: `RenderScenePViewFrameProduct.cs:1330-1587`.
|
||||||
|
- Gated diagnostics only beyond that.
|
||||||
|
|
||||||
|
**Streaming atomicity (what already holds vs what FW adds):** per-cell
|
||||||
|
publication is ALREADY atomic — one dictionary swap of a complete
|
||||||
|
immutable `EnvCellLandblock` (EnvCellRenderer.CommitPublication:347);
|
||||||
|
outdoor terrain commits at LandblockRenderPublisher.AdvanceBeginOne:267.
|
||||||
|
The real partial states are (a) landblock-stage terrain-before-interiors
|
||||||
|
across yielded publication stages (LandblockPresentationPipeline.cs:711/757
|
||||||
|
— deliberate walking pop-in, hidden by the reveal hold during
|
||||||
|
portal/login), and (b) committed cells drawing before every contained
|
||||||
|
static mesh is resident (skip-if-missing, EnvCellRenderer.cs:720). FW keeps
|
||||||
|
both as EXPLICIT, register-rowed adaptations; the walk consumes only the
|
||||||
|
committed registry (`CellVisibility.TryGetCell` — production role is the
|
||||||
|
registry; its BFS is already dead code).
|
||||||
|
|
||||||
|
**The patch apparatus to delete (exact sites):**
|
||||||
|
- `ShellDrawLiftZ` +0.02 lift, three consumers: PortalVisibilityBuilder.cs:353
|
||||||
|
(const + Build's drawLiftZ), RetailPViewPassExecutor.cs:697 (depth fans),
|
||||||
|
LandblockBuildFactory.cs:523 (baked into draw cellTransform).
|
||||||
|
- Punch stencils (#117 adaptation): PortalDepthMaskRenderer.Rhi.cs:59-125.
|
||||||
|
- Look-in seeding heuristics: PortalVisibilityBuilder.BuildFromExterior:713-923
|
||||||
|
+ callers MergeNearbyBuildingFloods (RetailPViewRenderer.cs:411),
|
||||||
|
BuildInteriorRootLookIns (:471), DrawBuildingLookIns (:600-860), and the
|
||||||
|
barrier math (:515-559).
|
||||||
|
- The InViewCells side-channel (RetailPViewRenderer.cs:2187) once consumers
|
||||||
|
read the walk output.
|
||||||
|
|
||||||
|
**Camera facts:** `RetailChaseCamera.cs` — `Distance` default 2.61 m,
|
||||||
|
clamps DistanceMin=2/DistanceMax=40 (:110-113); collision probe + slope
|
||||||
|
align + chase already default-on retail behaviors
|
||||||
|
(Core/Rendering/CameraDiagnostics.cs:28-50). Retail envelope (from the
|
||||||
|
d71f5ef1 diff, which lives ONLY on the quarantined branch — this branch has
|
||||||
|
no AD-116 row): `CameraSet::Farther` @0x00458890 scales the viewer offset
|
||||||
|
multiplicatively and REFUSES the write once |offset.y| ≥ 10 (gates |x|<10,
|
||||||
|
|y|<10, z<450, z>-1.8); the standard arc saturates near offset
|
||||||
|
(0, −10, +8.33) ≈ a 13.0 m boom. `CameraSet::Raise` @0x00457980 rotates at
|
||||||
|
preserved length. TS-56 records the non-retail adjustment scalars
|
||||||
|
(CameraAdjustmentSpeed=40/s etc.).
|
||||||
|
|
||||||
|
**Retail anchors already established:** `SmartBox::RenderNormalMode`
|
||||||
|
@0x00453aa0 (frame rooting), `PView::DrawCells` @0x005A4840,
|
||||||
|
`LScape::draw` @0x00506330, `LScape::grab_visible_cells` @0x00504EC0,
|
||||||
|
`DrawBuilding` pre-punch flush @0x0059F2A0, `ShouldDrawParticles`
|
||||||
|
@0x0050FE60, the untextured skip in `D3DPolyRender::DrawMesh` @0x0059d4a0,
|
||||||
|
`ACRender::polyClipFinish` (two call sites: `PView::GetClip` + debug),
|
||||||
|
`Render::viewconeCheck`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stages
|
||||||
|
|
||||||
|
### FW0 — the walk oracle (tooling + fixtures)
|
||||||
|
|
||||||
|
**Goal:** retail's actual per-frame draw walk, captured and replayable,
|
||||||
|
BEFORE any port is judged.
|
||||||
|
|
||||||
|
- Build the cdb capture harness (`tools/walk-oracle/`): breakpoint script
|
||||||
|
logging, per frame, the sequence of cell/building draw entries with
|
||||||
|
stage boundaries — hook `PView::DrawCells`, `CEnvCell` draw,
|
||||||
|
`CLandBlock`/`LScape::draw`, `DrawBuilding`; dump cell ids (`this`
|
||||||
|
offsets verified with one-shot `dt` first). cdb safety rules from the PV
|
||||||
|
campaign are binding: never inline `-c` attach to a client that matters,
|
||||||
|
every `j` branch ends in `gc`, `qd` threshold auto-detach, watch hit-rate
|
||||||
|
lag.
|
||||||
|
- Capture positions (owner assists — retail sessions): Sanctuary terrace
|
||||||
|
center + terrace EDGE (normal camera — the #456 acceptance pose),
|
||||||
|
cathedral portal-in arrival, a Holtburg doorway (the flap scene), a
|
||||||
|
Holtburg street + house exit, one deep dungeon corridor. Record camera
|
||||||
|
pose per capture.
|
||||||
|
- Also capture the same positions in acdream (world state: cell registry
|
||||||
|
contents) so W1 replays are apples-to-apples.
|
||||||
|
- Pin the port function list as a research note with pseudocode stubs:
|
||||||
|
`docs/research/2026-08-30-fw-walk-pseudocode.md` (grow it through FW1).
|
||||||
|
- **Deliverable/gate:** trace fixtures checked into
|
||||||
|
`docs/research/2026-08-30-fw-walk-oracle/`, replayable by a test
|
||||||
|
helper; harness scripts committed; no production code touched.
|
||||||
|
|
||||||
|
### FW1 — `RetailFrameWalk` + `PViewSet` (pure CPU, conformant)
|
||||||
|
|
||||||
|
**Goal:** the ported walk as a standalone module that reproduces the
|
||||||
|
oracle traces exactly.
|
||||||
|
|
||||||
|
- New `src/AcDream.App/Rendering/Walk/`: `RetailFrameWalk` (rooting per
|
||||||
|
`SmartBox::RenderNormalMode`; EnvCell recursion per `PView::DrawCells`;
|
||||||
|
landscape walk per `LScape::draw`/`grab_visible_cells`; building
|
||||||
|
look-ins per `DrawBuilding` + `ConstructView(CBldPortal)`),
|
||||||
|
`PViewSet` (`ConstructView`/`set_view`/`PView::GetClip` — the chain
|
||||||
|
polygon is the only CPU-clipped geometry; one view per chain, never
|
||||||
|
merged), `IWalkWorldView` (the read seam: committed cells via the
|
||||||
|
registry, buildings via `BuildingRegistry`, camera pose).
|
||||||
|
- Output: an ordered walk event stream (cell id, view, stage) matching the
|
||||||
|
oracle trace format, plus the frame's visible-cell set.
|
||||||
|
- Pseudocode first (workflow step 3), C# port line-by-line (step 4), named
|
||||||
|
symbols in comments.
|
||||||
|
- **Gates:** oracle-trace replay tests pass position-for-position;
|
||||||
|
synthetic-world unit tests for rooting/recursion/cone edge cases; the
|
||||||
|
existing replay fixture suite (Issue95/113/120/124/127/130/131/176-177/
|
||||||
|
181, SanctuaryPortalSeam, HouseExitWalkReplay, TowerAscentReplay,
|
||||||
|
CornerFloodReplay) re-expressed against the walk — behavior differences
|
||||||
|
vs the old builder are adjudicated against the ORACLE, not against the
|
||||||
|
old builder. No production wiring; hermetic suites green.
|
||||||
|
|
||||||
|
### FW2 — `OrderedDrawStream` + `OrderPreservingSubmitter`
|
||||||
|
|
||||||
|
**Goal:** walk-order submission through the existing RHI, proven
|
||||||
|
pixel-equivalent on static content.
|
||||||
|
|
||||||
|
- `OrderedDrawStream`: append-only (mesh ref, transform, material state,
|
||||||
|
stage, cell) commands in walk order. `OrderPreservingSubmitter`: binds
|
||||||
|
`GlobalMeshBuffer` once, reuses ring-section writers + `MeshPipelineSet`
|
||||||
|
+ `DrawIndirectRangeRhi`; emits per-instance first (the deferred-alpha
|
||||||
|
SSBO pattern), then merges ADJACENT same-state commands into MDI runs —
|
||||||
|
a merge across a state or stage boundary is forbidden by construction
|
||||||
|
(assert it).
|
||||||
|
- Depth semantics: port retail's depth compare/write configuration for the
|
||||||
|
world passes verbatim in this stage (current set uses Less — verify
|
||||||
|
against retail's raster state and document the finding either way).
|
||||||
|
- Diagnostic harness: a dev scene (offscreen target) drawn twice — old
|
||||||
|
path vs walk path — framebuffer-compared (the Slice-7 comparison
|
||||||
|
pattern, with the pixel-diff repeat floor from
|
||||||
|
`feedback_pixel_diff_needs_repeat_floor`).
|
||||||
|
- **Gates:** submitter unit tests (order preservation, merge legality);
|
||||||
|
framebuffer equivalence on static-content scenes; hermetic suites green.
|
||||||
|
|
||||||
|
### FW3 — static world cutover + THE perf checkpoint
|
||||||
|
|
||||||
|
**Goal:** terrain, EnvCell shells, and buildings draw via the walk in
|
||||||
|
production; the statics gather path is deleted; perf is measured before
|
||||||
|
deeper commitment.
|
||||||
|
|
||||||
|
- Root the production frame at the walk: `WorldSceneRenderer` drives
|
||||||
|
`RetailFrameWalk` + submitter for the static routes
|
||||||
|
(LandscapeOutdoorStatic, LandscapeBuildingShell, CellStatic); dynamic
|
||||||
|
routes (LookInObject, LandscapeOutsideDynamic, DynamicLast) stay on the
|
||||||
|
packed path within this stage only (the route-contract split makes the
|
||||||
|
seam clean).
|
||||||
|
- Retire the three `ShellDrawLiftZ` sites in this stage — walk order +
|
||||||
|
retail depth semantics replace the tie-break; prove it at the #130
|
||||||
|
doorway-strip scene before deleting, and delete the register row in the
|
||||||
|
same commit.
|
||||||
|
- Terrain/sky/weather draw at their walk turns (the stage interleave from
|
||||||
|
`RetailPViewPassExecutor`'s ported knowledge moves inward).
|
||||||
|
- **Perf checkpoint (the spec's stop rule):** dense Arwic uncapped,
|
||||||
|
Release, exact binary: CPU/GPU p50/p99 + fps vs the current production
|
||||||
|
profile (519.7 fps / 1.869 / 1.096 ms baseline). Within 20% → proceed;
|
||||||
|
worse → STOP, owner decision with numbers on the table.
|
||||||
|
- **Gates:** transition checklist self-run; hermetic suites; owner visual
|
||||||
|
gate (statics look right indoors + outdoors, no seam strip at the
|
||||||
|
doorway, no z-fighting at shells); perf numbers recorded in this plan.
|
||||||
|
|
||||||
|
### FW4 — entities, particles, dynamics into walk turns; delete the apparatus
|
||||||
|
|
||||||
|
**Goal:** everything draws at its walk turn; the patch apparatus and the
|
||||||
|
old visibility layer are gone.
|
||||||
|
|
||||||
|
- Entities gate per view via `Render::viewconeCheck` at their cell's walk
|
||||||
|
turn; dynamics-last and alpha interleave per the walk's stages
|
||||||
|
(`RetailAlphaQueue` becomes the stream's alpha stage or is absorbed —
|
||||||
|
decide at implementation with the retail stage list as the arbiter);
|
||||||
|
particles draw at their owner cell's turn (`ShouldDrawParticles`),
|
||||||
|
unclipped.
|
||||||
|
- Re-point the consumers at the walk's visible-cell output: particles
|
||||||
|
(`ParticleVisibilityController`), lights (`BuildPointLightSnapshot`
|
||||||
|
filter), EnvCell prepare filter. Directional-shadow caster selection
|
||||||
|
consumes the same set.
|
||||||
|
- DELETE in this stage (registry rows updated in the same commits):
|
||||||
|
look-in seeding + callers + barrier math; punch stencils
|
||||||
|
(`PortalDepthMaskRenderer` #117); the InViewCells side-channel;
|
||||||
|
`PortalVisibilityBuilder`'s production role; `RetailPViewRenderer` /
|
||||||
|
`RetailPViewPassExecutor` shells (their stage knowledge now lives in the
|
||||||
|
walk); the packed route machinery + `PackedOracle` + both
|
||||||
|
classification caches; `CellVisibility`'s dead BFS.
|
||||||
|
- **Gates:** the full re-expressed replay suite; transition checklist;
|
||||||
|
hermetic suites; the owner visual matrix — cathedral #456 acceptance
|
||||||
|
(far building, monsters, stalks hidden at the terrace edge at NORMAL
|
||||||
|
camera; no seam strip; no z-fighting; candle/falls/lake/portal-flood
|
||||||
|
intact), doorway flap, dungeon wall/floor seams, portal-in, house exit,
|
||||||
|
teleport timing.
|
||||||
|
|
||||||
|
### FW5 — camera completion
|
||||||
|
|
||||||
|
**Goal:** the camera is retail's, end to end.
|
||||||
|
|
||||||
|
- Port `CameraSet::Farther`/`CameraSet::Raise` verbatim into
|
||||||
|
`RetailChaseCamera`: the multiplicative offset scaling with the
|
||||||
|
write-refusal gates (|x|<10, |y|<10, z<450, z>−1.8 — NOT a simple
|
||||||
|
distance clamp), the preserved-length pitch. The 40 m dev zoom goes
|
||||||
|
away with it (owner-approved in the spec round).
|
||||||
|
- Port retail's zoom/pitch adjustment rates if recoverable from decomp
|
||||||
|
(retires TS-56); if not recoverable, TS-56 stays with a note.
|
||||||
|
- **Gates:** camera unit tests against ported constants; owner
|
||||||
|
side-by-side feel gate vs retail (chase, zoom saturation ≈13 m boom,
|
||||||
|
collision, slope align).
|
||||||
|
|
||||||
|
### FW6 — closeout
|
||||||
|
|
||||||
|
- Divergence-register reconciliation (added: landblock-stage streaming
|
||||||
|
exposure rows if not already rowed, order-preserving MDI merging as
|
||||||
|
intentional architecture; retired: lift, #117 stencils, look-in-era
|
||||||
|
rows, TS-56 if ported).
|
||||||
|
- Docs: architecture doc render section rewritten around the walk;
|
||||||
|
`worldbuilder-inventory.md` updated (WB = asset layer only);
|
||||||
|
`launch-options.md` rows for any probes added/removed (probes die with
|
||||||
|
their investigations).
|
||||||
|
- Memory: `project_render_pipeline_digest.md` rewritten current-truth-on-top
|
||||||
|
around the walk; campaign memory closed out.
|
||||||
|
- Roadmap + milestones updated; the quarantined PV branch gets a
|
||||||
|
disposition note (kept as archive; nothing merges).
|
||||||
|
- Final gates: full hermetic suites, both standard connected routes,
|
||||||
|
the complete owner visual matrix, merge to main.
|
||||||
|
|
||||||
|
## Rollbacks
|
||||||
|
|
||||||
|
Each stage lands as its own commit series; record `git revert` anchors
|
||||||
|
here as stages close (the Modern Runtime plan's convention). FW3 and FW4
|
||||||
|
are the cutover stages — their revert anchors are mandatory entries.
|
||||||
|
|
||||||
|
## Risks (tracked, from the spec)
|
||||||
|
|
||||||
|
- **Perf** — decided by FW3's checkpoint, numbers over hope.
|
||||||
|
- **Streaming scope creep** — only the two register-rowed exposure
|
||||||
|
adaptations may be touched; anything more is out of scope.
|
||||||
|
- **Oracle fidelity** — traces need owner-assisted retail sessions (FW0);
|
||||||
|
captured once, checked in.
|
||||||
|
- **Classifier drift during staging** — FW3's split runs walk statics
|
||||||
|
beside packed dynamics for one stage; the route contract seam is the
|
||||||
|
guard, and FW4 deletes the duality.
|
||||||
|
- **Camera ergonomics** — the dev zoom disappears at FW5; a separate dev
|
||||||
|
flycam is deliberately deferred (the Fly camera in `CameraController`
|
||||||
|
already exists for development framing).
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
# Campaign W — the retail frame walk (rendering redesign design spec)
|
# Campaign FW — the retail frame walk (rendering redesign design spec)
|
||||||
|
|
||||||
**Status:** DRAFT — awaiting owner review (2026-08-30).
|
**Status:** APPROVED by owner 2026-08-30. Implementation plan:
|
||||||
|
[`docs/plans/2026-08-30-campaign-fw-frame-walk.md`](../../plans/2026-08-30-campaign-fw-frame-walk.md).
|
||||||
|
**Naming note:** approved as "Campaign W"; renamed to **FW** because the
|
||||||
|
roadmap already owns "Phase W" (the historical Unified Cell Graph program).
|
||||||
|
Stage ids are FW0–FW6.
|
||||||
**Owner directive:** "I want this as solid as retail, no weird seams between
|
**Owner directive:** "I want this as solid as retail, no weird seams between
|
||||||
walls or floors, it should work as retail. As stable as retail." Scope
|
walls or floors, it should work as retail. As stable as retail." Scope
|
||||||
confirmed 2026-08-30: retail owns every frame decision, modern code owns
|
confirmed 2026-08-30: retail owns every frame decision, modern code owns
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue