diff --git a/tradein-mvp/frontend/src/app/mera-public/_components/v3/CostOfErrorV3.tsx b/tradein-mvp/frontend/src/app/mera-public/_components/v3/CostOfErrorV3.tsx index c90201f6..1d700573 100644 --- a/tradein-mvp/frontend/src/app/mera-public/_components/v3/CostOfErrorV3.tsx +++ b/tradein-mvp/frontend/src/app/mera-public/_components/v3/CostOfErrorV3.tsx @@ -16,6 +16,14 @@ * единицу, которой её не мерили: подпись приведена к измеренному, а источник * назван прямо в ней, а не только в `note` под плиткой. * + * ЗАГОЛОВОК БЕЗ СРОКА (аудит 30.08). Стояло «против двух месяцев вашей + * жизни»: величина вписана в компонент руками, тогда как обе цифры секции + * приходят из `/stats` с выборками, а «двух месяцев» нет ни в одном замере. + * Подставить измеренную экспозицию вместо неё нельзя — это другая величина: + * `median_listing_age_days` считается по объявлениям, которые ЕЩЁ ВИСЯТ + * (цензурированная выборка, см. public-api.ts), и сроком продажи не является. + * Поэтому срок убран, а не заменён числом. + * * ЧЕГО ЗДЕСЬ БОЛЬШЕ НЕТ. Плитки «×2,4 дольше продаётся квартира с завышенной * ценой»: замер даёт ×1,04 (79 дней против 76), и это уже с цензурой в пользу * заявления. Её место заняла доля снижающих цену — измеренная величина про то @@ -77,7 +85,7 @@ export function CostOfErrorV3({ stats }: { stats: LandingStats }) { ПОЧЕМУ ЭТО ВАЖНО

- {`${SERVICE_PRICE_RUB} ₽ против двух месяцев вашей жизни`} + {`${SERVICE_PRICE_RUB} ₽ против ошибки в цене вашей квартиры`}

diff --git a/tradein-mvp/frontend/src/app/mera-public/_components/v3/HeroV3.tsx b/tradein-mvp/frontend/src/app/mera-public/_components/v3/HeroV3.tsx index 42435255..670efdc2 100644 --- a/tradein-mvp/frontend/src/app/mera-public/_components/v3/HeroV3.tsx +++ b/tradein-mvp/frontend/src/app/mera-public/_components/v3/HeroV3.tsx @@ -28,6 +28,11 @@ * похожие объявления УЖЕ висят (`deals.days_on_market` пуст, сверять прогноз * срока не с чем). Обещание приведено к этой величине. * + * ПОДЗАГОЛОВОК БЕЗ СРОКА (аудит 30.08). Стояло «не зависли НА ПОЛГОДА» — + * длительность, которой нет ни в одном замере; ближайшая измеренная величина + * (медианная экспозиция активного объявления) считается по тем, кто ещё + * висит, и сроком продажи не является. Срок убран, а не заменён числом. + * * ЧЕГО В ТЕКСТЕ БОЛЬШЕ НЕТ: обещания «каждый такой прогноз мы потом сверяем с * фактом сделки». Контура сверки прогноза клиента с его сделкой в продукте не * существует (`trade_in_leads` — 4 строки без полей исхода), и обещать его @@ -105,7 +110,7 @@ export function HeroV3({ stats }: { stats: LandingStats }) {

Мы называем реальную цену вашей квартиры — чтобы вы не продали её - дешевле и не зависли на полгода. + дешевле рынка и не зависли в продаже.

diff --git a/tradein-mvp/frontend/src/app/mera-public/_components/v3/ObjectionsV3.tsx b/tradein-mvp/frontend/src/app/mera-public/_components/v3/ObjectionsV3.tsx index e5cc5b1e..b1e9042c 100644 --- a/tradein-mvp/frontend/src/app/mera-public/_components/v3/ObjectionsV3.tsx +++ b/tradein-mvp/frontend/src/app/mera-public/_components/v3/ObjectionsV3.tsx @@ -8,9 +8,21 @@ * * Ответы НЕ из макета (там реквизит рендера): собраны из уже выверенной * честной копии продукта — content.ts (FAQ), oferta/refund. Вопрос про факт - * сделки отвечаем тем, что в продукте ЕСТЬ (сделки Росреестра + снятие - * объявлений с публикации), а не макетной формулировкой про «отметки - * продавцов», механики которых не существует. + * сделки отвечаем тем, что в продукте ЕСТЬ (сделки Росреестра, сверка + * прогноза с ценой ДКП), а не макетной формулировкой про «отметки продавцов», + * механики которых не существует. + * + * СНЯТИЕ ОБЪЯВЛЕНИЙ ОТСЮДА УБРАНО (аудит 30.08). Ответ обещал, что мы + * «отслеживаем снятие объявлений с публикации» и считаем по этому расхождение + * прогноза с реальностью. Ни одного из двух не происходит: расхождение + * считается в `app/tasks/landing_showcase_deals.py` и + * `backend/scripts/backtest_estimator.py`, и оба берут ТОЛЬКО цену ДКП; + * признака снятия в данных нет вовсе — `listing_source_snapshot.py` не пишет + * delisted/relisted намеренно (не выводимы при покрытии обхода 10-35%), на + * проде 0 таких строк в `listing_source_events`, а `deals.days_on_market` + * заполнена 0 из 108 623. Страница при этом сама себе и противоречила: + * `AccuracyV3` двумя блоками выше зовёт ту же величину «медианной экспозицией + * АКТИВНОГО объявления» именно потому, что снятие сделкой не является. * * ВЕСЬ `FAQ` ИЗ content.ts ИМПОРТИРУЕТСЯ, А НЕ ПЕРЕПИСЫВАЕТСЯ. Так было не * сразу: при переносе брались только `how-do-you-know` и `why-region`, а @@ -74,7 +86,8 @@ const ITEMS: readonly Objection[] = [ { q: "Откуда вы знаете факт сделки?", a: [ - "К объявлениям мы добавляем зарегистрированные сделки Росреестра и отслеживаем снятие объявлений с публикации. По этим данным считается расхождение прогноза с реальностью — и честно показывается, на скольких объектах построен каждый расчёт.", + "Зарегистрированные сделки Росреестра — это цены договоров купли-продажи, а не пожелания продавцов. По ним же мы проверяем себя: прошлые сделки прогоняются через тот же расчёт, и прогноз сравнивается с ценой ДКП — медианное расхождение и число сделок, на которых оно посчитано, стоят в шапке этой страницы.", + "Снятие объявления с публикации сделкой не считаем: по нашим данным нельзя отличить продажу от того, что объявление просто убрали или до него не дошёл обход. И в отчёте, и здесь честно показывается, на скольких объектах построен расчёт.", ], }, {