As a workaround I started verifying if the positionEvent or execDetailsEvent received matches the last verified position plus any fills since then. This is an improvement and caught some cases, but I saw one instance where I did not receive either a positionEvent or an execDetailsEvent after the second of two partial fills, but did receive an orderStatusEvent with the full fill. I will start using those in the verification as well. Also, I somehow missed the trade.fillEvent, thanks for that tip, I will start handling that as well, hopefully it is reliable.
This seems to only happen on rapid subsequent partial fills. I will look at filing an issue with ib-api-reloaded and hopefully someone can give me pointers on how to debug it further.