Прод-инцидент у первого заказчика: студия 23.1 м² в Екатеринбурге
(ул Академика Парина, 46/5) получала экран «НЕДОСТАТОЧНО ДАННЫХ».
Корневая причина — в UI не было варианта «Студия», и студия схлопывалась
в rooms=1 (initRoomsLabel). Оценщик ищет аналоги строгим совпадением
комнатности → в радиусе 2 км нашлось 4 объявления вместо 327 доступных
студий (rooms=0), после чего гейт #oblast-E подавил медиану.
Тот же адрес с rooms=0 даёт 34 аналога и медиану 3 765 452 ₽.
Что сделано:
- «Студия» добавлена в выбор комнатности, маппинг rooms=0 в обе стороны.
- Каскад послаблений при нехватке аналогов: комнатность (студия↔1-комн,
иначе ±1) → свежесть 14→60 дней → новостройки → радиус 3/5 км.
Каждый шаг только при n<5, применённые послабления отдаются наружу
в relaxations и показываются пользователю.
- Медиана больше не обнуляется. Правило выбора headline:
n>=5 → объявления; тонкая выборка + живой коридор ДКП → сделки
(сохраняет смысл #oblast-E); тонкая без коридора → реальная медиана
по объявлениям. «Недостаточно данных» — только при реальном нуле.
- Новые поля ответа relaxations / reliability (ok|low|very_low), красный
баннер над оценкой, предупреждение и сноски в PDF-отчёте.
- Счётчики перестали брать сырой n_analogs там, где рядом список карточек
(PDF, v1 HeroSummary/ListingsCard, v2 SourcesMap/mappers) — иначе
печаталось «0 шт.» над непустой таблицей.
- extract_street_name: сокращения с необязательной точкой. DaData отдаёт
«ул Академика Парина» без точки → улица не извлекалась → пустые блоки
«сделки по улице» и «продажи vs объявления» на любом адресе из DaData.