feat(etl): housing-class normalization fallback via yandex_realty trigram match (#38)
kn-API не отдаёт obj_class для ~3032 ЖК Свердл, что ломает per-class
velocity/absorption/weight. Добавлен fallback:
- 169_obj_class_fallback.sql: obj_class_fallback + obj_class_source колонки,
pg_trgm + GIN trgm индексы на LOWER(comm_name) и LOWER(yandex_realty_zk.name).
- app/services/etl/obj_class_backfill.py: trigram-match comm_name ↔
yandex_realty_zk.name (similarity >= 0.6, CROSS JOIN LATERAL) →
obj_class_source='yandex_match'; price-inference по
yandex_realty_class_prices → 'price_inference'. Idempotent, SAVEPOINT per row.
- Консьюмеры (analytics_queries / velocity / competitors): класс-фильтр и
dominant_class читают COALESCE(obj_class, obj_class_fallback) — реальный
класс в приоритете, поведение для размеченных ЖК не меняется.
Внутренний backfill — response-схема (parcel.py / OpenAPI) не меняется.
Refs #38