diff --git a/docs/plans/2026-08-30-campaign-fw-frame-walk.md b/docs/plans/2026-08-30-campaign-fw-frame-walk.md index 78870782..aa429a29 100644 --- a/docs/plans/2026-08-30-campaign-fw-frame-walk.md +++ b/docs/plans/2026-08-30-campaign-fw-frame-walk.md @@ -265,6 +265,21 @@ pixel-equivalent on static content. - **Gates:** submitter unit tests (order preservation, merge legality); framebuffer equivalence on static-content scenes; hermetic suites green. +**FW2 STATUS (2026-08-30, @`e65644cb`):** `OrderedDrawStream` + +`WbDrawDispatcher.OrderedStream` (the submitter partial — per-instance- +first emission, pure-CPU merge-run builder, fail-loud stage/pipeline/ +cull boundary validation) and `WorldDepthContract` are landed with 27 +RecordingGpuDevice gates; hermetic 6,714/0. Depth verified verbatim +from the decomp (`zfuncVal` 0x2 = D3DCMP_LESS via `SetDepthBufferMode` +@0x005a2d10; LESSEQUAL is GameSky-local). **Gate adjudication:** the +offscreen pixel A/B rides FW3's cutover toggle — a walk-driven scene +first exists there, `IGpuRenderTarget` has no readback verb today, and +opaque content under Less is order-independent, so the RecordingGpuDevice +order/merge referees are FW2's automated gate and the pixel proof joins +FW3's (offline pixel gate + owner visual gate). Deferred to FW3 and +recorded in the code: the building-detail overlay replay, portal-punch +emission, and the `_drawCullModes`/alpha-scope sequencing constraint. + ### FW3 — static world cutover + THE perf checkpoint **Goal:** terrain, EnvCell shells, and buildings draw via the walk in @@ -291,6 +306,60 @@ deeper commitment. gate (statics look right indoors + outdoors, no seam strip at the doorway, no z-fighting at shells); perf numbers recorded in this plan. +**FW3 SLICE PLAN (2026-08-30, from the cutover-surface survey):** + +- **FW3.1 — production walk world data.** Materialize the walk's world + model at landblock commit time, registry-owned, through the LEGAL + `IDatReaderWriter` seam (never raw `DatCollection` — + `RuntimeDatAccessArchitectureTests`): (a) `WalkCell` fields onto/beside + `LoadedCell` (portal side/exact from the RAW `Flags` already preserved + on `CellPortalInfo`; plane from the existing `ClipPlanes` parallel + list; the 0xFFFF→0xFFFFFFFF exit-sentinel widening); (b) a production + `WalkBuilding` build in `LandblockBuildFactory`/`BuildingLoader` — the + BIGGEST gap: today's `Building` drops ModelId/Frame/portal + flags/stab lists at load; (c) the walk landscape assembly (retail + z-slabs from the height table, the SideCellCount LOD pyramid, + `CellBuildings[]`, viewer-centred grid) fed from landblock residency; + (d) the production frame context: camera/rays/CyPlane/ObjectToClip + derived from the LIVE `WorldCameraFrame` + real viewport (the capture + client's 1024×720 constants are fixture pins, not production values). + Conformance: the ten oracle fixtures re-run against the PRODUCTION + builders (same DATs → identical walk output as the test adapter). +- **FW3.2 — walk-driven static routes.** `WorldSceneRenderer` drives + `RetailFrameWalk` → `OrderedDrawStream` + (Terrain/BuildingShell/CellStatic/LookInStatic/PortalPunch stages) → + `SubmitOrderedStream` for static content; the old builder STOPS + EMITTING `LandscapeOutdoorStatic`/`LandscapeBuildingShell`/`CellStatic` + ranges (the `CompletePackedProductionFrame` count assertion forbids + emit-but-skip); dynamic routes (`LookInObject`, + `LandscapeOutsideDynamic`, `DynamicLast`) stay packed — which requires + `ClipFrameAssembler` + `ViewconeCuller` to SURVIVE this stage (their + slices key the dynamic routes). Walk-path SELECTION publication + (static picking today rides `publishSelection: true` in the packed + classifier — an unlisted consumer; the walk submitter must feed + `RetailSelectionScene` or statics go un-clickable). Portal-punch + emission via `PortalDepthMaskRenderer` at walk turns; building-detail + overlay replay; sky/weather move from per-slice to the walk's + landscape turn; the `_drawCullModes`/alpha-scope sequencing constraint + resolved (own cull scratch or strict sequencing). Route-keyed particle + owners re-sourced from the walk. +- **FW3.3 — ShellDrawLiftZ retirement.** THREE sites (the register row + AP-32 lists only two — `LandblockBuildFactory.cs` bakes the lift into + the drawn cell transform and is unlisted): delete all three, flip the + #130 proof (`UnliftedGate_LeavesTheStripAtTheDrawnTopEdge` is + explicitly written to fail-by-gap until the lift is gone), delete + AP-32 in the same commit. +- **FW3.4 — perf checkpoint + gates.** BASELINE CORRECTION: the + 519.7 fps / 1.869 / 1.096 ms numbers are the Aerlinthe + ordinary-production profile, NOT dense Arwic. Before the cutover + lands, capture a fresh dense-Arwic pre-cutover baseline with the same + harness (`tools/run-connected-r6-soak.ps1 -Uncapped -DenseTown`), and + apply the ±20% stop rule to THAT pair. Transition checklist: the + lifecycle gate + dense-town soak exist; a Holtburg house-exit stop and + a teleport stopwatch metric must be ADDED to the lifecycle route + (`drive.ps1` from the spec does not exist — the checklist runs on the + existing gate scripts). + ### FW4 — entities, particles, dynamics into walk turns; delete the apparatus **Goal:** everything draws at its walk turn; the patch apparatus and the