gendesign/tradein-mvp/packages
bot-backend 19a335f4de fix(tradein/scraper-kit): бакет в done_buckets только если каждая фаза дала удачу (#3415)
cian_city_sweep 6179 (06.09) — `failed` по honest-status «фаза 'houses' отказала
полностью — 30 из 30», но все пять якорей записаны в counters.done_buckets.
Прогон 6276 (07.09) унаследовал точку, пропустил все якоря и отчитался `done` с
houses_attempted=0, lots_fetched=0 — зелёный по построению: фаза не исполнялась.
Из-за этого фикс #3396 (houses через пул прокси) простоял на проде сутки, ни разу
не отработав.

Корень: отметка «якорь пройден» опиралась на поток управления (исключение/таймаут
→ continue), а фаза отказывает и БЕЗ исключения — fetch_newbuilding возвращает
None, растёт только счётчик. _bucket_phase_totally_failed сверяет прирост пары
X_attempted/X_failed за якорь (та же конвенция, что у runs._phase_totally_failed,
но порог одна попытка, а не три: здесь решается «собирать ли заново», и цена
ошибок несимметрична).

Форма чекпоинта не менялась — плоский список имён якорей: его читают ещё три
свипа и scheduler._resume_decision, а ключ `bucket:phase` потребовал бы новых
читателей ради того же решения; резюм со старой точкой работает как прежде.

Тот же гейт — в run_avito_city_sweep (та же схема, отдельная функция; прод-следа
за 45 суток у него нет, у cian — 4 прогона). Ветка «houses DB query failed» теперь
растит houses_attempted вместе с houses_failed: пара attempted=0/failed=N не
видна ни run-level правилу, ни гейту бакета.

Соседи без правки: yandex combo-чекпоинт (единица пишется SERP-слоем до фазы,
пробел покрывает yandex_address_backfill, 0 прогонов на проде), domclick (одна
фаза), full-load'ы (бакет = SERP-страница, detail тянется из БД, не из бакета).

Closes #3415
2026-09-07 16:47:08 +05:00
..
scraper-kit fix(tradein/scraper-kit): бакет в done_buckets только если каждая фаза дала удачу (#3415) 2026-09-07 16:47:08 +05:00