Очередь домовой IMV-оценки выбирает РОВНО ОДИН imv_status за прогон
(only_status, дефолт 'pending'). Повтор существовал только как значение этого
параметра — и за всю историю (41 прогон, 26.06–11.08) его не передал ни один
вызов. Дома, упавшие по инфраструктурной причине, которой больше нет (503/500
от браузерного сайдкара, #2698; за 7 суток до 12.08 в его access-логе 108 из
108 POST /fetch-json = 200), оставались в 'transient_error' навсегда: 1390 штук
на 12.08.2026, у всех есть и адрес, и параметры.
Что сделано:
1. Отдельная retry-очередь на половине пакета. Не OR к основной выборке: у
pending last_imv_attempt_at всегда NULL, поэтому при общем
ORDER BY ... NULLS FIRST повтор ждал бы опустошения pending (~5.7 тыс. домов
≈ год). Недобор retry-очереди возвращается pending — пакет не простаивает.
Явный only_status отключает автоповтор: ручной запрос оператора обрабатывает
ровно тот статус, который попросили, включая исчерпавшие лимит дома.
2. Выход из повтора — счётчик imv_transient_attempts (миграция 257), растёт
только на transient_error, обнуляется успехом, порог 3. Число из замера:
после починки сайдкара доля отказов на попытку 2/27 и 3/25 (прогоны
3708/3467) ≈ 10%, то есть порог стоит максимум ~115 слотов ВСЕГО. Статус не
переименовывается: «застряли окончательно» = transient_error AND
imv_transient_attempts >= 3.
3. Половина пакета отдана повтору не за счёт pending: дома, по которым запрос к
площадке невозможен, теперь помечаются no_params одним запросом до пакета
(тот же вердикт и те же строки причин, что у поштучного пути). На проде это
2276 домов из 6533 в очередях — 45 прогонов расписания (~136 суток) уходило
на то, чтобы поштучно выяснить то, что видно в SQL. До правки до площадки
доходили 17 домов из 50 (замер головы очереди 12.08), после — 50 из 50.
Пропускная способность (пакет 50 / 3 суток): pending 3218 + повтор 1039 после
премарка опустошаются за ~88 тактов (~264 суток) против 103 тактов (~309 суток)
на одном pending сейчас и «никогда» для 1390 застрявших.
Refs #2674