geocode_deals_from_houses строил карту центроидов по ВСЕМ houses без фильтра
региона, а ключом было голое имя улицы. По Свердловской области это безвредно
(скрипт жил ЕКБ-only, с хардкодом ^екатеринбург$), по Московской — тихая
катастрофа: «Ленина» / «Центральная» / «Луговая» есть почти в каждом из ~970
НП области, дома со всех одноимённых улиц слипались бы в одно ведро, а среднее
их координат — правдоподобная точка ПОСЕРЕДИНЕ между городами.
- ключ join'а = (region_code, населённый пункт, улица); НП разбирается по типу
(«г Химки», «д Сабурово») или по реестру REGIONS[rc].cities, плюс позиционный
fallback под формат deals.address по области («Сабурово, Луговая»);
у deals НП берётся из колонки city (заполнена на 100%).
- фильтр региона в выборке кандидатов, в карте центроидов и в UPDATE;
houses.region_code IS NULL принимается по bbox_region реестра, deals.region_code
IS NULL — только для 66 (строки до миграции 177 по построению екатеринбургские).
- sanity-чек разброса: ведро, где дом отстоит от центроида дальше --max-spread-km
(5 км), выбрасывается — это склейка нескольких НП, а не улица.
- пустой НП у региона без города-ядра (50) → ключа нет; подставлять «Красногорск»
нельзя, это та же ловушка уровнем выше.
geocoder: регион 50 получил маркер state «московская» (не «москва» — иначе
результат внутри города Москвы, который щедрый bbox_region области накрывает
целиком, принимался бы за областной), имя региона DaData «Московская» и запрет
dual-query с суффиксом главного города (Region.has_city_core=False).