You might write a small program to do some rapid and feed Z moves to check if it is repeating. It sound like the Z axis is losing encoder counts or slipping. That may also be the cause of the original crash if it was running fine on that same program.
The error is a soft limit which the machine knows it will over run in the next block. If the encoder was slipping, it wouldn't realize it was getting close and trip the over travel first. So that adds to the mistery.
If the program isn't too big, you might post that for a better idea of the environment it is running under. Provided it is a G-code file. Conversational is different.
There should be a G90(absolute) in the header not a G91(incremental). The Z to clearance can be a G31, more often seen as G0 Z 0.1