fix(ui): FA4 re-review REOPEN — re-declare 0x00A6 from the post-world seam, not the pre-world reset

The FA4 fix round's MUST-FIX 3 placed the 0x00A6 reconnect re-arm at the
wrong lifecycle point (re-review 8bbceff5): ResetSessionTransientUi runs
via the SessionDialogs reset stage BEFORE _inWorld=true, so SetPanelOpen
(world-gated, Validate requireWorld:true) returned Inactive and published
nothing — yet _pageVisible was latched true anyway, so no later hook
re-declared and fellow vitals stayed frozen for the whole new session.
The unit test passed only because the fake recorded unconditionally.

Two-part fix, both retail-faithful mechanisms not suppressions:
- SocialFellowshipPageController.SetPageVisible advances the edge-trigger
  latch ONLY when the declaration is Accepted (published), so a dropped
  pre-world send leaves the latch clear and a later attempt retries.
- ResetSessionDeclaration (pre-world) now ONLY clears the latch; the new
  RedeclareAfterWorldEntry fires from the LiveSession EnteredWorld seam
  (wired via RestoreLayout, idempotent if a persisted layout already
  re-showed the page) so a still-open Fellowship page re-declares 0x00A6
  in world and vitals resume.

Regression pins that actually catch it (the prior test could not):
- SetPageVisible_DoesNotLatch_WhenDeclarationDropped_SoItRetriesInWorld
  (widget-level root, world-gated fake);
- Reconnect_ReDeclares0x00A6_AfterWorldEntry_NotDuringPreWorldReset +
  Reconnect_StaysSilent_WhenFellowshipPageIsNotActuallyOpen (panel-level,
  world-gated). RED-verified: reintroducing the pre-world declaration
  fails the reconnect test.

Full Release suite: 13,286 passed / 4 skipped / 0 failed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-12 07:59:16 +02:00
parent 8bbceff594
commit 04161defd8
7 changed files with 148 additions and 42 deletions

View file

@ -533,8 +533,18 @@ public sealed class SocialFellowshipPageController
public void SetPageVisible(bool visible)
{
if (_pageVisible == visible) return;
_pageVisible = visible;
_bindings.SetPanelOpen(visible);
// MUST-FIX 3 re-fix (FA4 re-review REOPEN, 2026-08-12): advance the
// edge-trigger latch ONLY when the 0x00A6 declaration was actually
// published (Accepted). A generation reset runs BEFORE the
// reconnected session is in world, so this command is world-gated and
// returns Inactive there — publishing nothing. The original fix
// latched unconditionally, leaving `_pageVisible = true` while the
// fresh server was never told, so the intended post-world
// re-declaration became a no-op (already latched) and fellow vitals
// stayed frozen. Leaving the latch untouched on a dropped publish
// lets RedeclareAfterWorldEntry retry exactly once, in world.
if (_bindings.SetPanelOpen(visible).Status == RuntimeCommandStatus.Accepted)
_pageVisible = visible;
}
/// <summary>