Колонка scrape_proxies.expires_at существовала, но acquire() её не читал
нигде. Когда аренда порта у провайдера заканчивается, он начинает отдавать
407 или просто рвать соединение, а пул продолжал выдавать такой узел. Каждый
запрос через него падал и классифицировался как ban_kind='infra', а 14 таких
из 20 в скользящем окне прерывают прогон добора. То есть один просроченный
порт ронял прогоны, пока человек вручную не заметит и не выключит узел.
Фильтр expires_at IS NULL OR expires_at > now() добавлен в обе ветки отбора —
основную по affinity и fallback. NULL означает «срок неизвестен» и выдаче не
мешает, отсекаются только реально просроченные. Время считает БД, не питон:
иначе рассинхрон часовых поясов.
Пропуск по сроку логируется предупреждением: оператору нужен явный сигнал
«порт просрочен», а не молчаливо сузившийся пул.