I've recently made a set of bug fixes that help the engine keep track of the current snap point, even after programmatic scrolls.
For proper behavior, when a programmatic scroll occurs that will take us close to a snap point, we should drive an animation to that snap point. If the programmatic scroll was not sufficient to take us past, say, the midpoint between two snap points, we should roll back to the original snap point once the scroll operation completes.
However, this would break manually animated scrolling operations.
One possible answer to this problem is to say "Don't try to combine scroll-snap points and programmatic scrolling."
This is currently under discussion in the css working group. The current thought is that we should not invoke scroll snap points for programmatic scrolls, but we should add a 'snap' element to the ScrollOptions dictionary.