(medium) BestLayoutsBlock/TopLayoutsTable: тултип >100% жёстко пишет «за 24 мес» вместо выбранного time_window #1449

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

Severity: medium · Категория: report · Файл: frontend/src/components/site-finder/BestLayoutsBlock.tsx:336

BestLayoutsBlock.tsx:336 — у бейджа >100% (row.is_oversold) захардкожен title=«Сделки за 24 мес превышают текущий snapshot supply…». При этом компонент использует выбираемый time_window (state timeWindow, стр. 653; передаётся в запрос на стр. 665), по которому backend считает sold_pct_of_supply (Последний месяц/квартал/год), а не фиксированные 24 месяца. Импакт: при time_window=last_month тултип утверждает «за 24 мес» — фактически окно 1 мес; провенанс вводит пользователя в заблуждение о периоде «распроданности». Severity medium (враньё в клиентском провенансе, не краш). Фикс: подставлять в текст период из выбранного timeWindow вместо строки «24 мес».

Почему баг: Backend best_layouts.py после фикса SF-01 (стр. 460-497) считает sold_pct_raw = deals_window / supply_count, где deals_window отфильтрован по report_month выбранного time_window (months_in_window = 1/3/12, _TIME_WINDOW_PARAMS стр. 60-61). То есть знаменатель/числитель относятся к выбранному окну, а не к 24 месяцам. При time_window=last_month тултип в клиентском UI утверждает «за 24 мес» — фактически за 1 месяц. Текст провенанса врёт пользователю о периоде, на котором посчитана «распроданность». (Сам backend-коммент про «24 мес» на стр. 497 тоже устарел, но это вне аудируемых файлов.)

Как чинить: Подставлять в тултип реальный период из выбранного time_window (например, через TIME_WINDOW_LABELS), а не строку «24 мес»: «Сделки за <период> превышают текущий snapshot supply…».


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

**Severity:** medium · **Категория:** report · **Файл:** `frontend/src/components/site-finder/BestLayoutsBlock.tsx:336` BestLayoutsBlock.tsx:336 — у бейджа >100% (row.is_oversold) захардкожен title=«Сделки за 24 мес превышают текущий snapshot supply…». При этом компонент использует выбираемый time_window (state timeWindow, стр. 653; передаётся в запрос на стр. 665), по которому backend считает sold_pct_of_supply (Последний месяц/квартал/год), а не фиксированные 24 месяца. Импакт: при time_window=last_month тултип утверждает «за 24 мес» — фактически окно 1 мес; провенанс вводит пользователя в заблуждение о периоде «распроданности». Severity medium (враньё в клиентском провенансе, не краш). Фикс: подставлять в текст период из выбранного timeWindow вместо строки «24 мес». **Почему баг:** Backend best_layouts.py после фикса SF-01 (стр. 460-497) считает sold_pct_raw = deals_window / supply_count, где deals_window отфильтрован по report_month выбранного time_window (months_in_window = 1/3/12, _TIME_WINDOW_PARAMS стр. 60-61). То есть знаменатель/числитель относятся к выбранному окну, а не к 24 месяцам. При time_window=last_month тултип в клиентском UI утверждает «за 24 мес» — фактически за 1 месяц. Текст провенанса врёт пользователю о периоде, на котором посчитана «распроданность». (Сам backend-коммент про «24 мес» на стр. 497 тоже устарел, но это вне аудируемых файлов.) **Как чинить:** Подставлять в тултип реальный период из выбранного time_window (например, через TIME_WINDOW_LABELS), а не строку «24 мес»: «Сделки за <период> превышают текущий snapshot supply…». --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.78 · unit U92</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:47 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:06 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: frontend/src/components/site-finder/BestLayoutsBlock.tsx:336title="Сделки за 24 мес превышают текущий snapshot supply — значение обрезано до 100%" на бейдже >100% (row.is_oversold, стр. 325-340). timeWindow state — стр. 653, передаётся в запрос на стр. 665. Лейблы окна — TIME_WINDOW_LABELS стр. 23-27 («Последний месяц/квартал/год»). Бэкенд backend/app/services/site_finder/best_layouts.py после фикса SF-01 считает velocity_per_month = deals_window / months_in_window (стр. 482) и sold_pct_raw = deals_window / supply_count * 100 (стр. 492), где deals_window отфильтрован по report_month >= NOW() - window_interval (стр. 138, _TIME_WINDOW_PARAMS стр. 58), т.е. по выбранному окну, а не 24 мес.

Корень: Тултип хардкодит «за 24 мес», тогда как фактическое окно — выбранный time_window (1/3/12 мес). При time_window=last_month тултип врёт о периоде «распроданности». (Бэкенд-коммент стр. 494 про «24 мес» тоже устарел, но это не аудируемый фронт-файл.)

Что править:

  • Подставлять в title реальный период из TIME_WINDOW_LABELS[timeWindow] (стр. 23-27). TopLayoutsTable сейчас не получает timeWindow пропом — прокинуть его из BestLayoutsBlock (стр. 997 <TopLayoutsTable rows={data.top_layouts} />) или взять из data (если бэкенд возвращает окно).
  • Текст: «Сделки за <период> превышают текущий snapshot supply — значение обрезано до 100%».

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

  • Код: BestLayoutsBlock.tsx:336 (тултип), стр. 141 (сигнатура TopLayoutsTable), стр. 997 (вызов); best_layouts.py:494 (устаревший коммент — заодно).
  • Vault: domains/ui/components/Component_SiteFinder_Page.md (BestLayoutsBlock).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/components/site-finder/BestLayoutsBlock.tsx:336` — `title="Сделки за 24 мес превышают текущий snapshot supply — значение обрезано до 100%"` на бейдже `>100%` (`row.is_oversold`, стр. 325-340). `timeWindow` state — стр. 653, передаётся в запрос на стр. 665. Лейблы окна — `TIME_WINDOW_LABELS` стр. 23-27 («Последний месяц/квартал/год»). Бэкенд `backend/app/services/site_finder/best_layouts.py` после фикса SF-01 считает `velocity_per_month = deals_window / months_in_window` (стр. 482) и `sold_pct_raw = deals_window / supply_count * 100` (стр. 492), где `deals_window` отфильтрован по `report_month >= NOW() - window_interval` (стр. 138, `_TIME_WINDOW_PARAMS` стр. 58), т.е. по выбранному окну, а не 24 мес. **Корень:** Тултип хардкодит «за 24 мес», тогда как фактическое окно — выбранный `time_window` (1/3/12 мес). При `time_window=last_month` тултип врёт о периоде «распроданности». (Бэкенд-коммент стр. 494 про «24 мес» тоже устарел, но это не аудируемый фронт-файл.) **Что править:** - Подставлять в `title` реальный период из `TIME_WINDOW_LABELS[timeWindow]` (стр. 23-27). `TopLayoutsTable` сейчас не получает `timeWindow` пропом — прокинуть его из `BestLayoutsBlock` (стр. 997 `<TopLayoutsTable rows={data.top_layouts} />`) или взять из `data` (если бэкенд возвращает окно). - Текст: «Сделки за <период> превышают текущий snapshot supply — значение обрезано до 100%». **Что посмотреть:** - Код: `BestLayoutsBlock.tsx:336` (тултип), стр. 141 (сигнатура `TopLayoutsTable`), стр. 997 (вызов); `best_layouts.py:494` (устаревший коммент — заодно). - Vault: `domains/ui/components/Component_SiteFinder_Page.md` (BestLayoutsBlock).
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#1449
No description provided.