fix(ui): OP3 re-review residuals R1/R2/R3 (coordinator pass)

R1: the gate script no longer promises a timestamp prefix on the Magic
macro lines — acdream renders no chat timestamps yet (the Display
Timestamps consumer is OP4 scope; no chat-log file exists, TS-69). A
bare light-blue transcript line is the CORRECT gate outcome.

R2: IsGrounded yields null (silent) for a NULL controller in player
mode — the prior pattern returned false and fired the mid-air refusal
retail cannot produce in that state; comments now match the code.

R3: the dormant-ActivePageChanged pin now applies the real stimulus —
every authored tab button on a dormant host must carry NO click handler
(RetailTabBinding.SetClick never ran), which is AD-73's actual dormancy
mechanism; SwitchTo deliberately has no guard.

OP3 is CLOSED: dual APPROVE-WITH-FIXES -> fix round 386076af ->
re-review REOPEN(narrow) -> this pass. Connected gate now READY.

Full Release suite: 12,956 passed / 4 skipped / 0 failed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-11 03:25:40 +02:00
parent 7b60e71b85
commit cb3346907d
3 changed files with 33 additions and 8 deletions

View file

@ -108,11 +108,14 @@ for this slice, not a bug.
session sees zero lines (everything already at the macro's target). session sees zero lines (everything already at the macro's target).
**These six lines are byte-verified `RetailLogTextType.Magic` (0x07), **These six lines are byte-verified `RetailLogTextType.Magic` (0x07),
NOT the client-local refusal type** — expect LIGHT BLUE text in the NOT the client-local refusal type** — expect LIGHT BLUE text in the
SCROLLING CHAT TRANSCRIPT (not the transient SpewBox overlay), with SCROLLING CHAT TRANSCRIPT (not the transient SpewBox overlay). Do
a timestamp prefix, same as any other Magic-colored system line. If NOT expect a timestamp prefix: acdream renders no chat timestamps
you see bright red text in a transient 5-second overlay instead (the yet (the Display Timestamps consumer is OP4 scope, and there is no
ClientLocal/SpewBox look used by the mid-air refusal and UA/RA chat-log file — TS-69), so a bare light-blue line is CORRECT here
above), that is the pre-fix-round bug — report it. (OP3 re-review R1). If you see bright red text in a transient
5-second overlay instead (the ClientLocal/SpewBox look used by the
mid-air refusal and UA/RA above), that is the pre-fix-round bug —
report it.
**Known, registered gap (TS-74): acdream has no persistent **Known, registered gap (TS-74): acdream has no persistent
"turn to face camera" mouse-turning MODE yet, so this button changes "turn to face camera" mouse-turning MODE yet, so this button changes
stored preferences and sends the wire bit, but you will not see the stored preferences and sends the wire bit, but you will not see the

View file

@ -811,9 +811,15 @@ internal sealed class RetailInteractionRetainedUiCompositionFactory
// into "not grounded", which fired the mid-air message // into "not grounded", which fired the mid-air message
// outside player mode — the opposite of retail and the // outside player mode — the opposite of retail and the
// opposite of what the old comment here claimed. // opposite of what the old comment here claimed.
IsGrounded: () => !d.PlayerMode.IsPlayerMode // R2 (OP3 re-review, 2026-08-11): a NULL controller in
? (bool?)null // player mode must ALSO yield null (silent) — the prior
: d.PlayerController.Controller is { IsAirborne: false }, // `is { IsAirborne: false }` pattern returned false for
// null and fired the refusal retail cannot produce.
IsGrounded: () =>
d.PlayerMode.IsPlayerMode
&& d.PlayerController.Controller is { } liveController
? !liveController.IsAirborne
: (bool?)null,
IsUseMouseTurningEnabled: () => IsUseMouseTurningEnabled: () =>
CharacterOptionTable.TryGet( CharacterOptionTable.TryGet(
CharacterOptionId.UseMouseTurning, CharacterOptionId.UseMouseTurning,

View file

@ -89,6 +89,22 @@ public class OP2ReworkBlastRadiusConformanceTests
host.ActivePageChanged += (_, _) => raised++; host.ActivePageChanged += (_, _) => raised++;
Assert.False(host.BehaviorActive); Assert.False(host.BehaviorActive);
// R3 (OP3 re-review, 2026-08-11): a subscribe-then-assert-zero pin
// passes even with dormancy fully broken. The REAL dormancy
// mechanism is that ActivateTabBehavior (via RetailTabBinding.
// SetClick) was never called, so the authored tab BUTTONS carry no
// click handler — clicking a dormant host's tab can invoke nothing.
// SwitchTo itself deliberately has no dormancy guard (a controller
// may drive it directly), so the button wiring IS the contract.
foreach (UiTabTableEntry tab in host.Tabs)
{
var button = layout.FindElement(tab.ButtonElementId);
Assert.NotNull(button);
Assert.False(button!.HandlesClick,
$"dormant tab button 0x{tab.ButtonElementId:X8} has a click "
+ "handler — import-time activation regressed (AD-73)");
}
Assert.Equal(0, raised); Assert.Equal(0, raised);
} }