Авито 10.07-26.07.2026: 17 суток подряд без единой собранной страницы, TTL=10
снял за отрезок 9 033 строки. 1 270 из них потом вернулись живыми, как только
сбор восстановился (сверка listing_source_snapshots с текущим last_seen_at) —
задача прочитала «мы не смогли зайти» как «объявление снято».
Гейт меряет здоровье НЕ статусом прогона, а результатом: сколько строк источник
подтвердил свежими за 3 суток, по той же колонке (last_seen_at / scraped_at) и
тому же срезу source+segment, что и сам UPDATE. Статус не годится — оба других
провала для него невидимы: yandex 18.07-30.07 (13 суток, все прогоны 'done',
ноль 'banned', total_seen=0) и domklik 20.07-30.07, чей TTL 02.08 снял 6 131
строку разом.
Пороги посчитаны по ряду подтверждений из listing_source_snapshots и лежат между
максимумом провала и минимумом здоровых суток: avito 1500 (провал 0..970,
здоровье 3542..6079), yandex/cian 500, domklik 200. Миграция 219 кладёт их в
default_params, не затирая ручную настройку; страховочный дефолт в коде — 500.
Цена ошибки асимметрична (пропущенная деактивация чинится следующим прогоном,
ложная — только повторным сбором), поэтому при сомнении прогон пропускается.
Пропущенный прогон закрывается mark_done со счётчиками
{deactivated: 0, confirmations: N, skipped_unhealthy: 1} — ни одна строка не
тронута, статусы прогонов не менялись.
Тест test_gate_blocks_every_day_of_the_17_day_avito_ban проигрывает реальный
прод-ряд по дням: каждые сутки провала блокируются, здоровые — нет.
Refs #2659