fix(tradein): oblast avito-sweep city-slug + Tier-2b geo-guard (R2, latent) #2500

Merged
bot-backend merged 1 commit from fix/tradein-scrapers-oblast into main 2026-07-12 19:42:31 +00:00
Collaborator

R2 MEDIUM ×2 (latent — oblast schedules disabled) — oblast scraper/matching

A. #2487 avito oblast-sweep мёртв на старте_parse_html хардкодил /ekaterinburg/ kept-slug → sweep вне-ЕКБ терял 100% выдачи. Fix: параметризован target_city_slug (default ekaterinburg → EKB байт-в-байт).

B. oblast bare-street мис-баскет в одноимённые ЕКБ-дома — Tier-2b матчил normalized_address без geo/city guard. Fix: coords → ST_DWithin(geom, 3000м); no-coords+city-token → self-disambiguating; иначе skip (→New house). + hardening _insert_alias (не перебивать fingerprint чужого дома). Live: Н.Тагил-карточка → дом за 121км заблокирован; локальный матч сохранён.

⚠️ Остаточный риск (задокументирован, вне scope): coord-less bare-алиасы (4932) мис-баккетятся на Tier-2a (fingerprint) ДО Tier-2b — Tier-2a нельзя скипать (это EKB Avito-дедуп). Полное закрытие = city-context в матчинг (high blast-radius). Guard закрывает coord-present путь. Флаг для решения ПЕРЕД включением oblast.

Тесты: 61 (serp+matching) + 183 sweep = 244 passed; ruff clean.

## R2 MEDIUM ×2 (latent — oblast schedules disabled) — oblast scraper/matching **A. #2487 avito oblast-sweep мёртв на старте** — `_parse_html` хардкодил `/ekaterinburg/` kept-slug → sweep вне-ЕКБ терял 100% выдачи. Fix: параметризован `target_city_slug` (default `ekaterinburg` → EKB байт-в-байт). **B. oblast bare-street мис-баскет в одноимённые ЕКБ-дома** — Tier-2b матчил `normalized_address` без geo/city guard. Fix: coords → `ST_DWithin(geom, 3000м)`; no-coords+city-token → self-disambiguating; иначе skip (→New house). + hardening `_insert_alias` (не перебивать fingerprint чужого дома). Live: Н.Тагил-карточка → дом за 121км **заблокирован**; локальный матч сохранён. ⚠️ **Остаточный риск (задокументирован, вне scope):** coord-less bare-алиасы (4932) мис-баккетятся на Tier-2a (fingerprint) ДО Tier-2b — Tier-2a нельзя скипать (это EKB Avito-дедуп). Полное закрытие = city-context в матчинг (high blast-radius). Guard закрывает coord-present путь. Флаг для решения ПЕРЕД включением oblast. Тесты: 61 (serp+matching) + 183 sweep = 244 passed; ruff clean.
bot-backend added 1 commit 2026-07-12 19:40:07 +00:00
fix(tradein/oblast): city-slug в avito SERP + geo/city guard в Tier-2b матчинга
All checks were successful
CI Trade-In / changes (pull_request) Successful in 12s
CI / changes (pull_request) Successful in 13s
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m3s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
bf4ce1ba36
#2487 avito oblast per-city sweep был dead-on-arrival: _parse_html дропал все
карточки без /ekaterinburg/ в source_url, поэтому oblast-sweep по городу вне ЕКБ
терял 100% выдачи. Kept-slug теперь параметризуется через AvitoScraper.target_city_slug
(дефолт "ekaterinburg" — ЕКБ-поведение неизменно), прокинут scheduler →
run_avito_city_sweep → AvitoScraper. avito_serp_ekb_only НЕ отключается.

Bug #2 (oblast bare-street mis-bucket): голые адреса 'ул. Ленина 100' в Н.Тагиле
мис-баккетились в одноимённые ЕКБ-дома через Tier-2b (match по глобально-уникальному
normalized_address без geo/city guard). Добавлен coarse-guard: coords present →
ST_DWithin ≤3км до geom дома; coords absent → требуется city-token (self-
disambiguating); иначе skip → консервативно New house вместо мис-матча. _insert_alias
при коллизии normalized_address больше не перебивает fingerprint чужого дома (иначе
guard деградировал бы в Tier-2a-дыру).

Оба дефекта латентные (oblast per-city schedules отключены) — правка делает
capability безопасной к включению, без влияния на прод сегодня.
bot-backend merged commit 51473fc841 into main 2026-07-12 19:42:31 +00:00
bot-backend deleted branch fix/tradein-scrapers-oblast 2026-07-12 19:42:31 +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#2500
No description provided.