hook_form_alter() only firing after cache clear
I think your problem stands in cascading caching logic : your form must be called by something (a block, a template, a function...) that must be itself cached.

What you have to think about is "When, and by who, is my cache warmed up, with which conditions ?" : the most logical answer is that when your cache is created for the first time, conditions in your hook_form_alterare not TRUE.

For example, are you searching, in your alter, for infos coming from the session, or user roles, or static variables...

We could do more with your code :)