[CRITICAL] tradein: гейт EKB-геокодера держится на списке из 37 городов — всё остальное считается Екатеринбургом #2582

Closed
opened 2026-07-31 14:02:35 +00:00 by lekss361 · 0 comments
Owner

Найдено веерным аудитом (эпик #2576), тремя лезвиями независимо, подтверждено живыми данными прода.

Суть

backend/app/services/geocoder.py:1177 (geocode), :1106 (suggest), предикат _names_non_ekb_city:206, список SVERDLOVSK_OBLAST_CITIES:105-152.

use_local_ekb = not _names_non_ekb_city(address) — любой населённый пункт, которого нет в списке из 37 имён, считается Екатеринбургом. Тогда EKB-only реестры (ekb_geoportal_buildings, _cadastral_house_match с жёстким readable_address ~* 'екатеринбург') отвечают первыми, до всех областных провайдеров. Маркер «Свердловская обл» здесь не смотрится вообще — в отличие от _has_oblast_marker.

⚠️ Это НЕ тот дефект, что чинится в #2580. Там гейт _has_oblast_marker (молчаливый префикс), здесь _names_non_ekb_city (выбор локальных тиров). Фикс #2580 эту дыру не закрывает.

Живое подтверждение на проде

В geocode_cache (393 строки provider='cache'):

  • «республика крым, ялта, ул. репина, 18с2» → «Репина, 2» @ 56.83/60.58 (Екатеринбург)
  • «челябинская обл., трёхгорный, ул. ленина, 15» → «Ленина, 15» @ 56.84/60.59
  • «свердловская обл., … пос. лёвиха, ул. карла маркса, 8» → «Карла Маркса, 8» @ 56.83/60.61

Плюс порча listings: лот «Ульяновская обл., Димитровград, ул. Менделеева, 11» лежит с координатами внутри Екатеринбурга.

Вред

«Реж / Арамиль / Лесной (исключён из списка намеренно) / Талица / Верхотурье / Волчанск / любое село, ул. Ленина, 5» → координаты Екатеринбурга, provider='cache', confidence='exact', город в адресе стёрт, результат записан в кэш — ошибка залипает. Дальше вся оценка по екатеринбургскому рынку: ~110-130 тыс ₽/м² вместо ~45-55 тыс.

Ни одна страховка не ловит: _geocode_is_coarse не срабатывает (номер дома есть), location_index считает себя в покрытии, аналогов много → уверенность high. В автодополнении на «Реж, Ленина 5» возвращается ровно одна подсказка — екатеринбургский кадастровый адрес.

Что сделать

Заменить принцип «список известных городов» на fail-closed: локальные екатеринбургские реестры используются только при явном подтверждении Екатеринбурга (маркер в адресе, переданный город, координаты в границах), а не «по умолчанию, если город не узнали». Плюс чистка отравленных записей geocode_cache и координат листингов с чужими городами.

Найдено веерным аудитом (эпик #2576), тремя лезвиями независимо, подтверждено **живыми данными прода**. ## Суть `backend/app/services/geocoder.py:1177` (`geocode`), `:1106` (`suggest`), предикат `_names_non_ekb_city:206`, список `SVERDLOVSK_OBLAST_CITIES:105-152`. `use_local_ekb = not _names_non_ekb_city(address)` — любой населённый пункт, **которого нет в списке из 37 имён**, считается Екатеринбургом. Тогда EKB-only реестры (`ekb_geoportal_buildings`, `_cadastral_house_match` с жёстким `readable_address ~* 'екатеринбург'`) отвечают **первыми**, до всех областных провайдеров. Маркер «Свердловская обл» здесь не смотрится вообще — в отличие от `_has_oblast_marker`. ⚠️ **Это НЕ тот дефект, что чинится в #2580.** Там гейт `_has_oblast_marker` (молчаливый префикс), здесь `_names_non_ekb_city` (выбор локальных тиров). Фикс #2580 эту дыру не закрывает. ## Живое подтверждение на проде В `geocode_cache` (393 строки `provider='cache'`): - «республика крым, **ялта**, ул. репина, 18с2» → «Репина, 2» @ 56.83/60.58 (Екатеринбург) - «челябинская обл., **трёхгорный**, ул. ленина, 15» → «Ленина, 15» @ 56.84/60.59 - «свердловская обл., … пос. **лёвиха**, ул. карла маркса, 8» → «Карла Маркса, 8» @ 56.83/60.61 Плюс порча `listings`: лот «Ульяновская обл., **Димитровград**, ул. Менделеева, 11» лежит с координатами внутри Екатеринбурга. ## Вред «Реж / Арамиль / Лесной (исключён из списка намеренно) / Талица / Верхотурье / Волчанск / любое село, ул. Ленина, 5» → координаты Екатеринбурга, `provider='cache'`, `confidence='exact'`, город в адресе стёрт, результат записан в кэш — **ошибка залипает**. Дальше вся оценка по екатеринбургскому рынку: ~110-130 тыс ₽/м² вместо ~45-55 тыс. Ни одна страховка не ловит: `_geocode_is_coarse` не срабатывает (номер дома есть), `location_index` считает себя в покрытии, аналогов много → уверенность high. В автодополнении на «Реж, Ленина 5» возвращается **ровно одна** подсказка — екатеринбургский кадастровый адрес. ## Что сделать Заменить принцип «список известных городов» на fail-closed: локальные екатеринбургские реестры используются **только** при явном подтверждении Екатеринбурга (маркер в адресе, переданный город, координаты в границах), а не «по умолчанию, если город не узнали». Плюс чистка отравленных записей `geocode_cache` и координат листингов с чужими городами.
Sign in to join this conversation.
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#2582
No description provided.