From 76b24e9f4dabe9ba9c869bf484ff376e7f43088f Mon Sep 17 00:00:00 2001 From: bot-backend Date: Fri, 4 Sep 2026 11:27:32 +0300 Subject: [PATCH] =?UTF-8?q?fix(mera-public):=20=D0=BF=D0=BE=D0=B4=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B8=20=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=BA=20?= =?UTF-8?q?=D1=81=D0=BD=D0=B8=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=86=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B8=20=D0=B1=D0=B5=D0=BD=D1=87=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D0=BA=20=D0=BE=D1=82=D1=87=D1=91=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BB=D0=BE=D1=89=D0=B0=D0=B4=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Замечание юриста (Сайт_МЕРА_v2, п.3): публичный измеримый контент не должен строиться на названных данных площадок. - landing_stats.py: note метрик price_cut_share_pct / price_cut_median_pct_per_month «Только Домклик (…)» → «Только одна из площадок (…)». Текст персистится в landing_stats.note и рендерится на лендинге в блоке «цена ошибки» — после деплоя нужен пересчёт (refresh_landing_stats), деплой кода note не перепишет. - HeroSummary.tsx / IMVBenchmark.tsx: убраны видимые «IMV» и title «Information Market Value» / «Индекс Market Value» — бренд-термин оценочной модели площадки; подпись — «оценочная модель» + sourcePublicLabel. - public-copy-no-platform-names.test.ts: «IMV», «Information Market Value» добавлены в BANNED (гейт 34/34). --- tradein-mvp/backend/app/tasks/landing_stats.py | 7 +++++-- .../__tests__/public-copy-no-platform-names.test.ts | 4 ++++ .../frontend/src/components/trade-in/HeroSummary.tsx | 8 ++++---- .../frontend/src/components/trade-in/IMVBenchmark.tsx | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/tradein-mvp/backend/app/tasks/landing_stats.py b/tradein-mvp/backend/app/tasks/landing_stats.py index 4a9cdfc8..e02450b8 100644 --- a/tradein-mvp/backend/app/tasks/landing_stats.py +++ b/tradein-mvp/backend/app/tasks/landing_stats.py @@ -305,9 +305,12 @@ def collect_landing_metrics(db: Session) -> list[dict[str, Any]]: ).first() if row is not None and row.n: n = int(row.n) + # Публичная подпись метрики: площадка не называется (норма publicLabel, + # решение 31.08.2026); фактически это Домклик — единственный источник, + # где триггер пишет стартовую цену. Текст персистится в landing_stats.note. base_note = ( - f"Только Домклик (единственный источник, где триггер пишет стартовую цену), " - f"наблюдение от {_PRICE_SPAN_DAYS} дней, изменения свыше " + "Только одна из площадок (единственный источник, где фиксируется " + f"стартовая цена), наблюдение от {_PRICE_SPAN_DAYS} дней, изменения свыше " f"{_PRICE_MAX_ABS_PCT}% отброшены как смена объекта" ) metrics.append( diff --git a/tradein-mvp/frontend/src/app/mera-public/__tests__/public-copy-no-platform-names.test.ts b/tradein-mvp/frontend/src/app/mera-public/__tests__/public-copy-no-platform-names.test.ts index 60c12c89..882d82f4 100644 --- a/tradein-mvp/frontend/src/app/mera-public/__tests__/public-copy-no-platform-names.test.ts +++ b/tradein-mvp/frontend/src/app/mera-public/__tests__/public-copy-no-platform-names.test.ts @@ -88,6 +88,10 @@ const BANNED = [ "Avito Оценка", "Я.Оценка", "Циан Оценка", + // Бренд-термины оценочной модели Avito: «IMV» / «Information Market Value». + // Идентификаторы (IMVBenchmark, imvPrice) границей слова не задеваются. + "IMV", + "Information Market Value", ]; /** diff --git a/tradein-mvp/frontend/src/components/trade-in/HeroSummary.tsx b/tradein-mvp/frontend/src/components/trade-in/HeroSummary.tsx index 2c7febc7..0a0134e6 100644 --- a/tradein-mvp/frontend/src/components/trade-in/HeroSummary.tsx +++ b/tradein-mvp/frontend/src/components/trade-in/HeroSummary.tsx @@ -529,13 +529,13 @@ export function HeroSummary({ estimate, input, onResubmit, isResubmitting = fals )} - {/* ── Компактный ряд бенчмарков: Avito IMV · Cian · ДКП ── + {/* ── Компактный ряд бенчмарков: оценочные модели площадок (avito_imv, cian_valuation) · ДКП ── Вторичный контекст-якорь под hero, не конкурирует по размеру. */} {!insufficientData && (imvPrice !== null || estimate.cian_valuation?.sale_price_rub != null || showDkp) && (
{imvPrice !== null && (
- {sourcePublicLabel("avito_imv")} IMV + {sourcePublicLabel("avito_imv")} {formatMln(imvPrice)} ₽
)} @@ -595,10 +595,10 @@ export function HeroSummary({ estimate, input, onResubmit, isResubmitting = fals {imvPrice !== null && (
- {sourcePublicLabel("avito_imv")} IMV: {formatMln(imvPrice)} ₽ + {sourcePublicLabel("avito_imv")}, оценочная модель: {formatMln(imvPrice)} ₽
)}
diff --git a/tradein-mvp/frontend/src/components/trade-in/IMVBenchmark.tsx b/tradein-mvp/frontend/src/components/trade-in/IMVBenchmark.tsx index 8fe8f914..fb6621fb 100644 --- a/tradein-mvp/frontend/src/components/trade-in/IMVBenchmark.tsx +++ b/tradein-mvp/frontend/src/components/trade-in/IMVBenchmark.tsx @@ -51,7 +51,7 @@ export function IMVBenchmark({ benchmark, isLoading }: Props) { return (
- {SRC_LABEL} IMV + {SRC_LABEL} · оценочная модель
-- 2.45.3