always try to make progress; return last err