fix(tradein/geocoder): fail-closed выбор ЕКБ-реестров вместо списка городов (#2582) #2589
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#2589
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-geocoder-fail-closed"
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?
Closes #2582. Второй критический дефект аудита — выбор екатеринбургских справочников держался на списке из 37 названий: всё, чего в списке нет, молча считалось Екатеринбургом.
Подтверждено живыми данными прода: в кэше геокодера лежали «Ялта», «Трёхгорный» (Челябинская обл.) и посёлок Лёвиха с координатами Екатеринбурга, все с пометкой «точно».
Решение — два независимых механизма вместо перечисления городов
Новый
_ekb_local_tiers_allowed(address, city_hint), три сигнала по ИЛИ, каждый способен закрыть доступ к екатеринбургским реестрам:city_hint(пришло из #2580);_names_unrecognized_locality(): структурный признак топонима («обл.», «область», «край», «республика», «г.», «пос.», «с.») в тексте.Третий механизм и закрывает корень: он ловит любой чужой топоним, не требуя знать его по имени. Именно поэтому Ялта и Трёхгорный больше не попадут в екатеринбургский реестр, хотя их в списке нет и не будет.
Признак «д.» намеренно не включён — это сокращение дома («ул. Ленина, д. 5»), его включение закрыло бы гейт почти на каждом адресе.
Ключевое различение
«Город не назван вообще» (адрес «Малышева 30» — основной трафик формы) → доступ открыт, Екатеринбург как рабочая гипотеза. «Назван незнакомый город» → закрыто. Раньше оба случая трактовались одинаково — отсюда и дефект.
Слияние с уже влитым #2580
Оба конфликта были в одном месте — гейте
use_local_ekb. Логика сведена в один хелпер, оба вызывающих места передают хинт вторым аргументом без дублирования условия. Все четыре ветки проверены тестами (хинт с чужим городом / незнакомый топоним / ничего не названо / явныйcity_hint="Екатеринбург"); на последнюю добавлен интеграционный тест — она не была покрыта ни одним из наборов.Задокументирован унаследованный компромисс: поскольку это ИЛИ, а не приоритетная цепочка, хинт, противоречащий явному «Екатеринбург» в тексте, всё равно закроет гейт. Семантика #2580 не расширялась и не сужалась.
Проверки
Оба набора тестов зелёные одновременно: 148 passed по трём файлам геокодера. Полный прогон — 2914 passed, 1 pre-existing. Доказательство до слияния: откат только рабочего кода → падают 6 тестов на Ялту/Трёхгорный/Лёвиху/Реж, при этом 3 екатеринбургских проходят и на старом коде.
Известное ограничение: незнакомый город без всяких приставок («Реж, Ленина 5» без «Свердловская обл.») по-прежнему уйдёт в Екатеринбург — осознанный компромисс, иначе сломался бы основной сценарий ввода без города. Все реальные испорченные записи из прода содержали региональную приставку.