fix(tradein/cian): вернуть сбор вторички — sweep выбрасывал всё найденное #2880

Merged
lekss361 merged 1 commit from fix/tradein-cian-secondary into main 2026-08-15 13:44:23 +00:00
Owner

Как нашлось

Включил первый город области (#2879) и стал смотреть не на статус, а на данные. Прогон отработал зелёным, не сохранив ничего:

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 отброшены как вторичка, errors=0, статус done.

Причина

scraper_kit.orchestration.scheduler читает параметр с дефолтом True:

newbuilding_only=bool(params.get("newbuilding_only", True))

Сид 179 (волна 1) ставит false явно. Миграция 262 (волна 2) этот ключ потеряла.

Мера оценивает вторичкуestimator отбирает аналоги с listing_segment IS NULL OR = 'vtorichka'. Значит режим «только новостройки» для этих строк означает сбор в никуда: запросы к площадке идут, данные выбрасываются, мониторинг зелёный.

Побочная находка — та же дыра уже в проде

Под гейт попала 41 строка, а не 40. Лишняя — cian_city_sweep_verkhnyaya_pyshma из волны 1, включённая и работающая: миграция 179 проставила ключ не всем своим городам.

На живых данных:

Город Циан активных вторичка новостройки
Верхняя Пышма (ключа нет) 184 3 181
Первоуральск (ключ есть) 336 308

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

Summary

  • Дописывает "newbuilding_only": false в default_params 41 строки: 40 из волны 2 + Верхняя Пышма.
  • avito/yandex не трогаем — у них этого параметра нет ни в 179, ни в 262 (сверено по default_params на проде).
  • Идемпотентность: гейт NOT (default_params ? 'newbuilding_only') — ключ дописывается только там, где его нет. Повторный прогон — no-op, значение, выставленное оператором вручную позже, не перетрётся.

Test plan

  • Сухой прогон на боевой схеме: BEGINUPDATE 41ROLLBACK, ошибок нет
  • Список затрагиваемых строк выведен поимённо и проверен — лишняя строка не случайна, а найденный баг
  • Тесты миграций/манифеста/city_sweep: 354 passed
  • Post-deploy: перезапустить Новоуральск и убедиться, что dropped_secondary сменилось на реальные ins, а listings.city — «Новоуральск», а не «Екатеринбург»
  • Post-deploy: перезапустить Верхнюю Пышму и проверить рост вторички с 3

Вывод на будущее

done с errors=0 ничего не гарантирует: здесь он означал «успешно выбросили всё, что нашли». Проверять надо строки в базе, а не статус прогона.

## Как нашлось Включил первый город области (#2879) и стал смотреть не на статус, а на данные. Прогон отработал **зелёным, не сохранив ничего**: ``` 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 отброшены как вторичка, `errors=0`, статус `done`. ## Причина `scraper_kit.orchestration.scheduler` читает параметр с дефолтом **True**: ```python newbuilding_only=bool(params.get("newbuilding_only", True)) ``` Сид 179 (волна 1) ставит `false` явно. Миграция 262 (волна 2) этот ключ потеряла. Мера оценивает **вторичку** — `estimator` отбирает аналоги с `listing_segment IS NULL OR = 'vtorichka'`. Значит режим «только новостройки» для этих строк означает сбор в никуда: запросы к площадке идут, данные выбрасываются, мониторинг зелёный. ## Побочная находка — та же дыра уже в проде Под гейт попала **41 строка, а не 40**. Лишняя — `cian_city_sweep_verkhnyaya_pyshma` из волны 1, **включённая и работающая**: миграция 179 проставила ключ не всем своим городам. На живых данных: | Город | Циан активных | **вторичка** | новостройки | |---|---|---|---| | **Верхняя Пышма** (ключа нет) | 184 | **3** | 181 | | Первоуральск (ключ есть) | 336 | **308** | — | То есть оценщик по Верхней Пышме получал с Циана **3 пригодных объявления вместо ~300**. Сбор шёл, статус зелёный, данные молча терялись. Эта миграция чинит и её. ## Summary - Дописывает `"newbuilding_only": false` в `default_params` 41 строки: 40 из волны 2 + Верхняя Пышма. - **avito/yandex не трогаем** — у них этого параметра нет ни в 179, ни в 262 (сверено по `default_params` на проде). - Идемпотентность: гейт `NOT (default_params ? 'newbuilding_only')` — ключ дописывается только там, где его нет. Повторный прогон — no-op, значение, выставленное оператором вручную позже, не перетрётся. ## Test plan - [x] **Сухой прогон на боевой схеме**: `BEGIN` → `UPDATE 41` → `ROLLBACK`, ошибок нет - [x] Список затрагиваемых строк выведен поимённо и проверен — лишняя строка не случайна, а найденный баг - [x] Тесты миграций/манифеста/city_sweep: 354 passed - [ ] Post-deploy: перезапустить Новоуральск и убедиться, что `dropped_secondary` сменилось на реальные `ins`, а `listings.city` — «Новоуральск», а не «Екатеринбург» - [ ] Post-deploy: перезапустить Верхнюю Пышму и проверить рост вторички с 3 ## Вывод на будущее `done` с `errors=0` ничего не гарантирует: здесь он означал «успешно выбросили всё, что нашли». Проверять надо строки в базе, а не статус прогона.
lekss361 added 1 commit 2026-08-13 19:28:33 +00:00
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
96879f8fb4
Первый включённый город области отработал «успешно», не сохранив ничего:

  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.
lekss361 merged commit f3205d3ba1 into main 2026-08-15 13:44:23 +00:00
lekss361 deleted branch fix/tradein-cian-secondary 2026-08-15 13:44:24 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2880
No description provided.