pub async fn save_pin_state(
db: &Arc<RusqliteService>,
user_id: &str,
state: &PinState,
) -> Result<(), String>Expand description
Persist the counter state produced by super::pin::evaluate.
This is what makes a lockout survive a restart: the deadline is on disk, not in a process-lifetime counter that closing the app would clear.
TRACES: UR-083 | DR-268