test(vfx): model the post-f24532ad effect cell and canonical body frame

f24532ad changed two presentation contracts that these fixtures still
expressed in their pre-change shape. Both failures date exactly to that
commit; they are independent of the world-frame family fixed in 6dcb94ac.

LiveEntityLightControllerTests.Refresh_FollowsCurrentTopLevelRootAndCell moved
the entity by writing ParentCellId alone. f24532ad now populates EffectCellId
at materialization and keeps it synchronized on canonical rebuckets
(LiveEntityRuntime.RebucketLiveEntity:845-856), because retail's
CPhysicsObj::set_cell changes the one CObjCell that ShouldDrawParticles reads.
EntityEffectPoseRegistry.UpdateRoot:163 resolves EffectCellId ?? ParentCellId,
so a production cell move writes both together and the old single-field move
left effects and lights on the stale materialization cell.

LiveEntityAnimationSchedulerTests.RetainedProjectileWithRemote_WhenMissileClears_TransfersMovementToRemoteOnce
seeded its shared remote body by assigning Position directly. Projectile
classification now validates and adopts the canonical body's own cell frame
(ProjectileController:184-190 - body.CellPosition.ObjCellId /
.Frame.Origin) rather than deriving it from the sidecar's FullCellId and the
streaming center, since a residence-managed Create legitimately still reports
FullCellId 0. A Runtime-committed body always carries its (cell, local) frame,
so the fixture now seeds it through the same SnapToCell placement API; leaving
it cell-less was correctly refused.

Both fixtures keep their original assertions - only the modelled world state
moved to match what production now commits.

Complete Release solution: 10,831 passed / 4 skipped / 0 failed
(App 4,048/3, Bake 15, Cli 4, Content 124, Core.Net 762, Core 4,247/1,
Headless 79, Runtime 1,009, UI 543).

Closes #281.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-03 13:32:46 +02:00
parent 6dcb94ac1b
commit 98e9f9e8c6
3 changed files with 51 additions and 1 deletions

View file

@ -80,6 +80,36 @@ What does NOT go here:
1` (a 3x3 landblock neighborhood), while the normal configured view extends
substantially farther; this permits the world viewport to open before its
visible static destination is complete.
- **#281 — DONE (2026-08-03) — the stabilization commits left the automated
suites red, and the world-frame contract they introduced had no coverage.**
The 2026-08-03 handoff recorded "six selected fixture failures". A measured
baseline found **43**: the App suite was fully green at `01f4791e` and
`670f307c` broke 28 tests in one commit (`f24532ad` added 2 more), while the
Runtime suite lost 13 — 12 of them in `RuntimeRemoteFirstEntryStateTests`,
the exact conductor `670f307c` gated. Both commits were gated on focused
runs only. Root cause A (`670f307c`): remote first-entry placement now
resolves its landblock-local Create origin through Runtime's world frame
(`RuntimeSetPositionState.PrepareMover`) and returns
`RetrySetupUnavailable` until that frame exists, and ONLY the accepted
local-player Create publishes it
(`RuntimeEntityObjectLifetime.RegisterEntityCore` ->
`RuntimePhysicsState.ObserveLocalWorldFrame`). Fixtures that drove remote
conductors in a player-less world — a state production never occupies —
parked forever, so residences never retired. The production gate is correct
and matches App's own `LiveWorldOriginState` (initialized from the player
spawn; `Recenter` called only from
`StreamingOriginRecenterCoordinator.Advance` at a teleport boundary), so the
fixtures were stale, not the assertions: every one was repaired by supplying
the missing precondition without altering a single expected value. Root
cause B (`f24532ad`): `EffectCellId` is now populated at materialization and
wins over `ParentCellId` in `EntityEffectPoseRegistry.UpdateRoot`, and
projectile classification reads the canonical body's own
`CellPosition.ObjCellId` instead of deriving it from the sidecar. Two
rendering fixtures still modelled the pre-change shape. New
`RuntimeWorldFrameTests` pins the previously untested contract, including
the load-bearing rule that ordinary movement across a landblock boundary
must NOT rebase the frame while an accepted teleport must. Complete Release
solution: 10,831 passed / 4 skipped / 0 failed.
**Retail oracle:** `CellManager::PreFetchCells @ 0x00455820` sets
`blocking_for_cells` until `LScape::PreFetchCells @ 0x00505660` has walked