async fn phase_states( pool: &PgPool, ) -> Result<HashMap<String, CreditRegistrationPhaseState>>
Every phase’s state in one read, so a tick costs one query rather than one per owned phase.