fix(tradein/geocoder): не подставлять Екатеринбург молча — явный city_hint (#2576) #2580
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2580
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-geocoder-city-default"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Эпик #2576, этап B. Самый опасный из тихих дефектов. Геокодер молча добавлял префикс
"Екатеринбург, {адрес}", если в тексте не было маркера города — а фронт город не передаёт вовсе. Житель Нижнего Тагила, вводя «Ленина, 1», получал координаты екатеринбургской улицы и оценку по чужому рынку с обычной уверенностью. Прецедент уже был: Тагил оценивался в 187 500 ₽/м² вместо реальных ~84 000.Решение: приоритет разрешения города — маркер в самом адресе → явный
city_hint→ ничего (вместо молчаливого Екатеринбурга). Запрос уходит без префикса города, а географический bias смещается сEKB_BBOXнаOBLAST66_VIEWBOX(вся область). Строку «Свердловская область, …» не подставляем: текстовому поиску она ничего не даёт (bbox уже задан), зато не порождает мусор вида «Екатеринбург, Нижний Тагил, Ленина 10».Честный признак неопределённости:
GeocodeResult.city_ambiguous— «город определил провайдер, а не пользователь», проставляется независимо от того, какой тир дал результат, и пробрасывается в ответ оценки какtarget_city_ambiguous. Поле эфемерное, миграции не требует.API:
city_hint— опциональный query-параметр на/lookupи/suggest, плюс поле во входе оценки. Контракт не сломан.ЕКБ не деградирует: при явном маркере города или переданном
city_hintповедение прежнее.Кэш: ключ становится
"{адрес}|city={hint}"только когда hint передан, иначе прежний — обратная совместимость сохранена. NB: пока фронт не шлётcity_hint, одинаковые адреса разных городов по-прежнему неразличимы по ключу — это структурное ограничение, снимается фронтовой частью. Рекомендована точечная чисткаgeocode_cache: записиprovider IN ('yandex','nominatim')с екатеринбургскимfull_address, где исходный адрес не содержал маркера города (аналог чистки 614 строк после #2504). Чистку не выполнял — отдельным шагом.Тесты: +23 (
test_geocoder_city_hint.py), на старом коде падают (ImportError: _cache_key). Полный прогон: 2849 passed, 1 pre-existing fail. ruff чисто.Следующий шаг (отдельный PR): фронт должен передавать город — до этого
city_ambiguousбудет истинным почти всегда для адресов без города в тексте. Это честно, но UI пока не использует флаг.