Merge remote-tracking branch 'origin/fix/audit-faq-contradiction' into fix/audit-all

This commit is contained in:
bot-backend 2026-08-30 00:14:23 +05:00
commit b343f84784
3 changed files with 32 additions and 6 deletions

View file

@ -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 }) {
ПОЧЕМУ ЭТО ВАЖНО
</div>
<h2 id="cost-v3-title" className={styles.costTitle}>
{`${SERVICE_PRICE_RUB} ₽ против двух месяцев вашей жизни`}
{`${SERVICE_PRICE_RUB} ₽ против ошибки в цене вашей квартиры`}
</h2>
</div>

View file

@ -28,6 +28,11 @@
* похожие объявления УЖЕ висят (`deals.days_on_market` пуст, сверять прогноз
* срока не с чем). Обещание приведено к этой величине.
*
* ПОДЗАГОЛОВОК БЕЗ СРОКА (аудит 30.08). Стояло «не зависли НА ПОЛГОДА»
* длительность, которой нет ни в одном замере; ближайшая измеренная величина
* (медианная экспозиция активного объявления) считается по тем, кто ещё
* висит, и сроком продажи не является. Срок убран, а не заменён числом.
*
* ЧЕГО В ТЕКСТЕ БОЛЬШЕ НЕТ: обещания «каждый такой прогноз мы потом сверяем с
* фактом сделки». Контура сверки прогноза клиента с его сделкой в продукте не
* существует (`trade_in_leads` 4 строки без полей исхода), и обещать его
@ -105,7 +110,7 @@ export function HeroV3({ stats }: { stats: LandingStats }) {
<p className={styles.heroLead}>
Мы называем реальную цену вашей квартиры чтобы вы не продали её
дешевле и не зависли на полгода.
дешевле рынка и не зависли в продаже.
</p>
<div className={styles.heroChecklist}>

View file

@ -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: [
"К объявлениям мы добавляем зарегистрированные сделки Росреестра и отслеживаем снятие объявлений с публикации. По этим данным считается расхождение прогноза с реальностью — и честно показывается, на скольких объектах построен каждый расчёт.",
"Зарегистрированные сделки Росреестра — это цены договоров купли-продажи, а не пожелания продавцов. По ним же мы проверяем себя: прошлые сделки прогоняются через тот же расчёт, и прогноз сравнивается с ценой ДКП — медианное расхождение и число сделок, на которых оно посчитано, стоят в шапке этой страницы.",
"Снятие объявления с публикации сделкой не считаем: по нашим данным нельзя отличить продажу от того, что объявление просто убрали или до него не дошёл обход. И в отчёте, и здесь честно показывается, на скольких объектах построен расчёт.",
],
},
{