fix(tradein/cian): вернуть сбор вторички — sweep выбрасывал всё найденное
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m17s

Первый включённый город области отработал «успешно», не сохранив ничего:

  cian-sweep run_id=3884 anchor Новоуральск центр:
    SERP fetched=84  nb_kept=0  dropped_secondary=84  ins=0 upd=0
  done: anchors=1/1 lots=84 (ins=0/upd=0) errors=0

84 лота найдено, все 84 отброшены как вторичка, статус зелёный.

Причина: scheduler читает newbuilding_only с дефолтом True. Сид 179_ ставит
false явно, 262_ этот ключ потерял. Мера оценивает вторичку — estimator
отбирает аналоги с listing_segment IS NULL OR = 'vtorichka', — поэтому
режим «только новостройки» тут означает сбор в никуда.

Побочно нашлась та же дыра в ПРОДЕ: 179_ проставил ключ не всем своим
городам, и cian_city_sweep_verkhnyaya_pyshma всё это время работала в
режиме новостроек. На живых данных:

  Верхняя Пышма (ключа нет):  cian 184 активных → вторички   3, новостроек 181
  Первоуральск   (ключ есть): cian 336 активных → вторички 308

То есть оценщик по Верхней Пышме получал с Циана 3 объявления вместо ~300.

Правит 41 строку: 40 из wave 2 + Верхнюю Пышму. avito/yandex не трогаем —
у них этого параметра нет ни в одной волне.

Идемпотентность: гейт NOT (default_params ? 'newbuilding_only') — ключ
дописывается только там, где его нет, значение оператора не перетрётся.
Проверено сухим прогоном на боевой схеме: UPDATE 41, ROLLBACK.
This commit is contained in:
bot-backend 2026-08-13 22:28:01 +03:00
parent 01b5e73ea4
commit 96879f8fb4
2 changed files with 53 additions and 0 deletions

View file

@ -0,0 +1,52 @@
-- 263_scrape_schedules_wave2_cian_newbuilding_only_false.sql
-- Дописывает "newbuilding_only": false в default_params 40 cian-строк wave 2 (262_).
--
-- ПОЧЕМУ. Прогон первого включённого города области показал, что sweep отрабатывает
-- «успешно», но не сохраняет НИЧЕГО:
--
-- cian-sweep run_id=3884 anchor Новоуральск центр:
-- SERP fetched=84 nb_kept=0 dropped_secondary=84 ins=0 upd=0
-- cian-sweep run_id=3884 done: anchors=1/1 lots=84 (ins=0/upd=0) ... errors=0
--
-- 84 лота найдено и все 84 отброшено как вторичка, статус прогона при этом done.
--
-- Причина: scraper_kit.orchestration.scheduler (_job_cian_city_sweep) читает
-- newbuilding_only=bool(params.get("newbuilding_only", True))
-- то есть дефолт — True. Сид 179_ (wave 1) ключ проставляет явно (false), а 262_
-- (wave 2) его потерял. Мера оценивает ВТОРИЧКУ — estimator отбирает аналоги с
-- (listing_segment IS NULL OR listing_segment = 'vtorichka'), — поэтому режим
-- «только новостройки» для этих строк бессмыслен: сбор идёт, данные выбрасываются.
--
-- ЗАТРАГИВАЕТ ТОЛЬКО cian. У avito/yandex такого параметра нет ни в 179_, ни в 262_
-- (проверено сравнением default_params wave-1 и wave-2 на проде) — их не трогаем.
--
-- ПОБОЧНАЯ НАХОДКА: под гейт попадает 41 строка, а не 40. Лишняя —
-- `cian_city_sweep_verkhnyaya_pyshma` из wave 1, ВКЛЮЧЁННАЯ и работающая в проде:
-- 179_ проставил newbuilding_only не всем своим городам. Последствия на живых данных:
--
-- Верхняя Пышма (ключа нет): cian 184 активных → вторички 3, новостроек 181
-- Первоуральск (ключ есть): cian 336 активных → вторички 308
--
-- То есть по Верхней Пышме Циан давал оценщику 3 пригодных объявления вместо ~300 —
-- сбор шёл, статус зелёный, данные молча выбрасывались. Эта миграция чинит и её.
--
-- Идемпотентность: WHERE-гейт `NOT (default_params ? 'newbuilding_only')` — миграция
-- дописывает ключ только там, где его нет. Повторный прогон — no-op, и она никогда
-- не перезатрёт значение, выставленное позже вручную оператором.
--
-- ЗАВИСИМОСТИ: 262_ (сами строки), 052_scrape_schedules.sql (таблица).
BEGIN;
SET LOCAL lock_timeout = '5s';
UPDATE scrape_schedules
SET default_params = default_params || '{"newbuilding_only": false}'::jsonb,
updated_at = NOW()
WHERE source LIKE 'cian\_city\_sweep\_%'
AND default_params ? 'city'
AND NOT (default_params ? 'newbuilding_only');
COMMIT;

View file

@ -251,3 +251,4 @@
260_houses_drop_has_panorama.sql
261_listings_search_mv_drop_placeholder_columns.sql
262_scrape_schedules_seed_oblast_city_sweeps_wave2.sql
263_scrape_schedules_wave2_cian_newbuilding_only_false.sql