Future work¶
Known issues and improvements deliberately deferred from the 2026-07-13 correctness sweep (see Data corrections).
Reliability¶
- Connect timeouts are never retried.
httpx2.ConnectTimeoutis a subclass ofhttpx2.HTTPErrorbut not ofConnectError/NetworkError/ProtocolError, so_get_json(plugins/_base.py) classifies it asErrorCode.UNKNOWN, which is not in the client's retryable set — contradicting the documented retry policy, which promises that timeouts are retried. Fix: catchhttpx2.TimeoutExceptionfirst and map it toErrorCode.TIMEOUT. - Plugin-raised httpx timeouts are labeled NETWORK. In
client.py::_attempt_fetchtheexcept httpx2.HTTPErrorbranch catchesTimeoutExceptionbefore the generic handler that would classify it as TIMEOUT. Retryable either way; only logs/metrics are misattributed.
API key rotation¶
- Per-key daily quotas. The quota tracker is keyed by provider only;
every attempt on every key draws from one
max_requests_per_daybudget. Rotating keys to stretch quota would need a key dimension in the tracker and its SQLite schema. - Per-key doctor live checks.
omni-weather doctor --liveperforms one real fetch per provider; with a key list, rotation means a working fallback key passes the check. Probing each key individually would multiply live API calls and quota consumption, so it stays opt-in future work.
HTTP cache¶
CachingTransport._response_from_revalidationmutates the shared cache entry outside the lock; a concurrent reader between awaits can observe a half-updated entry.CachingTransportwithmax_entries=0would raiseStopIterationon the first store. Unreachable via config (cache_max_entriesisge=1), but worth a guard if the transport is ever constructed directly.
Providers¶
- OpenWeather hourly
is_dayis alwaysNone— hourly One Call entries carry no sunrise/sunset; it could be derived from the daily block. - Weatherbit imperial pressure —
slp/presare passed through unconverted forunits="I"; verify against Weatherbit's docs whether imperial responses switch pressure to inHg. - Weatherbit sea-level pressure plausibility — one stored run shows
slpup to 1074 hPa (implausible at sea level). Consider a provider-side plausibility filter or at least a data-quality flag inscripts/inspect_db.py.
Data model¶
- Condition vocabulary gaps: provider texts like "Patchy rain possible" or "Thundery outbreaks" map through generic keywords; a per-provider code table (e.g. WeatherAPI's numeric condition codes) would be more precise than text matching.