fix(tradein/geocoder): раз-хардкод геокодера/DaData на всю Свердловскую обл. (region 66) #2484

Merged
lekss361 merged 1 commit from fix/tradein-oblast-f-geocoder into main 2026-07-12 15:35:28 +00:00
Owner

Что

Геокодер был жёстко EKB-bound и выбрасывал корректные non-EKB геокоды (bbox-accept-фильтры отбрасывали Нижний Тагил/Серов и т.д.) → блокировал оценку любого адреса области. Foundation-шаг расширения Mera на region 66.

Изменения

  • OBLAST66_BBOX + is_within_oblast66_bbox (строгий superset EKB-tight — EKB не затронут); EKB Yandex Tier1/2 fast-path (bounded/rspn/ll+spn) сохранён.
  • Все accept-фильтры (Yandex/Nominatim forward+suggest, geocode() accept+typo) → oblast-66.
  • City-prefix инъекция по word-boundary _has_oblast_marker (не substring) + district-prefix lookback: EKB-улицы Серова 27/Ирбитская 5/Асбестовский пер. и др. больше не роняют Екатеринбург,-префикс (был silent wrong-city → wrong-price баг).
  • Two-pass tie-break в accept-циклах (_yandex_lookup top-5, _nominatim_query): tight-EKB кандидат приоритетнее oblast-rank0 → EKB-результат идентичен прежнему.
  • Region cross-check (Nominatim address.state / Yandex AdministrativeAreaName) отсекает соседние области (Тюмень 57.15/65.53 и др. — canonical must-reject); bbox-fallback когда region отсутствует.
  • DaData suggest: region-параметр («Свердловская область», hard-filter вместо city-only); убран no-op restrict_value.
  • /suggest endpoint + geocoder docstrings → oblast-66.

Тесты (+26)

OBLAST66 ⊇ TIGHT, far-town accept (Ивдель/Серов/Тавда/Красноуфимск), Тюмень reject, _has_oblast_marker +/- (incl. street-collision), tie-break (MockTransport), DaData region body shape.

Проверка

  • Полный tradein backend suite: 2389 passed, 0 failed (mirror CI). ruff clean.
  • deep-code-review: ⚠️ changes requested → все findings (🟠 marker-collision + 🟡 tie-break/region/restrict_value/tests) устранены в этом PR.

Разблокирует A2 (геокодинг +47k non-EKB сделок) и live-оценку адресов области. A1 (ingest) уже смержен+задеплоен.

## Что Геокодер был жёстко EKB-bound и **выбрасывал корректные non-EKB геокоды** (bbox-accept-фильтры отбрасывали Нижний Тагил/Серов и т.д.) → блокировал оценку любого адреса области. Foundation-шаг расширения Mera на region 66. ## Изменения - `OBLAST66_BBOX` + `is_within_oblast66_bbox` (строгий superset EKB-tight — EKB не затронут); EKB Yandex Tier1/2 fast-path (bounded/rspn/ll+spn) сохранён. - Все accept-фильтры (Yandex/Nominatim forward+suggest, `geocode()` accept+typo) → oblast-66. - City-prefix инъекция по **word-boundary** `_has_oblast_marker` (не substring) + district-prefix lookback: EKB-улицы `Серова 27`/`Ирбитская 5`/`Асбестовский пер.` и др. больше не роняют `Екатеринбург,`-префикс (был silent wrong-city → wrong-price баг). - **Two-pass tie-break** в accept-циклах (`_yandex_lookup` top-5, `_nominatim_query`): tight-EKB кандидат приоритетнее oblast-rank0 → EKB-результат **идентичен** прежнему. - **Region cross-check** (Nominatim `address.state` / Yandex `AdministrativeAreaName`) отсекает соседние области (Тюмень 57.15/65.53 и др. — canonical must-reject); bbox-fallback когда region отсутствует. - DaData suggest: `region`-параметр («Свердловская область», hard-filter вместо city-only); убран no-op `restrict_value`. - `/suggest` endpoint + geocoder docstrings → oblast-66. ## Тесты (+26) OBLAST66 ⊇ TIGHT, far-town accept (Ивдель/Серов/Тавда/Красноуфимск), Тюмень reject, `_has_oblast_marker` +/- (incl. street-collision), tie-break (MockTransport), DaData region body shape. ## Проверка - Полный tradein backend suite: 2389 passed, 0 failed (mirror CI). ruff clean. - deep-code-review: ⚠️ changes requested → все findings (🟠 marker-collision + 🟡 tie-break/region/restrict_value/tests) устранены в этом PR. Разблокирует A2 (геокодинг +47k non-EKB сделок) и live-оценку адресов области. A1 (ingest) уже смержен+задеплоен.
lekss361 added 1 commit 2026-07-12 15:33:31 +00:00
fix(tradein/geocoder): раз-хардкод геокодера/DaData на всю Свердловскую обл. (region 66)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 50s
CI Trade-In / changes (pull_request) Successful in 8s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
c0cbdc2f99
Геокодер был жёстко EKB-bound и ВЫБРАСЫВАЛ корректные non-EKB геокоды (bbox-accept-фильтры) → блокировал оценку любого адреса области. Обобщено до region-66.

- OBLAST66_BBOX + is_within_oblast66_bbox (superset EKB-tight, EKB не затронут); EKB Yandex Tier1/2 fast-path сохранён.
- Все accept-фильтры (Yandex/Nominatim forward+suggest, geocode() accept+typo) → oblast-66.
- City-prefix по word-boundary _has_oblast_marker (не substring): EKB-улицы 'Серова 27'/'Ирбитская 5' и др. больше не роняют 'Екатеринбург,'-префикс (был silent wrong-city баг).
- Two-pass tie-break в accept-циклах: tight-EKB кандидат приоритетнее → EKB-результат идентичен прежнему.
- Region cross-check (Nominatim address.state / Yandex AdministrativeAreaName) отсекает соседние области (Тюмень и др.); bbox-fallback когда region отсутствует.
- DaData suggest: region-параметр (hard-filter), убран no-op restrict_value.
- +26 тестов: OBLAST66 superset TIGHT, far-town accept, Тюмень reject, marker +/- (street-collision), DaData region body.

Foundation для A2 (геокодинг non-EKB сделок) и live-оценки адресов области.
lekss361 merged commit 51952ebd70 into main 2026-07-12 15:35:28 +00:00
lekss361 deleted branch fix/tradein-oblast-f-geocoder 2026-07-12 15:35:28 +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#2484
No description provided.