I thought I spotted a bug in the code that deserializes saved analysis trees.
I tried a test case, and it worked.
I looked more closely:
It turned out that the author of the deserialization code intended to do the wrong thing; she intended to iterate through the inputs of a node, instead of just reusing one input.
But she failed to implement her intention correctly; she didn't check the return value of the iterator, so when it failed, she just used the old input without realizing it.
So it worked after all.
This is not exactly two wrongs making a right. At best, this is two wrongs making a right with a heaping helping of AIEEEE!