fix(tradein/v2): честность+консистентность — реконсиляция счётчика аналогов, убрать фейк-donut/линейку, outlier-guard, created_at, дисклеймеры #2481

Merged
bot-backend merged 1 commit from fix/v2-honesty-consistency into main 2026-07-12 15:09:11 +00:00

1 commit

Author SHA1 Message Date
bot-backend
06a88f683d fix(tradein/v2): честность+консистентность UI-блоков
All checks were successful
CI / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 58s
CI Trade-In / changes (pull_request) Successful in 8s
CI / openapi-codegen-check (pull_request) Has been skipped
Полировка Mera v2 после live-аудита — тот же класс "фейк-данные под видом
реальных", что уже чинили раньше. Честная деградация: убрать фейк / завести
реальные данные / явно разметить, никогда не выдумывать.

1. Реконсиляция счётчика аналогов. Бэкенд (schemas/trade_in.py:163-165,180-181,
   estimator.py:3286-3310, #2087 M1) чётко документирует: n_analogs — полный
   счёт, использованный в расчёте; analogs/source_counts — персистентный
   top-10 сэмпл (намеренно капнутый, чтобы POST/GET не расходились). Это НЕ
   "найдено vs использовано", а "полный итог vs капнутая выборка для показа".
   02/03/05 уже использовали n_analogs в headline-цифрах — оставлено. Добавлена
   дисклозура там, где рядом всплывала капнутая выборка и создавала мнимое
   противоречие: 02 (тайлы источников vs "ПОСТРОЕНО ПО N АНАЛОГАМ"), 05 (шапка
   карты и подвал таблицы объявлений) — по образцу уже существующего паттерна
   "Показано N из M" (deals-таблица).
2. Убран фейковый donut "КАЧЕСТВО ДАННЫХ" (ObjectSummary) — хардкод
   strokeDasharray/offset, композитного score нет нигде в мапперах.
3. Убрана фейковая линейка расстояний (HeroBar) — хардкод тиков 0/25/50/75/100м
   поверх стокового фото.
4. Скрыты компас и street-view слот (HeroBar) — оба поля всегда "" (TODO BE-3),
   по образцу уже используемого в файле паттерна locationCoef "нет данных".
5. mapReport берёт реальный created_at (#2043/BE-1), фоллбек на expires−24h
   только для pre-BE-1 записей без created_at.
6. Бейдж "ДАННЫЕ АКТУАЛЬНЫ/ДЕЙСТВИТЕЛЕН 24 Ч" (ParamsPanel) загейчен на
   hasEstimate — раньше показывался как свежий ДО первой оценки.
7. Дисклеймер у декоративной SVG-карты (ParamsPanel): "Схематично · не
   географическая карта · радиус не в масштабе".
8. Outlier-guard на ₽/м² (mappers.ts guardPriceOutliers, порог 2.5–3× медианы
   пула, взята середина — 2.75×): исключение из CV/разброса с дисклозурой
   count + бейдж "возможный выброс" на строке в таблице объявлений (05).
9. SourcesMap: попап сделки "(квартал, Росреестр)" → "(месяц, Росреестр)" —
   fmtMonthYear реально рендерит месяц.
10. mapCache "ВСЕГО ОЦЕНОК" → саб-лейбл "последние 50" (useEstimateHistory
    капает на 50, trade-in-api.ts:247) — было похоже на лайфтайм-тотал.

tsc --noEmit + next lint зелёные; next build (задет shared types.ts) зелёный.
2026-07-12 18:02:42 +03:00