hook_form_alter isn't being called when node fails validation
Forms are cached in Drupal so the form is loaded once (where your form_alter runs) and then it's loaded from cache to be reloaded when there are validation errors.

You should use an #after_build callback, which always gets run.

Just remember to return $element in your #after_build callback or you'll be getting WSODs.