fix #FA4-mechanism-MUST-FIX-3,SF-4: re-arm 0x00A6 on reconnect; unsubscribe ActivePageChanged on Dispose
MUST-FIX 3 -- SocialFellowshipPageController.SetPageVisible is edge-triggered on a bool that survives a generation reset unchanged while the panel stays open, so a reconnect never re-sends 0x00A6 and fellow vitals freeze for the rest of the new session. SocialPanelController.ResetSessionDeclaration clears the fellowship page's latch (SocialFellowshipPageController. ResetPageVisibleLatch, this commit's counterpart) and re-evaluates the existing "window shown AND Fellowship active" conjunction, wired into RetailUiRuntime.ResetSessionTransientUi -- a seam that already runs on every generation reset. A still-open Fellowship page re-declares; a closed or other-tab page correctly stays silent. SF-4 -- SocialPanelController's constructor subscribed an anonymous lambda to UiTabPanel.ActivePageChanged with no way to remove it; Dispose only set a flag. A tab switch after Dispose still reached UpdateFellowshipPageVisibility and issued a Runtime command, since Tick's own _disposed guard doesn't cover this event path. Stored the handler as a field and unsubscribe it in Dispose. Also adds the panel-level D4 conjunction test mechanism SF-5 flagged as missing (the only prior D4 test exercised the PAGE controller's own edge-trigger directly, never SocialPanelController's "window shown AND Fellowship active" logic or its ActivePageChanged subscription). Per docs/research/2026-08-12-fa4-review-mechanism.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
5499f0581f
commit
df00030697
3 changed files with 166 additions and 2 deletions
|
|
@ -729,11 +729,24 @@ public sealed class RetailUiRuntime : IDisposable
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MUST-FIX 3 (FA4 fix round): also re-arms the fellowship page's
|
||||
/// <c>0x00A6</c> panel-open declaration latch
|
||||
/// (<see cref="Layout.SocialPanelController.ResetSessionDeclaration"/>).
|
||||
/// <see cref="SocialPanelController"/> is process-lifetime, but its
|
||||
/// edge-trigger latch is not — without this, a reconnect while the
|
||||
/// Fellowship page is left open never re-sends <c>0x00A6</c> on the new
|
||||
/// session, and every fellow's vitals freeze for the rest of the
|
||||
/// session (lane B §4.5: ACE streams <c>0x02C0</c> only to fellows with
|
||||
/// <c>FellowshipPanelOpen</c> set, and that flag is set only by
|
||||
/// <c>0x00A6</c>).
|
||||
/// </summary>
|
||||
public void ResetSessionTransientUi()
|
||||
{
|
||||
ResetSessionDialogs();
|
||||
AppraisalController?.ResetSession();
|
||||
Host.HideWindow(WindowNames.Examination);
|
||||
SocialPanelController?.ResetSessionDeclaration();
|
||||
}
|
||||
|
||||
public void UpdateCursor(IEnumerable<IMouse> mice)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue