The handshake that kept dropping
Spotify OAuth on Janus was a three-bug puzzle. First: two activities claimed the same redirect URI, so Android asked the user to choose between two identical "Janus" options - one that worked and one that didn't. Second: singleTask launch mode broke ActivityResult delivery, so a successful login killed the app. Third and strangest: Coil's crossfade animation on the profile picture corrupted Compose's internal layout tree during the activity resume after the browser redirect. The fix was an AsyncImage inside a stable Box with crossfade disabled - the green placeholder circle shows first, then the profile photo paints over it without Compose ever needing to swap nodes.
The real lesson: Compose's layout tree is a living thing. You can't swap a dozen nodes into a Column while the Choreographer is mid-frame and expect the internal arrays to agree on their own length. Give the tree one stable shape and change what's painted inside it.