fix(tradein/v2): честность+консистентность — реконсиляция счётчика аналогов, убрать фейк-donut/линейку, outlier-guard, created_at, дисклеймеры #2481
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2481
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/v2-honesty-consistency"
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?
Контекст
Полировка Mera v2 UI-блоков после live-аудита. Тот же класс дефектов, что уже чинили раньше: "фейк-данные под видом реальных". Честная деградация везде: убрать фейк / завести реальные данные / явно разметить как приближение — никогда не выдумывать.
Фиксы
schemas/trade_in.py:163-165,180-181,estimator.py:3286-3310, #2087 M1) явно документирует семантику:n_analogs— полный счёт, использованный в расчёте ("Консьюмер должен брать счёт отсюда, а не из len()");analogs/source_counts— персистентный top-10 сэмпл, намеренно капнутый, чтобы POST-ответ не расходился с GET-reload. Это не "найдено vs использовано", а "истинный итог vs капнутая выборка для отображения".n_analogs— не трогал.ResultPanel.tsx— под тайлами "ИСТОЧНИКИ ДАННЫХ" caption "Разбивка — по показанным N из M аналогам", когдаanalogs.length < n_analogs.SourcesMap.tsx— шапка карты "Объявлений: N из M".SourcesView.tsx— подвал таблицы объявлений "Показано N из M объявлений" (по образцу уже существующего паттерна у таблицы сделок).ObjectSummary.tsx) — хардкодstrokeDasharray="126" strokeDashoffset="72"(~43%, никогда не менялся). Композитного quality-score нет нигде в мапперах — не стал выдумывать, убрал кольцо, оставил 3 реальные текстовые строки.""(TODO BE-3,mappers.ts:mapObject). По образцу уже используемого в файле паттернаlocationCoef"нет данных".mapReportтеперь берёт реальныйcreated_at(#2043/BE-1), фоллбек наexpires_at−24чтолько для pre-BE-1 записей безcreated_at.ParamsPanel.tsx) загейчен наhasEstimate— раньше показывался как свежий ДО первой оценки. 24ч TTL сам по себе реальная константа кэша, дефект был только в always-visible.mappers.ts:guardPriceOutliers, порог2.5–3×медианы пула — взял середину2.75×): исключение выбросов из CV/разброса с раскрытием количества ("N возможных выбросов исключено из расчёта разброса") + бейдж "возможный выброс" на строке в таблице объявлений (05).SourcesMap.tsxпопап сделки "(квартал, Росреестр)" → "(месяц, Росреестр)" —fmtMonthYearреально рендерит месяц, не квартал.mapCache"ВСЕГО ОЦЕНОК" саб-лейбл "по вашим оценкам" → "последние 50" —useEstimateHistory()капает на 50 (trade-in-api.ts:247), не лайфтайм-тотал.Тесты
tsc --noEmit— зелёный.next lint— зелёный (только pre-existing warnings в нетронутых файлах:CianAuthBanner,pct,<img>в HeroBar:318 вне зоны правок).next build— зелёный (задет sharedtypes.ts→ прогнал полный build).Скоуп/решения, требующие внимания
dealRows/actual_dealsoutlier-guard — не было в скоупе задачи (только ads/analogs price_per_m2).buildSources/source_countswiring — бэкенд-комментарий (#2087 M1) явно объясняет, почему они капнуты синхронно сanalogs; переключение наsource_countsдало бы те же числа (той же капнутой выборки), с потерей deals-счёта. Оставил FE groupBy, добавил дисклозуру вместо этого.