Logic cleanup - global FirstRun replaced by SetupFrame.is_complete