newbuilding_enrich восемь суток подряд делал 25 попыток, обогащал ноль записей
и каждый раз закрывался статусом 'done'. Отказ происходит на разборе:
initialState в полученной странице нет. Двух объяснений — изменилась разметка
или пришла защитная заглушка — по логу было не различить: ни размера ответа,
ни признаков защиты в нём не было.
Разделяет их одно число. Здоровая ЖК-карточка весит 1.17 МБ и содержит
состояние (verified live 2026-06-15), а страница без состояния — подпись
антибота (#972). Поэтому строка отказа теперь несёт html_len и перечисление
найденных маркеров защиты (_describe_parse_miss). Это диагностика, не диагноз:
функция называет найденное и не называет причину.
Разбор НЕ чинится: пока неизвестно, что приходит, любая правка разбора —
угадывание.
Статус прогона уходит в общий финализатор runs.mark_backfill_finished (#2695),
через который эта задача не проходила: счётчики задачи называются иначе, чем
читает финализатор, поэтому любой прогон закрывался mark_done.
to_backfill_counters() добавляет attempted/enriched/failed к своим счётчикам.
attempted не включает пропущенные уже-обогащённые дома — прогон, которому
нечего делать, отказом не является. Блоки источника задача не считает вовсе,
так что нулевой прогон помечается 'failed' (наш тракт), а не 'banned': вины
площадки здесь не доказано (#2764).
Refs #2767