feat(tradein/geo): реестр регионов — единственный источник гео-границ (#3051, шард 1a) #3116
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
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3116
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/3051-region-registry"
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?
Шард 1a части 1/3 «Москвы» (#3051, эпик #2989): реестр + вывод литералов из трёх файлов + покрытие точки Москвы.
Что
Новый
app/services/regions.py(лист дерева импортов): per-регионbbox_tight/wide/region/product_core, города,city_token, набор доступных тиров обогащения,region_for_point/region_by_city/unsupported_tier_reason.Потребители переведены на реестр, прежние имена остались алиасами на ОБЪЕКТЫ реестра (identity закреплена тестом — копии, разъезжающиеся при следующей правке, невозможны по построению):
location_index.py_EKB_BBOX_*литералы +_in_ekb_bbox_covered_region()по реестру; SQL-медианы считаются в ядре региона ТОЧКИgeocoder.pyEKB_BBOX_TIGHT/WIDE,OBLAST66_BBOX,SVERDLOVSK_OBLAST_CITIESлитераламиREGIONS[66]matching/normalize.pyEKB_CITY_TOKEN = "екатеринбург"REGIONS[66].city_token;_CITY_TOKENSНЕ тронут намеренно — это зеркало sweep-раскатки (CITY_ANCHORS пайплайна), другой концернГарантии
out_of_coverageв обеих эрах.55.75/37.62больше неout_of_coverage— регион 77 узнан, счёт идёт в его ядре; при сегодняшнем нуле московских листингов итог — честныйinsufficient_data(это правильнее буквального «ok» из приёмки: ok без данных был бы враньём).enrichment_tiers = frozenset()— не заглушка, а факт с готовой формулировкойunsupported_tier_reasonдля потребителей (вайринг в estimator — следующим шардом, вместе с п.5).Проверки
test_3051_region_registry.py(9): вложенность bbox'ов, непересечение регионов, байт-в-байт 66, identity алиасов, Москва-точка (красный на main по значению:out_of_coverage≠insufficient_data), инварианты ЕКБ/Перми, ё-фолд городов, громкая деградация тировНе здесь (следующие шарды #3051)
п.2
city_fias_idсквозняком · п.3doc_typeв deals · п.4region_code NOT NULLу houses · п.5 депромоут не-ЕКБ описаний + вайринг деградации в estimator · п.6 параметры загрузчиков. Kit-копияscraper_kit/geo.pyне тронута: скраперы собирают только 66, Москва поедет FDW-путём (#3053).🤖 Generated with Claude Code
CI Trade-In / backend-tests красный — причина найдена
Упал существующий тест, а не новый.
tests/services/test_location_index.pyзовёт функцию, которую этот PR переименовал:Остальные семь проверок зелёные — падает только этот джоб.
Просьба при починке: не удалять покрытие
Быстрый путь — снести устаревшие строки, но они проверяют вещи, которые стоит сохранить и на новом API:
(56.70, 60.50)— угловая точка bbox. Проверяет, что границы включающие. При переходе наis_within_bboxэто ровно то место, где легко получить<вместо<=и молча потерять полосу по краю охвата.(57.910, 59.970)— точка вне охвата. Проверяет, что за пределами ядра возвращается «не покрыто». Сейчас это тем важнее: по описанию PR точка Москвы теперь попадает в покрытие региона 77, и граница между «не покрыто» и «покрыто, но данных нет» стала содержательной.Логично переписать их на
_covered_region(...) is None/is not None— тогда проверяется тот же инвариант, но уже через новый вход.Что проверил со своей стороны
Главное заявление PR подтверждается:
bbox_product_core=(56.70, 56.95, 60.50, 60.75)у региона 66 байт-в-байт равен прежним литераламlocation_index(SOUTH=56.70, NORTH=56.95, WEST=60.50, EAST=60.75). Для Екатеринбурга поведение не меняется — а это и был главный риск такого рефакторинга.Смена поведения для Москвы (
insufficient_dataвместоout_of_coverage) в описании заявлена явно, так что она читается как решение, а не как побочный эффект.В саму ветку не лезу, чтобы не столкнуться с твоей сессией — правка на минуту.