Class B (дашборд покрытия / matching, НЕ valuation — estimator их пока не читает,
follow-up #2012): cian SERP теперь промоутит kitchen_area_m2 + mortgage_available и
новые колонки is_apartments / is_rosreestr_checked из карточки в listings (раньше
лежали только в raw_payload). Проведены через save_listings обоими upsert-путями
(ON CONFLICT EXCLUDED + reconcile UPDATE) через COALESCE — re-scrape источника без
поля не затирает значение.
Class A: house_type нормализуется через общий house_type_normalizer — cian
materialType (monolithBrick / gasSilicateBlock / stalin / ...) != каноничному enum
→ estimator soft-penalty ложно штрафовал аналог. Сырой materialType сохраняется в
raw_payload['raw_material_type']. Backfill старых cian-строк — миграция 141
(idempotent, scope source='cian', только мапимые camelCase токены).