There seems to be some loss of precision along the line. When animationStop$ is calculated, it adds the duration (animationStopTime - animationStartTime), to this.animationStart$ (the current time in this case). I just printed out all the values, and for an animationStart$ = 11.8571856 and duration = 19.06667, the calculated animationStop$ was 30.923855599999996. (The rate is also -1 here, but that cancels out by using negative duration).

When it gets to the last get animationTime in the tick, the current time is 30.923855599999996, which matches animationStop$. But, when it goes through the calculation for animationTime ((time - animationStart$) * rate + duration it works out to -19.066669999999995 + 19.06667, which doesn't equal 0. In this case, it was slightly positive, so everything looks fine on screen, but occasionally its negative.

Do you have any suggestions on how to fix that?