Recover from rapid document switches
A route that became ready while another was still leaving turned the never-shown current route into the leaving one. Its layer had already counted its close as reported before it had a listener, so the swap never finished and the workspace stayed blank. The reducer now drops a never-shown route, and ContentSwapLayer only counts a close as reported once a listener has run. The sync hold is now capped at 200ms from the request, waits on the requested surface (the child for child routes), and the route timing lives in the motion contract. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Parent502a4d6
8 files changed+100-23
StackedSplit