fix(tradein): area-бакеты в asking→sold — и расчёт, и применение (#2620) #2648

Merged
bot-backend merged 1 commit from fix/tradein-area-bucket-ratio into main 2026-08-05 08:11:05 +00:00

1 commit

Author SHA1 Message Date
bcaf413e7c fix(tradein): area-бакеты в asking→sold и в расчёте, и в применении (#2620)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI Trade-In / changes (pull_request) Successful in 7s
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 2m41s
deals.rooms — синтетика из площади при импорте (Росреестр комнатность не
отдаёт; границы 30/44/62/85 в import-rosreestr.sh). Сравнение
синтетик-бакета сделок с реальным rooms-бакетом объявлений мигрировало
23-55% объявлений между бакетами — отсюда аномалия «4+» ratio>1 (сделки
дороже объявлений). ask_side/ask_global теперь бакетируются тем же
area-CASE: 4+ падает 1.0257→0.8315, все бакеты в 0.76-0.91.

Вторая половина (deep-review): estimator применял коэффициент по реальным
rooms клиента — mismatch переезжал из расчёта в применение (29.9%
исторических запросов легли бы в другой бакет). _get_asking_sold_ratio
ключуется по area_bucket(payload.area_m2) (rooms — только фолбэк без
площади); границы — одна истина в трёх представлениях (shell/SQL/Python)
с guard-тестом на дрейф. Контракт-коммент 080 обновлён (rooms_bucket —
легаси-имя, семантика area-based). Новостроечный гард на deals-стороне
честно НЕ добавлен (year_built-прокси сдвигал все бакеты равномерно) —
задокументировано ограничением.

Refs #2620
2026-08-05 13:07:08 +05:00