One data-sv-pin wrapper, one sticky child. The driver writes --sv-scene as you scroll.
Shots and steps carry --i. Distance to the scene is one max(). That is the crossfade.
No observers per step, no timeline library. Three scenes here; make it thirty.