(medium) EstimateResult.tsx hero-бейдж: 'N аналогов' = listings+deals, не совпадает с таблицей аналогов #1478

Closed
opened 2026-06-15 05:57:42 +00:00 by bot-backend · 1 comment
Collaborator

Severity: medium · Категория: report · Файл: frontend/src/components/trade-in/EstimateResult.tsx:176-182

EstimateResult.tsx:180 в бейдже 'Достоверность' выводит {estimate.n_analogs} аналог{ending()}. Backend (backend/app/api/v1/trade_in.py:192) заполняет n_analogs = n_analogs + n_deals, где n_analogs=random(7..10) листингов и n_deals=random(3..5) сделок (строки 176-177) — т.е. сумма двух разных датасетов (10..15). При этом секция 2 (строка 321) показывает только Объявления-аналоги (${estimate.analogs.length}) = 7..10 строк, а сделки идут отдельной секцией 'Фактические сделки' (347). Импакт: рядом с оценкой достоверности клиент видит число выборки 'аналогов', которое больше, чем строк в таблице аналогов, что вводит в заблуждение о размере именно выборки аналогов. Фикс: либо переименовать подпись бейджа на 'объектов в выборке' / 'наблюдений', либо выводить estimate.analogs.length + estimate.actual_deals.length с честной формулировкой, либо разнести два числа. Семантику суммы надо согласовать между backend и подписью.

Почему баг: Число в бейдже (n_analogs) и число в таблице аналогов (analogs.length) семантически разные: первое = listings+deals, второе = только listings. Это видно по backend n_analogs=n_analogs + n_deals и по тому, что компонент рендерит analogs и actual_deals в двух разных секциях. Текст 'N аналогов' рядом с оценкой достоверности врёт о размере выборки именно аналогов и вводит клиента в заблуждение о репрезентативности.

Как чинить: Либо переименовать подпись в бейдже на нейтральное 'N объектов в выборке' / 'N источников', либо показывать estimate.analogs.length + estimate.actual_deals.length синхронно с заголовками секций, либо использовать отдельное поле. Согласовать смысл n_analogs с backend и текстом отчёта.


deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U103

**Severity:** medium · **Категория:** report · **Файл:** `frontend/src/components/trade-in/EstimateResult.tsx:176-182` EstimateResult.tsx:180 в бейдже 'Достоверность' выводит `{estimate.n_analogs} аналог{ending()}`. Backend (backend/app/api/v1/trade_in.py:192) заполняет `n_analogs = n_analogs + n_deals`, где n_analogs=random(7..10) листингов и n_deals=random(3..5) сделок (строки 176-177) — т.е. сумма двух разных датасетов (10..15). При этом секция 2 (строка 321) показывает только `Объявления-аналоги (${estimate.analogs.length})` = 7..10 строк, а сделки идут отдельной секцией 'Фактические сделки' (347). Импакт: рядом с оценкой достоверности клиент видит число выборки 'аналогов', которое больше, чем строк в таблице аналогов, что вводит в заблуждение о размере именно выборки аналогов. Фикс: либо переименовать подпись бейджа на 'объектов в выборке' / 'наблюдений', либо выводить `estimate.analogs.length + estimate.actual_deals.length` с честной формулировкой, либо разнести два числа. Семантику суммы надо согласовать между backend и подписью. **Почему баг:** Число в бейдже (n_analogs) и число в таблице аналогов (analogs.length) семантически разные: первое = listings+deals, второе = только listings. Это видно по backend `n_analogs=n_analogs + n_deals` и по тому, что компонент рендерит analogs и actual_deals в двух разных секциях. Текст 'N аналогов' рядом с оценкой достоверности врёт о размере выборки именно аналогов и вводит клиента в заблуждение о репрезентативности. **Как чинить:** Либо переименовать подпись в бейдже на нейтральное 'N объектов в выборке' / 'N источников', либо показывать `estimate.analogs.length + estimate.actual_deals.length` синхронно с заголовками секций, либо использовать отдельное поле. Согласовать смысл n_analogs с backend и текстом отчёта. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U103</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:57:42 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:11 +00:00
Owner

🔍 week ревью 1 — верификация (ЧАСТИЧНО)

Текущее состояние кода:

  • frontend/src/components/trade-in/EstimateResult.tsx:180 — бейдж «Достоверность» выводит {estimate.n_analogs} аналог{ending(estimate.n_analogs)} (подтверждено).
  • Backend tradein-mvp/backend/app/services/estimator.py:1982n_analogs = len(listings_clean) (только листинги), либо для anchor-пути n_analogs = anchor["n"] (estimator.py:2273). Сохраняется в trade_in_estimates.n_analogs (estimator.py:2723).

Корень / почему не воспроизводится как описано: конкретная причина из тела («n_analogs = n_analogs + n_deals, где n_analogs=random(7..10) и n_deals=random(3..5) в trade_in.py:176-192») в текущем коде НЕ найдена — там нет random-mock и нет суммирования listings+deals; trade_in.py:150-182 зовёт реальный estimate_quality(). То есть n_analogs сейчас = число листингов (или anchor-популяция), а НЕ listings + deals.
Тем не менее остаточная проблема есть: бейдж n_analogs и таблица «Объявления-аналоги (analogs.length)» могут не совпадать — для anchor-пути n_analogs = anchor["n"] (полное число найденных), а показываемый analogs capped до 10 (estimator.py:2271-2272). Плюс рядом отдельная секция «Фактические сделки» (actual_deals) не входит в бейдж. Подпись «N аналогов» по-прежнему может вводить в заблуждение о размере именно показываемой выборки аналогов.

Что править:

  • Перепроверить семантику против актуального backend: n_analogs = полное число найденных листингов/anchor-популяция, НЕ сумма с deals.
  • В бейдже либо нейтральная подпись «N объектов в выборке» / «N наблюдений», либо явно показывать estimate.analogs.length (+ опц. actual_deals.length) синхронно с заголовками секций. Согласовать смысл с backend-полем.

Что посмотреть:

  • Код: EstimateResult.tsx:176-182 (badge), секции analogs / actual_deals ниже; backend estimator.py:1982,2271-2273,2723. Тело issue ссылается на устаревшие строки trade_in.py:176-192,321,347 — реальная логика в estimator.py.
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ЧАСТИЧНО)** **Текущее состояние кода:** - `frontend/src/components/trade-in/EstimateResult.tsx:180` — бейдж «Достоверность» выводит `{estimate.n_analogs} аналог{ending(estimate.n_analogs)}` (подтверждено). - Backend `tradein-mvp/backend/app/services/estimator.py:1982` — `n_analogs = len(listings_clean)` (только листинги), либо для anchor-пути `n_analogs = anchor["n"]` (`estimator.py:2273`). Сохраняется в `trade_in_estimates.n_analogs` (`estimator.py:2723`). **Корень / почему не воспроизводится как описано:** конкретная причина из тела («`n_analogs = n_analogs + n_deals`, где `n_analogs=random(7..10)` и `n_deals=random(3..5)` в `trade_in.py:176-192`») в текущем коде **НЕ найдена** — там нет random-mock и нет суммирования listings+deals; `trade_in.py:150-182` зовёт реальный `estimate_quality()`. То есть `n_analogs` сейчас = число листингов (или anchor-популяция), а НЕ `listings + deals`. Тем не менее остаточная проблема **есть**: бейдж `n_analogs` и таблица «Объявления-аналоги (`analogs.length`)» могут не совпадать — для anchor-пути `n_analogs = anchor["n"]` (полное число найденных), а показываемый `analogs` capped до 10 (`estimator.py:2271-2272`). Плюс рядом отдельная секция «Фактические сделки» (`actual_deals`) не входит в бейдж. Подпись «N аналогов» по-прежнему может вводить в заблуждение о размере именно показываемой выборки аналогов. **Что править:** - Перепроверить семантику против актуального backend: `n_analogs` = полное число найденных листингов/anchor-популяция, НЕ сумма с deals. - В бейдже либо нейтральная подпись «N объектов в выборке» / «N наблюдений», либо явно показывать `estimate.analogs.length` (+ опц. `actual_deals.length`) синхронно с заголовками секций. Согласовать смысл с backend-полем. **Что посмотреть:** - Код: `EstimateResult.tsx:176-182` (badge), секции `analogs` / `actual_deals` ниже; backend `estimator.py:1982,2271-2273,2723`. Тело issue ссылается на устаревшие строки `trade_in.py:176-192,321,347` — реальная логика в `estimator.py`. - Vault: релевантных заметок не найдено.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1478
No description provided.