How Did I Get Here?
Assertions can be great for detecting unexpected state in your code. But when a state violation is caught in an assert, the next question is usually “How did I get here?”.
A simple but effective way to track down this kind of issue is the following: in each class instance allocate a StringBuilder member (called, for example, stateLog). Then, at each point in the class code where the state changes, log the change with an appropriate message (usually a helper method that takes a string message is appropriate here - it should append the message plus a snapshot of the relevant member variables to the stateLog).