fix(ui): gate — no void frames around the login wormhole; vitals icons centered

The login tunnel now covers from the first world-facing frame (the
sky-void backdrop can never present pre-tunnel) and holds through an
atomic tunnel-to-world swap at reveal completion — the void is
structurally unreachable on both edges, pinned by frame-sequence tests
across WorldSceneRenderer/WorldRevealCoordinator/LocalPlayerTeleport-
Controller/RuntimeWorldTransitState. Vitals detail icons draw at their
authored centered offsets in both stacked and side-by-side layouts.
Implemented and live-probed by the fix agent; finalized by the lead
after the agent parked post-verification (gates re-run green:
App 5512/3, Runtime 1747/0).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-17 12:30:51 +02:00
parent 2f8c046aba
commit fdc4fd496d
17 changed files with 649 additions and 66 deletions

View file

@ -192,6 +192,69 @@ public sealed class RuntimeWorldTransitStateTests
Assert.Equal(0, state.Snapshot.InvariantFailureCount);
}
[Fact]
public void LoginMaterialization_ReleasesSimulationBeforeViewportAndCompletion()
{
// The login mirror of the portal materialization edge: retail's
// SmartBox::UseTime @ 0x00455410 blocking_for_cells branch resumes
// CObjectMaint/CPhysics when destination cells stop blocking — while
// the tunnel is still in front — identically for the initial login.
// Without this edge the login world stayed unavailable until
// Complete, so the WorldFadeIn second presented an empty world frame
// (the 2026-08-17 gate's exit-edge void).
var state = new RuntimeWorldTransitState();
long generation = state.BeginLoginReveal(OutdoorCell);
Assert.True(state.AcknowledgeDestinationReadiness(
Ready(generation, OutdoorCell)));
Assert.True(state.AcknowledgeLoginMaterialized(generation));
Assert.True(state.IsWorldSimulationAvailable);
Assert.True(state.Snapshot.Materialized);
Assert.False(state.Snapshot.WorldViewportObserved);
Assert.False(state.Snapshot.Completed);
// The portal materialization counter counts Kind == Portal only.
Assert.Equal(0, state.Snapshot.PortalMaterializationCount);
Assert.False(state.AcknowledgeLoginMaterialized(generation));
Assert.True(state.AcknowledgeWorldViewportVisible(generation));
Assert.True(state.Complete(generation));
Assert.True(state.Snapshot.Completed);
Assert.Equal(0, state.Snapshot.InvariantFailureCount);
}
[Fact]
public void LoginMaterializationBeforeReadiness_IsRejectedWithoutOpeningWorld()
{
var state = new RuntimeWorldTransitState();
long generation = state.BeginLoginReveal(OutdoorCell);
Assert.False(state.AcknowledgeLoginMaterialized(generation));
Assert.False(state.IsWorldSimulationAvailable);
Assert.False(state.Snapshot.Materialized);
Assert.Equal(1, state.Snapshot.InvariantFailureCount);
}
[Fact]
public void LoginMaterialization_RejectsPortalRevealsAndStaleGenerations()
{
var state = new RuntimeWorldTransitState();
long generation = BeginPortal(state, OutdoorCell);
Assert.True(state.AcknowledgeDestinationReadiness(
Ready(generation, OutdoorCell)));
// Wrong kind: a portal reveal must ride the sequence-correlated
// portal acknowledgement, never the login edge.
Assert.False(state.AcknowledgeLoginMaterialized(generation));
Assert.False(state.IsWorldSimulationAvailable);
// Stale/zero generations are rejected without invariant failures.
Assert.False(state.AcknowledgeLoginMaterialized(0));
Assert.False(state.AcknowledgeLoginMaterialized(generation + 1));
Assert.Equal(0, state.Snapshot.InvariantFailureCount);
}
[Fact]
public void EarlyViewport_IsRejectedWithoutFabricatingVisibility()
{