We've had issues getting top level initialization correct. To make this simpler, we can create a way to declare initialization to be lazy (perhaps this becomes the default, but it may cause problems). We could use a new with lazy to start constant initialization as lazy.
To implement, we would put the initialization code (typically a function call) for a constant into its own routine. The constant would point to the function in the symbol table as the constant's initialization function. Then we enhance the GLOBAL_INIT_CHECK to call the initialization function when the check finds the constant to be uninitialized.
The main difficulty that I see here is with the translator. It does not currently do any initialization checks.