upsertStockObservation dedup guard was preventing writes for unchanged stock data (e.g. ATGBICS all-OOS for 55d), causing v_scraper_health to mark sources as dead even when scrapers run normally. Skip dedup when last observation is >7 days old so health view stays current.