Thank you for the nice, complete post! Kudos! You others take note, posts in this format take priority over all other posts!
That is the expected behavior. Eg, say you have multiple tracks. Tracks are applied in sequence each frame, so subsequent tracks can overwrite part or all of a pose from previous tracks. If a subsequent track finishes first, you may want it to continue to overwrite the pose of the previous track, until all tracks are done.
If AnimationState always removed a non-looping animation when it reached the duration, you would be unable to continue applying that animation if that is what you wanted.
If you want to clear a track when an animation is finished, you can do this:
state.SetAnimation(0, "jump", false);
state.AddAnimation(0, (Animation)null, false, 0);
The cast is necessary because there is the same method that takes a string. I'd be for making a dedicated method if we can come up with a nice method name. AddClearTrack? AddEndTrack? In that case ClearTrack could be renamed EndTrack. What do you think?
It may be more common to want to clear a track when it completes, but making it the default behavior means it is not possible to get the current behavior. I would like to have both. I'm open to ideas on how to make the API nicer!