feat(tradein/matching): region_code у houses — вывод, а не выдумка (#3051 п.4) #3121

Merged
bot-backend merged 1 commit from feat/3051-houses-region-code into main 2026-08-27 09:01:09 +00:00
Collaborator

Шард п.4 части 1/3 «Москвы» (#3051, эпик #2989). Разблокирует p1 #3052 (гард по полигону требует region_code у houses).

Замер перед правкой (Poincare, 27.08)

10 362 дома: 9 719 выводятся геометрией в регион 66 · 620 без geom · 23 порченых — ЕКБ-адреса с чужими координатами и живыми ссылками листингов: «Вильгельма де Геннина» на Байкале (4 ссылки), «Учителей» в Таллине (114), «Кронштадская» в Питере (38), и 3 дома с координатами в bbox Москвы — тоже порча («Крауля, гп 1», «Академика Ландау»), не московские дома.

Правило: регион выводится или NULL — никогда не выдумывается

Миграция 272 (гейт lock_timeout пройден, идемпотентна): колонка + бэкфилл region_code=66 только по bbox региона 66 — значения байт-в-байт из реестра #3116, синхронизацию SQL↔реестр держит тест. 77 на бэкфилле не присваивается вообще. Карантин NULL: 620 безгеомных + 23 порченых. NOT NULL из постановки — отдельной миграцией, когда карантин опустеет (иначе ограничение заставит выдумывать).

Запись (base.py → контракт → адаптер → matching/houses.py): новый дом наследует регион РАЗВЁРТКИ (тот же region_code, что уходит в listings.region_code), только если координаты не противоречат:

  • координаты подтверждают или отсутствуют → наследуем;
  • координаты выводят ДРУГОЙ регион (прод-кейс «Крауля» под Москвой) → NULL-карантин + warning;
  • вне-bbox координаты при живой развёртке → наследуем её регион (адрес и развёртка согласны, координатам веры нет) — семантика закреплена тестом, чтобы смена была осознанной;
  • легаси-вызов без региона → NULL.

Матчинг-ЗАПРОСЫ не тронуты — гард по региону это #3052.

Проверки

  • test_3051_houses_region_code.py (6): синхронизация bbox миграции с реестром + nullable-форма DDL; наследование/карантин/легаси/вне-bbox на реальном match_or_create_house (fake-db, тиры промахиваются). На main: 5 красных (нового параметра нет), 1 зелёный (форма миграции)
  • окрестности: 288 matching/parity/adapter + 297 registry/services — зелёные

Приёмка после деплоя: region_code=66 у ~9 719, NULL у ~643; warning в логах при первом же порченом геокоде.

🤖 Generated with Claude Code

Шард п.4 части 1/3 «Москвы» (#3051, эпик #2989). Разблокирует p1 #3052 (гард по полигону требует `region_code` у houses). ## Замер перед правкой (Poincare, 27.08) 10 362 дома: **9 719** выводятся геометрией в регион 66 · **620** без geom · **23 порченых** — ЕКБ-адреса с чужими координатами и живыми ссылками листингов: «Вильгельма де Геннина» на Байкале (4 ссылки), «Учителей» в Таллине (114), «Кронштадская» в Питере (38), и **3 дома с координатами в bbox Москвы** — тоже порча («Крауля, гп 1», «Академика Ландау»), не московские дома. ## Правило: регион выводится или NULL — никогда не выдумывается **Миграция 272** (гейт lock_timeout пройден, идемпотентна): колонка + бэкфилл `region_code=66` только по bbox региона 66 — значения байт-в-байт из реестра #3116, синхронизацию SQL↔реестр держит тест. 77 на бэкфилле не присваивается вообще. Карантин NULL: 620 безгеомных + 23 порченых. `NOT NULL` из постановки — отдельной миграцией, когда карантин опустеет (иначе ограничение заставит выдумывать). **Запись** (`base.py` → контракт → адаптер → `matching/houses.py`): новый дом наследует регион РАЗВЁРТКИ (тот же `region_code`, что уходит в `listings.region_code`), только если координаты не противоречат: - координаты подтверждают или отсутствуют → наследуем; - координаты выводят ДРУГОЙ регион (прод-кейс «Крауля» под Москвой) → **NULL-карантин + warning**; - вне-bbox координаты при живой развёртке → наследуем её регион (адрес и развёртка согласны, координатам веры нет) — семантика закреплена тестом, чтобы смена была осознанной; - легаси-вызов без региона → NULL. Матчинг-ЗАПРОСЫ не тронуты — гард по региону это #3052. ## Проверки - `test_3051_houses_region_code.py` (6): синхронизация bbox миграции с реестром + nullable-форма DDL; наследование/карантин/легаси/вне-bbox на реальном `match_or_create_house` (fake-db, тиры промахиваются). На main: 5 красных (нового параметра нет), 1 зелёный (форма миграции) - окрестности: 288 matching/parity/adapter + 297 registry/services — зелёные Приёмка после деплоя: `region_code=66` у ~9 719, NULL у ~643; warning в логах при первом же порченом геокоде. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bot-backend added 1 commit 2026-08-27 08:52:17 +00:00
feat(tradein/matching): region_code у houses — вывод, а не выдумка (#3051 п.4)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m32s
27fdd55aae
Миграция 272: колонка + бэкфилл ТОЛЬКО по bbox региона 66 (значения
байт-в-байт из реестра, синхронизацию держит тест). Карантин NULL:
620 домов без geom, 23 порченых (ЕКБ-адреса с чужими координатами —
«Вильгельма де Геннина» на Байкале, «Крауля» под Москвой, «Учителей» в
Таллине, с живыми ссылками листингов) — им регион не присваивается,
включая 3 дома с координатами в bbox Москвы (порча, не переезд). NOT NULL
из постановки — отдельной миграцией, когда карантин опустеет.

Запись: новый дом наследует регион РАЗВЁРТКИ (base.py → контракт →
адаптер → matching), только если координаты не противоречат; координаты
другого региона → NULL-карантин + warning. Вне-bbox координаты при живой
развёртке наследуют её регион (адрес и развёртка согласны, координатам
веры нет) — семантика закреплена тестом, чтобы смена была осознанной.

Матчинг-запросы НЕ тронуты — гард по региону это #3052.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit c6c934fb99 into main 2026-08-27 09:01:09 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3121
No description provided.