Не выдавать цену, когда рядом нет ни одного аналога #3537
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#3537
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/estimator-zero-analogs-no-price"
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?
Зачем
Прод-репро: «Красногорск, Янтарная» возвращал 236 766 ₽/м² при
n_analogs = 0. Тестировщик открывает список аналогов, видит пустоту и справедливо перестаёт верить числу. Доля таких ответов — 3.8% по ЕКБ и 4.8% по 77/50, то есть дефект продукта, а не регионального покрытия.Откуда бралась цена
Источник ровно один — deals-headline-fallback
#oblast-D(estimator.py:4184-4225): когда листинговых аналогов нет совсем, headline берётся из коридора ДКП Росреестра, аn_analogsостаётся 0.Остальные кандидаты проверены и исключены:
_apply_imv_blend— no-op приmedian_price <= 0, сам блок гейтитсяmedian_price > 0;_compute_same_building_anchor— всегда проставляетn_analogs = anchor["n"], по построению не оставляет ноль;deal_city_price_bands— только sanity-clamp правдоподобия сделок, не источник headline;Почему гейт не голый
n_analogs == 0Случай
#oblast-E(1-4 объявления плюс ≥3 реальные сделки) тоже зануляетn_analogs, но тамreliabilityнамеренно закреплена на'low', а не'very_low'— коридор из полусотни сделок Росреестра это настоящий сигнал. Гасить его значило бы откатить задокументированное решение от 10.08.2026.Поэтому условие:
n_analogs == 0 AND reliability == "very_low"— уже существующий в коде сигнал «движок сам считает, что данных почти нет».Что видит фронт
Отказ переиспользует паттерн
_empty_estimate(цена/диапазон/ppm² обнулены), но, в отличие от него, сохраняет уже найденные адрес/координаты/дом — рядом с причиной есть что показать. Текст: «Недостаточно данных для точной оценки по этому адресу…».Флаг
estimate_require_analogs(defaultTrue) позволяет откатить без релиза.Test plan
tests/test_estimator_requires_analogs.py: полный ноль данных → цена подавлена; репро Красногорска → подавлена, адрес сохранён; флагFalse→ старое поведение (236 766 ₽/м²) не сломано.pytestпо 6 смежным файлам эстиматора → 118 passed (проверено в main-сессии).ruff format+ruff check— чисто.no_predприESTIMATE_REQUIRE_ANALOGS=falseпротивtrue— это точная доля ответов, которые станут честным отказом.confidence_explanation.