As it turn out, some code path do select the best block that's actually invalid, not it's child with the most proof of work.
To fix that problem, we delegate the responsability of finding such block to FindMostWorkChain and remove them from the candidate list.