fix(chat): CH2 SpewBox lease was acquired but never transferred — startup crash

The composition scope's completion contract threw 'unpublished
resources: spew box' on every graphical launch with the retail UI:
scope.Acquire's returned lease was discarded, so it could never be
Transfer()ed alongside its siblings. Suite missed it because the
composition tests run with RetainedUi absent, so the acquire block
never executed. Ownership after transfer matches the wait-notice
no-tunnel arm: the retained-UI root's teardown reclaims the element
tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-09 22:38:34 +02:00
parent 38f0c0defc
commit d1c1368a5e

View file

@ -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();