acdream/tests/AcDream.App.Tests/Rendering/Walk
Erik 88c70072e0 fix(render): S3 chunk 1 round 2 — one weather OC per frame (pinned), literal EC/OC comparison, comment/cost/wording items
Campaign OVERHAUL S3 chunk 1 fix round 2 (docs/research/2026-09-01-overhaul/
s3-walk-ownership-map.md §11.6), applied on top of 36be6b598 after the
three-lens re-review. H1-H6, the last round the plan allows.

H1 — the weather OC printed 2-4 times per interior-rooted frame instead of
once: the print (and the `_sky.RenderWeather` mesh draw it sits beside) lived
inside `DrawLandscapeSliceLate`, which `RetailPViewRenderer` calls once per
active `OutsideViewSlices` entry. Moved both into a new
`RetailPViewPassExecutor.DrawWeatherOnce`, called ONCE, unclipped/no-scissor,
after the slice loop in `DrawLandscapeDynamicsPhase` — retail's own
`GameSky::Draw(1)` runs once, after `LScape::draw`'s whole landblock loop.
The gate is extracted as a pure `ShouldDrawWeatherOnce(bool,bool,uint)`
predicate (retail's `SmartBox::is_player_outside` ANDed with the two render
toggles) so `RetailPViewPassExecutorTests` can pin "no OC while the player
stands indoors" without a live GL/DAT `SkyRenderer`; two structural
(CompiledCallGraph) tests prove the call moved out of the per-slice loop and
that the mesh draw + print each fire exactly once per invocation — this
codebase has no existing runtime-construction fixture for
`RetailPViewPassExecutor`, so the pin is structural + a testable pure gate
rather than an end-to-end GL drive. One deliberate deviation from the literal
"gated exactly as today": the print now runs through `_sky?.RenderWeather(...)`
(null-conditional, matching every other `_sky?.RenderSky(...)` call site in
this codebase) instead of an explicit `if (_sky is not null)` wrapper — a
missing sky asset no longer also suppresses the transcript print, since the
print's only job is trace fidelity and retail's own `GameSky` is never null.

H2 — WalkFrameDriver's EC-print comment still claimed "EC and OC counts are
always exactly equal"; replaced with the real citation
(holtburg-doorway-still.walk.log:1126,1131,1134,1137 — four EC prints for one
cell across four look-in DC turns), matching WalkTranscriptDump.
PrintEnvCellShell's own comment (already corrected in round 1).

H3 — the eight-kind signature's ORACLE side
(WalkTraceReplayContext.Signature8(WalkOracleFrame)) derived EC/OC from each
DC's cell list — the SAME derivation the REPLAY side's Recorder already used,
so the comparison could never disagree with itself on EC/OC placement or
content (how G7's SC-ordering regression shipped green with LC/SC). Now reads
its own literally captured EC/OC events, excluding only the trailing
per-frame weather OC — refined beyond the spec's literal "last event + P-cell
id" rule with an additional "P cell itself looks outdoor" check, after
cathedral-arrival and foundry-deep both proved the naive rule also strips an
interior root's OWN real trailing object-list turn when its nearest cell (the
reversed flood loop's last draw) happens to be the camera's own root cell.
All four kit-pose rows still reproduce: three exactly; #458 (this round's new
issue, formerly an inline-only note) re-verified at the SAME token index 165
under the new literal comparison.

H4 — OnSortCellTurn ran RequireOpenFrame + two range validations before
testing the flag. Since the hook is print-only (no stream side effect, unlike
OnLandCellTurn's unconditional WalkFrameEvent record), the flag check now
runs FIRST and returns immediately when off — flag-off cost drops to one
interface dispatch per visited land cell.

H5 — launch-options.md's ACDREAM_DUMP_WALK_TRANSCRIPT row: measured
≈1,200-1,400 lines per outdoor frame (terrace-edge 1,384; cathedral-arrival
1,269; doorway 1,187), replacing the earlier "600-800" estimate; documents
H4's residual flag-off interface-dispatch cost.

H6 — filed docs/ISSUES.md #458 for round 1's LOD-boundary land-cell
divergence (previously only an inline test comment); the InstalledDat lane's
known-failure set is now four (two #383 layout tests, TowerAscent, #458) —
confirmed by a clean run.

MUTATION CHECKS (both restored after confirming failure):
- H1: deleting the OC print inside DrawWeatherOnce made
  DrawWeatherOnce_DrawsTheWeatherMeshAndPrintsExactlyOnce fail with
  "Assert.Single() Failure: The collection did not contain any matching
  items".
- H3: reversing AppendFloodTurns (OC before EC) made
  Still_fixture_first_frame_reproduces_exactly(cathedral-arrival.walk) fail
  ("walk diverged from retail (cathedral-arrival.walk)"), diverging at token
  index 1241: expected "EC:f4180112" vs actual "OC:f4180112".

Gates: hermetic App suite 6823/6823 passed; InstalledDat lane 244/249 passed
with exactly the four known failures (two #383 layout tests, TowerAscent,

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 12:30:30 +02:00
..
LandWalkOrderTests.cs feat(render) Campaign FW1: port the retail landscape draw-order machinery 2026-08-30 09:35:26 +02:00
OrderedDrawStreamTests.cs feat(render) Campaign FW2: OrderedDrawStream + walk-order submitter 2026-08-30 12:31:31 +02:00
OrderPreservingSubmitterTests.cs fix(render) Campaign FW3.4a: rebind sections per DrawOrderedRange - the device-lost fix 2026-08-30 17:07:29 +02:00
RetailFrameWalkTests.cs fix(render): S3 chunk 3 round 1 - slot key, deferred cross-block terrain batches, per-frame terrain diagnostic 2026-09-03 09:57:34 +02:00
WalkBuildingJoinDiagnosticTests.cs feat(render) Campaign FW1: look-in adjudication - the GetVisible load gate 2026-08-30 10:43:27 +02:00
WalkBuildingPortalTests.cs feat(render) Campaign FW1: NINE of ten fixtures conformant - the degrade arm 2026-08-30 11:34:45 +02:00
WalkBuildingRegistryTests.cs feat(render) Campaign FW3.1: production walk world data behind the seam 2026-08-30 13:19:22 +02:00
WalkCopyViewTests.cs feat(render) Campaign FW1: port the view machinery (xformStart, polyClipFinish, copy_view) 2026-08-30 09:50:03 +02:00
WalkFrameDriverTests.cs feat(render): S3 chunk 1 — print-only walk transcript, OH fixtures, offline signature diff 2026-09-03 11:49:42 +02:00
WalkFrameDriverTranscriptTests.cs fix(render): S3 chunk 1 round 1 — SC at DrawSortCell entry, the weather OC, real pins with mutation checks 2026-09-03 11:49:42 +02:00
WalkLandCellOrderTests.cs feat(render): S3 chunk 3 — draw terrain per land cell in retail's interleave 2026-09-03 09:57:34 +02:00
WalkLandscapeAssemblerTests.cs checkpoint: preserve user-gated FW closeout fixes 2026-08-31 08:27:37 +02:00
WalkLandscapeDatBuilder.cs fix(render): S3 chunk 1 round 1 — SC at DrawSortCell entry, the weather OC, real pins with mutation checks 2026-09-03 11:49:42 +02:00
WalkLookInGateSweepTests.cs feat(render) Campaign FW1: SIX OF TEN FIXTURES FULLY CONFORMANT 2026-08-30 11:07:29 +02:00
WalkOraclePartsTrace.cs feat(render): S3 chunk 1 — print-only walk transcript, OH fixtures, offline signature diff 2026-09-03 11:49:42 +02:00
WalkOraclePartsTraceTests.cs fix(render): S3 chunk 1 round 1 — SC at DrawSortCell entry, the weather OC, real pins with mutation checks 2026-09-03 11:49:42 +02:00
WalkOracleTrace.cs feat(render): S3 chunk 1 — print-only walk transcript, OH fixtures, offline signature diff 2026-09-03 11:49:42 +02:00
WalkOracleTraceTests.cs fix(render): S3 chunk 1 round 1 — SC at DrawSortCell entry, the weather OC, real pins with mutation checks 2026-09-03 11:49:42 +02:00
WalkPortalGateDumpTests.cs feat(render) Campaign FW1: doorway-still conformant - deg_mul is dynamic 2026-08-30 11:49:27 +02:00
WalkProductionFrameContextTests.cs checkpoint: preserve user-gated FW closeout fixes 2026-08-31 08:27:37 +02:00
WalkProductionWorldConformanceTests.cs checkpoint(render): preserve pre-overhaul investigation state 2026-09-01 18:04:24 +02:00
WalkProductionWorldDataTests.cs feat(render): Campaign OVERHAUL S2 chunk 5 + closeout — registry is the only render membership owner 2026-09-03 01:01:47 +02:00
WalkPViewFloodTests.cs feat(render): S3 chunk 2 — gate the interior turn on the real outside-view count 2026-09-03 07:46:11 +02:00
WalkScreenClipTests.cs feat(render) Campaign FW1: port the view machinery (xformStart, polyClipFinish, copy_view) 2026-08-30 09:50:03 +02:00
WalkStaticStreamPopulatorTests.cs checkpoint(render): preserve pre-overhaul investigation state 2026-09-01 18:04:24 +02:00
WalkTraceConformanceTests.cs fix(render): S3 chunk 1 round 2 — one weather OC per frame (pinned), literal EC/OC comparison, comment/cost/wording items 2026-09-03 12:30:30 +02:00
WalkTraceReplay.cs fix(render): S3 chunk 1 round 2 — one weather OC per frame (pinned), literal EC/OC comparison, comment/cost/wording items 2026-09-03 12:30:30 +02:00
WalkTranscriptSignatureDiff.cs feat(render): S3 chunk 1 — print-only walk transcript, OH fixtures, offline signature diff 2026-09-03 11:49:42 +02:00
WalkVisibilityMathTests.cs feat(render) Campaign FW1: flood decomp appendix + the visibility math port 2026-08-30 09:44:49 +02:00
WalkWorldDatAdapter.cs feat(render) Campaign FW1: SIX OF TEN FIXTURES FULLY CONFORMANT 2026-08-30 11:07:29 +02:00
WalkWorldDatAdapterTests.cs feat(render) Campaign FW1: the landscape replay world + first outdoor diff 2026-08-30 10:36:09 +02:00