Task
Build `schedule_runner(jobs, current_hour)` β the dispatcher every cron-style scheduler runs each hour:
- `jobs` is a dict: `job_id (str) -> hour (int)`, hour β `[0, 23]`.
- `current_hour` is the wall-clock hour now.
- Return a list of `job_id`s whose scheduled hour equals `current_hour`, **sorted ascending by job_id** (deterministic order is critical for run logs).
- Empty dict β empty list.
- Invalid hour value in jobs (outside 0-23) β skip that job (defensive β the config table might have stale rows).