fix(tradein): свести высоту потолков к одной колонке ceiling_height_m #2779
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2779
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2699-ceiling-height"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Замер с прода (2026-08-07, 94 373 объявления)
Главная предпосылка опровергнута: расхождений НЕТ. Там, где заполнены обе колонки (7 675 строк), значения совпадают до последнего знака. Это не «две конфликтующие правды», а одна правда в двух ящиках. Задача — не «неверная цена», а лишняя колонка и потерянное покрытие: 855 циановских + 24 яндексовых значения не видит ни один потребитель.
Мусор в колонке, которую читает эстиматор: 26 строк > 6 м (максимум 29.90) и 84 < 2 м (83 ровных 0.00) — все avito. У
ceiling_height— 2 строки cian вне диапазона.Денежный эффект: 0 ₽
Замерен, а не предположен. Backtest (
scripts/backtest_estimator, 200 сделок, полный ценовой спайн,--resolve-house-id, прод-БД read-only) в трёх конфигурациях:Причина структурная, а не «повезло на выборке»: сигнал
_adjust_relevance_by_pool_deviationтолько переупорядочивает аналоги, а медиана ₽/м² к порядку безразлична. Состав пула меняется лишь когда он перевалит за 50 (_stratify_candidates→[:50]). Медиана размера пула в выборке — 2, порог 50 достигнут у 1 из 200 сделок, и даже там состав не изменился (сверено посписочно поsource_url: порядок отличается у 32 сделок, состав — у 0).Ловушка «включат флаг и молча поедет цена» из issue тоже, таким образом, опровергнута — при нынешней плотности аналогов сам флаг ничего не двигает. Правка нужна ради чистоты данных и снятия дубля, а не ради цены. Направление правки безопасное по построению: она не может увеличить оценки, потому что не меняет их вовсе.
Выбранная колонка:
ceiling_height_mПо источнику данных, не по удобству:
domrf_kn_flats.ceiling_height_m,domrf_kn_objects.ceiling_height_m, фронтовыйObjectSpecsTable.listings.ceiling_height— единственное исключение.numeric(5,2)противnumeric(3,2): у 019-колонки потолок 9.99, и запись out-of-range роняет весь батчDataError'ом (per-lot SAVEPOINT ловит толькоIntegrityError) — это уже приходилось обходить инлайн-гейтом в yandex SERP.Что со второй
Писателей у
ceiling_heightбольше нет, значения перенесены, из coverage-дашборда убрана, в схеме помеченаCOMMENT ... DEPRECATED. DROP COLUMN намеренно не в этом PR: сначала прод должен подтвердить, что колонку никто не пишет и не читает. Снос — отдельным шагом за database-expert.Изменения
scraper_kit/ceiling_height.py— единый гейт правдоподобия 2.0–6.0 м. Гейт был инлайн только у yandex SERP, поэтому avito detail (_parse_height_mбрал первое число строки) нагнал мусор в канон. Корень починен там, где сходятся все писатели.base.save_listingsбольше не пишетceiling_height(писал ОДИН param в ОБЕ колонки — источник дубля).cian/detail.py,yandex/detail.py→ пишут канон.COMMENT.HOUSE_FIELD_PRIORITY["ceiling_height"]удалён: колонки с таким именем вhousesнет (прод: 0 колонокLIKE '%ceiling%'), правило не могло сработать ни разу. Существовавший тест на него зеленел, проверяя фантом, — заменён на проверку отсутствия.LISTING_FIELD_PRIORITY— ключ переименован в имя реальной колонки, источники расширены до трёх (карта — документация, в боевом merge-пути не вызывается, см. её собственный docstring).Test plan
tests/test_ceiling_height_unify_2699.py— 9 тестов красные наorigin/main(прогнано: исходники откачены на main, тесты оставлены новые → 9 failed), зелёные после.tradein-mvp/backend: 3979 passed, 15 skipped.ruff check+ruff format(конфиг репо, v0.7.4).Прод-верификация (критерий записан ДО факта)
Расписания ждать не надо:
tradein-mvp/backend/data/sql/NN_*.sqlприменяется автоматически на деплое (_schema_migrations, strict). Проверять сразу после деплоя.Критерий приёмки (посчитан симуляцией миграции на проде 2026-08-07, до мержа):
Второй прогон, через сутки после деплоя:
count(ceiling_height)не изменился — значит писателей у устаревшей колонки действительно нет и её можно сносить отдельным PR.Refs #2699