Хвост #2675. Миграция 141 нормализовала тип дома только в объявлениях; в самой
таблице домов camelCase-вокабуляр Циана остался, и каждый читатель чинил его у
себя. #2675 починил домовую оценку — остальные потребители продолжали сравнивать
'monolithBrick' с 'monolith_brick' и не совпадать.
Замер прода 2026-08-06 (GROUP BY source, house_type): monolithBrick 56 (48 derived
+ 8 cian_newbuilding) · other 18 · stalin 3 · aerocreteBlock 1 · gasSilicateBlock 1
· wireframe 1 · канон 984 · NULL 8440.
1. Миграция 224 — twin 141 для houses: monolithBrick→monolith_brick,
gasSilicateBlock/aerocreteBlock/foamConcreteBlock→block, stalin→brick.
Ожидаемо тронуто 61 строка (счётчики сняты на проде ДО применения).
Маппинг тождественен house_type_normalizer._RAW_TO_CANON — третьего словаря нет,
тест сторожит совпадение.
Перед склейкой проверено, что значения означают одно и то же: для каждого дома
взяты типы его же объявлений (уже нормализованных 141). У всех 56 monolithBrick
среди объявлений есть monolith_brick; stalin → brick; aerocreteBlock и
gasSilicateBlock → block. А вот 'other' (18) разбросан по monolith/brick/block —
это «неизвестно», а не материал, поэтому он и 'wireframe' НЕ трогаются.
2. Нормализация у источника. Живого писателя camelCase в houses нет: у всех 80
неканоничных строк одна и та же метка last_scraped_at 2026-05-24 14:04:20 —
единственный прогон backfill'а 063. Единственный живой писатель
houses.house_type — avito-каталог домов, и он был вторым источником неканона:
незнакомую подпись превращал в 'other'. Теперь ходит через общий
normalize_house_type, неизвестное → NULL (нейтрально для soft-penalty
эстиматора, в отличие от гарантированно несовпадающего 'other').
3. #2678 п.6: в карту нормализатора добавлен канонический токен monolith_brick —
единственный, у которого не было регистронезависимой страховки.
Refs #2678