simplified workflow.hasError logic, closes #23