diff --git a/src/AcDream.App/Composition/LivePresentationComposition.cs b/src/AcDream.App/Composition/LivePresentationComposition.cs index b3396241..d6802e3d 100644 --- a/src/AcDream.App/Composition/LivePresentationComposition.cs +++ b/src/AcDream.App/Composition/LivePresentationComposition.cs @@ -1078,10 +1078,15 @@ internal sealed class LivePresentationCompositionPhase // Campaign CH slice CH2: the SpewBox is retail's OTHER on-screen // interface-text surface (research doc §1.1/§7.3/§7.4) — modeled // directly on the PortalWaitNoticeController lease immediately - // above, wired into the same retained-UI host. + // above, wired into the same retained-UI host. Like the wait notice + // in its no-tunnel arm, the transferred controller is reclaimed by + // the retained-UI root's own teardown (its Dispose only detaches + // children from that root). + CompositionAcquisitionScope.CompositionAcquisitionLease< + SpewBoxController>? spewBoxLease = null; if (interaction.RetainedUi is { } spewBoxRetainedUi) { - scope.Acquire( + spewBoxLease = scope.Acquire( "spew box", () => new SpewBoxController( spewBoxRetainedUi.Host.Root, @@ -1300,6 +1305,7 @@ internal sealed class LivePresentationCompositionPhase portalDepthLease.Transfer(); portalTunnelLease?.Transfer(); portalWaitNoticeLease?.Transfer(); + spewBoxLease?.Transfer(); skyLease.Transfer(); particleLease.Transfer(); bindingsLease.Transfer();