Ran the math on the freshness gate, on a 30 min cadence it never opens, and right at the 22.5 minute boundary one missed scrape kills it. Bigger issue is customer_cost returning 0 for unavailable items, so an unavailable own_offer divides by zero, and the same bug stays quiet when a promo beats price plus fees, own_cost goes negative and you fire an undercut alert exactly when you're winning. Unavailable should just be None. Also repeat scrapes of one store share cache and session state so thats not real corroboration, and the hardcoded 0.15 threshold should come from per category economics