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.
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.