- httpx singleton: replace per-call AsyncClient with module-level singleton
using keepalive pool (configurable via env vars). Close client on shutdown.
- Scraper pagination: multi-page fetching (default 2 pages/60 ads, configurable
via SCRAPE_MAX_PAGES). Cursor-based early-stop to skip stale pages. Tracks
ads_cursor per keyword for cross-cycle deduplication.
- Notification retry queue: persistent notification_queue table with exponential
backoff (max 5 attempts → dead). Failed Telegram notifications are enqueued
instead of silently dropped. Queue processed at start of each scheduler cycle
(50 items max limit). /stats endpoint reports pending/dead counts.