An event on the same frame as the animation duration should always be fired. If it's not, that's a bug we should fix.
We have some unit tests for events and AnimationState (which also tests events) that cover this scenario, unless you are applying your animations differently from the tests in some way.
If there is a bug, what we need to fix it is code that reproduces the issue. You could use our test.json that has the events on frames 0, 14, and 30 then write code that applies that animation in the same way you do, but using a fixed time step so the failure is repeatable. For example if you are using AnimationState, something like this pseudo code:
AnimationState state = ...
state.setAnimation(0, "events0", false);
state.apply(skeleton);
state.update(0.1f); // time step
state.apply(skeleton);
state.update(0.1f);
...
// Whenever the event should be fired by the next update:
state.addListener({
event: function (entry, event) {
print("fired: " + event);
}
});
state.update(0.1f);
If you can show the event doesn't fire when it should, then we can figure out what's going on!