fix(tradein): свести высоту потолков к одной колонке ceiling_height_m #2779

Merged
bot-backend merged 2 commits from fix/2699-ceiling-height into main 2026-08-07 09:18:49 +00:00

2 commits

Author SHA1 Message Date
8df66ad740 docs(tradein): уточнить ожидаемые числа мигр. 238 по симуляции на проде
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 3m51s
877 перенесённых (855 cian − 2 мусорных + 24 yandex), итог 15 591 непустых
ceiling_height_m. Прежние 879/15 703 были посчитаны в уме без вычета мусора,
а критерий приёмки, записанный ДО факта, обязан быть точным.

Refs #2699
2026-08-07 13:56:55 +05:00
869079a86f fix(tradein): свести высоту потолков к одной колонке ceiling_height_m
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 4m17s
Прод-замер 2026-08-07 (94 373 объявления): признак жил в двух колонках,
источники разложены по ним не пересекаясь.

  source  |  всего | ceiling_height | ceiling_height_m | обе   | расходятся
  avito   | 48 592 |              0 |            7 149 |     0 |          0
  cian    | 21 951 |            855 |                0 |     0 |          0
  yandex  | 16 854 |          7 699 |            7 675 | 7 675 |          0

Расхождений НЕТ: где заполнены обе (7 675 строк), значения совпадают до
последнего знака. Значит это не «две правды», а одна правда в двух ящиках:
855 циановских + 24 яндексовых значения не видел ни один потребитель.

Канон — ceiling_height_m: единицы в имени (так этот признак назван везде
в проекте: domrf_kn_flats/objects, фронт), её читает эстиматор,
numeric(5,2) против numeric(3,2) у 019-колонки, чей потолок 9.99 роняет
весь батч DataError'ом на out-of-range.

Что сделано:
- scraper_kit.ceiling_height.plausible_ceiling_m — единый гейт 2.0–6.0 м.
  Раньше гейт был инлайн только у yandex SERP, поэтому avito detail нагнал
  26 значений > 6 м (максимум 29.90) и 83 ровных 0.00 в колонку, которую
  читает эстиматор. Корень — _parse_height_m брал первое число строки.
- base.save_listings больше не пишет ceiling_height (писал один param в обе
  колонки — источник дубля); cian_detail и yandex_detail переведены на канон.
- Миграция 238: чистка невозможных значений + перенос 879 уникальных.
  DROP COLUMN намеренно НЕ здесь — сначала прод должен подтвердить, что
  колонку никто не пишет; снос отдельным шагом.
- HOUSE_FIELD_PRIORITY["ceiling_height"] удалён: колонки с таким именем в
  houses нет, правило не могло сработать ни разу. Тест на него зеленел,
  проверяя фантом.
- Coverage-дашборд показывает одну строку вместо двух.

Денежный эффект замерен, а не предположен: backtest (200 сделок, полный
ценовой спайн, --resolve-house-id) в трёх конфигурациях — флаг OFF (прод),
флаг ON на текущих данных, флаг ON на данных после этой правки. Оценка не
сдвинулась НИ У ОДНОЙ сделки. Причина структурная: сигнал только
переупорядочивает аналоги, а медиана ₽/м² к порядку безразлична; состав
меняется лишь когда пул перевалит за 50 (медиана пула — 2, у 1 из 200).

Refs #2699
2026-08-07 13:54:59 +05:00