fix(mera/b2c): житель Серова получал «вы вне области», а подсказки игнорировали выбранный город #2919
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2919
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/mera-city-parity"
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?
Два дефекта, найденных прогоном сценария глазами посетителя на живом домене.
1. Город предлагали выбрать, но отвечать по нему не умели
Дропдаун на сайте (
OBLAST_CITIES,city-registry.ts) и списки покрытия (COVERAGE_GREEN/YELLOW_CITIES,trade_in.py) — одно множество, записанное в двух местах. Разошлись в обе стороны:Житель Серова выбирал свой город из нашего дропдауна и получал:
Про город в той же самой области, который мы ему сами и предложили.
Серов при этом покрыт данными — 363 активных объявления в радиусе 15 км, все свежие (замер по проде). Поэтому он добавлен в жёлтый тир, а не убран из дропдауна; три недостающих города добавлены на фронт.
Шапка
city-registry.tsэтот риск прямо предсказывала:Теперь тест есть: бэкендовый сьют читает TS-реестр и требует равенства множеств. Плюс проверка, что у каждого города с порогом есть центроид — иначе порог мёртвый, город по координатам не резолвится вовсе.
2. Подсказки не слушались выбранного города
city_hintдоезжает до геокодера, но на выдачу не влияет: его смотрит только екатеринбургский кадастровый тир (как признак «речь не про ЕКБ, тир пропускаем»), а DaData-тир ограничен регионом целиком и хинта не принимает.Замер на проде — выбран Серов, введено «Ленина 1»:
Человек выбирает верхний вариант и считает чужой дом — ровно баг #2576, ради которого город и спрашивают.
Публичная ручка теперь подставляет город в саму строку запроса. С ним выдача становится серовской целиком:
Для Екатеринбурга подстановка безвредна — три разных адреса дали тот же результат с префиксом и без, поэтому правило одно на все города, без исключения для основного трафика (исключение пришлось бы поддерживать).
Чинится в публичной ручке, а не в геокодере: там от
city_hintзависит поведение закрытого контура (target_city_ambiguous), и менять его смысл ради публичной формы значит трогать чужой контракт.Фикстура теста
_FAR_AWAY_CITYстояла в 21 км от центра Серова и работала как «далеко от всех центроидов» лишь потому, что Серов не был поддержан. Переехала в Тавду — 271 км до ближайшего центроида, всё ещё Свердловская область.Проверено
backend 75 passed,
vitest56 passed,tsc,next lint,next build, isolation guard 41 файл.city-registry.tsдобавлен в paths-фильтр бэкендового лэйна: сверку списков делает бэкендовый тест, и без этой строки правка одного лишь дропдауна её бы не запускала — то есть ровно тем путём, которым списки и разошлись.