Query `pending` tasks with `run_at <= now()`. Mark as `running`, simulate execution, then `done`. Handle failures → `failed`.