The problem is that it is quite often more than 2 moving task executers that might be involved. Yes, dealing with just two TE's isn't too difficult. If TE1 is blocking TE2, you could say, well, if TE1 is idle, he should move out of the way of TE2 (but which way?), but if he's loading/unloading then TE2 should reroute around. However, if TE1 is loading/unloading and is already in the location where TE2 needs to go, then TE2 should not reroute, because no matter where he reroutes, he won't be able to get to the location. Sure, that's fine, but what if both TE1 and TE2 are trying to get to Location A, which currently TE0 is on. So when TE1 gets blocked by TE0, according to that logic he says hey TE0 is in the spot where I need to be, so I stay where I am and wait for him to clear. Then TE2 comes along and gets blocked by TE1. TE1 is not currently at the location where TE2 needs to go, so, according to that logic, TE2 needs to route around. But there's no "route around" logic that will get him to his location, because TE0 is already there. In real life, TE2 would see the queue and just get in line, which is what the current logic does automatically. And this chain of waiting could continue infinitely. So, do you wait for a certain amount of time, and then reroute? If you reroute and you still can't get all the way to your destination, is there some "closer" threshold that you say, ok that's good enough, go ahead and reroute even though I can't get all the way there? Or if you're far enough away from your destination do you go ahead and reroute because by the time you get there maybe the location you're trying to get to will have cleared out?
The decision tree of what to do in these situations is just too complicated for us to say that one size will fit all.