fix(tradein/scraper): прогон, у которого отказал каждый якорь, перестаёт быть успехом (#2625) #2813

Merged
bot-backend merged 1 commit from fix/2625-run-that-did-nothing into main 2026-08-10 09:36:24 +00:00

1 commit

Author SHA1 Message Date
7c8ecaaf2d fix(tradein/scraper): прогон, у которого отказал каждый якорь, перестаёт быть успехом (#2625)
All checks were successful
CI Trade-In / backend-tests (pull_request) Successful in 3m51s
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 7s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
Основную часть задачи закрыл #2642 (капча Циана / заглушки Яндекса → banned).
Замер прода 2026-08-10 подтверждает симптом: развёртки cian/yandex со статусом
'done' и нулём — 42 из 89 до деплоя #2642 (04.08 19:00 UTC), 1 из 30 после.

Оставшийся один — прогон 3557 (yandex_city_sweep_pervouralsk, 09.08 17:11):
155 мс, anchors_total=1, errors_count=1, lots_fetched=0, статус 'done'. За 90
суток под тот же признак попадают 28 прогонов, включая 16 суток подряд
yandex_city_sweep_nizhniy_tagil (15-30.07), каждый ровно 240 с — таймаут якоря.

Детект #2642 их не видит и правильно не видит: он считает попытки РАЗБОРА, а
transport_error туда намеренно не попадает (#2600 п.1 — «наш прокси сдох» не
должно выглядеть баном площадки). Якорь, упавший до первого разобранного
ответа, даёт attempts=0, условие «attempts>0 и все провалились» молчит.

То есть третий исход существовал без терминального статуса:
  площадка отбила       → banned (#2642)
  площадка честно пуста → done   (здоровый ответ, сохранён)
  мы не дошли           → ???    → done   ← дефект

Признак — собственная бухгалтерия прогона, не список антибот-маркеров:
errors_count >= anchors_total при ИЗМЕРЕННОМ нуле. Доказывает: каждый якорь
кончился отказом и собрано ноль. НЕ доказывает, кто виноват — поэтому 'failed'
без ban_kind, а не 'banned'/'platform' (#2764).

Страж стоит в mark_done, а не в каждом sweep'е: у финализатора четыре десятка
вызывающих, и сторож, который надо не забыть позвать, — это тот же дефект
оборванной проводки, из-за которого задача и появилась.

Ложной тревоги нет (замер, 90 суток): 132 прогона с отказами, но ненулевым
сбором, и 37 прогонов честной пустоты (errors_count=0) остаются 'done'.
2026-08-10 14:30:35 +05:00