Check returns true if the given profile/action is still within its cooldown
window. A missing or unreadable state file is treated as "not on cooldown"
(fail-open: if checking fails, notifications are allowed through rather
than blocked, so a corrupt state file never silences alerts).