According to the spec it throws in the following cases:
Parent - Moved Node
disconnect - connected
connected (Doc A) - connected (Doc B)
connected - disconnected
The last one is the most concerning one. Most of the top performing frameworks do child node reconciliation something like this https://github.com/WebReflection/udomdiff/blob/e58db3ad28b72.... Each node could be unmoved (no-op), new (disconnected), or moved from within the parent (connected). Now if one wants to leverage moveBefore each of these nodes needs to be checked for it's connection state.