The legacy proxy gets a teardown signal per surface (stopSurface via UIManagerAnimationDelegate on main, commit-hook marking after #9901) and uses it to skip exit animations when the surface is being destroyed (surfacesToRemove_ → shouldAnimate = false in pullTransaction).
LayoutAnimationsProxy_Experimental has no equivalent — no stopSurface, no teardown detection at all. The final empty-root transaction of a dying surface (reload, surface unmount) is processed like any regular mutation batch: exit animations and the shared-transition state machine run against a surface that no longer exists, and light-tree state for that surface is never proactively cleaned.
Candidate fix: reuse the commit-hook approach from #9901 — mark the surface on an empty-root commit, consume the mark on the transaction that removes the root's children, and skip animations/clean up light-tree state for it.
The legacy proxy gets a teardown signal per surface (
stopSurfaceviaUIManagerAnimationDelegateon main, commit-hook marking after #9901) and uses it to skip exit animations when the surface is being destroyed (surfacesToRemove_→shouldAnimate = falseinpullTransaction).LayoutAnimationsProxy_Experimentalhas no equivalent — nostopSurface, no teardown detection at all. The final empty-root transaction of a dying surface (reload, surface unmount) is processed like any regular mutation batch: exit animations and the shared-transition state machine run against a surface that no longer exists, and light-tree state for that surface is never proactively cleaned.Candidate fix: reuse the commit-hook approach from #9901 — mark the surface on an empty-root commit, consume the mark on the transaction that removes the root's children, and skip animations/clean up light-tree state for it.