Bound objects (ie, marked objects like LastSeenBy, listed in objects.ids) are not stored anywhere after being calculated, so later evaluations of blocking actions call GetActorFromObject they get a different actor than the one they received at the start of the action.
This is broken; while dynamic objects like [PC] and [ENEMY.0.0.MAGE] *must* be re-evaluated constantly, bound objects *must* stay the same while a blocking action is executing.
My thought is to store the global IDs of bound objects in the Sender (and then reset them in ReleaseCurrentAction), but then we have to be aware we're evaluating an action and not a trigger, and also we must know the object number we're evaluating, so this involves passing a lot more parameters around. Bleh.
(When this is done, we can fix AttackReevaluate, which is meant to reevaluate the bound objects occasionally even when blocking.)