(high) QuartirographyChart.tsx/portfolioMap: бар «Студии» в портфеле всегда 0 — график противоречит вердикту «52% — студии и однушки» #1405

Closed
opened 2026-06-15 05:53:35 +00:00 by bot-backend · 2 comments
Collaborator

Severity: high · Категория: report · Файл: frontend/src/components/analytics/QuartirographyChart.tsx:19-35

frontend/src/components/analytics/QuartirographyChart.tsx:19-35. Ось buckets (стр.19-25) содержит 5 категорий, первая — "Студии 15-30". Но portfolioMap (стр.26-31) определяет только 4 ключа: "1-к 30-45", "2-к 45-60", "3-к 60-80", "80+ м²" — ключа "Студии 15-30" нет. На стр.35 portfolioPercents = buckets.map((b) => portfolioMap[b] ?? 0) для первой категории даёт portfolioMap["Студии 15-30"] = undefined → ?? 0 → ВСЕГДА 0. Серый бар «Что строится (портфель)» для студий всегда пустой. Корень: backend portfolio-запрос (analytics_queries.py:88-102) отдаёт бакеты по числу комнат ONE/TWO/THREE/FOUR → "1-к"/"2-к"/"3-к"/"4+" и НЕ содержит студийного бакета вообще; deals-запрос (стр.152-158) отдаёт "Студии 15-30" по площади. Импакт: текст под графиком (page.tsx:114-116) утверждает финдиректору «52% портфеля — инвесторские студии и однушки», а на графике доля студий в портфеле = 0 — прямое видимое противоречие вердикта и визуализации; сумма видимых процентов портфеля ≠ 100%. Как чинить: согласовать бакетизацию портфеля и сделок в одних единицах (площадь area_per_unit) на backend, либо честно показать, что портфель не разделяет студии/1-к (объединить категории оси), и убрать ось, которой портфель не соответствует.

Почему баг: Сам текст под графиком (page.tsx:114-116) утверждает финдиректору: «предложение перекошено в сторону инвесторских студий и однушек (52% портфеля)». На графике же доля студий в портфеле = 0 — клиент видит прямое противоречие между вердиктом и визуализацией. Плюс доля студий выпадает из распределения, и сумма видимых процентов портфеля больше не равна 100%. Backend для deals честно отдаёт бакет "Студии 15-30" (analytics_queries.py:153), для portfolio же бакеты — это типы по числу комнат (ONE/TWO/THREE/FOUR, стр.91-94); студии DOM.РФ (roomCountType STUDIO/ZERO) загрузчик 11_load_domrf.py:114 кладёт без whitelist, и портфельный запрос их не сворачивает в "1-к" → frontend такой бакет не маппит и молча теряет.

Как чинить: Сложить студии в портфельный ряд: либо добавить в portfolioMap ключ "Студии 15-30" (маппинг на портфельный бакет студий, как только backend начнёт его отдавать отдельной категорией), либо если DOM.РФ не разделяет студии — убрать категорию «Студии 15-30» из buckets, чтобы ось и текст не обещали данные, которых в портфеле нет. Согласовать с текстом вердикта в page.tsx.


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

**Severity:** high · **Категория:** report · **Файл:** `frontend/src/components/analytics/QuartirographyChart.tsx:19-35` frontend/src/components/analytics/QuartirographyChart.tsx:19-35. Ось `buckets` (стр.19-25) содержит 5 категорий, первая — "Студии 15-30". Но `portfolioMap` (стр.26-31) определяет только 4 ключа: "1-к 30-45", "2-к 45-60", "3-к 60-80", "80+ м²" — ключа "Студии 15-30" нет. На стр.35 `portfolioPercents = buckets.map((b) => portfolioMap[b] ?? 0)` для первой категории даёт `portfolioMap["Студии 15-30"]` = undefined → `?? 0` → ВСЕГДА 0. Серый бар «Что строится (портфель)» для студий всегда пустой. Корень: backend portfolio-запрос (analytics_queries.py:88-102) отдаёт бакеты по числу комнат ONE/TWO/THREE/FOUR → "1-к"/"2-к"/"3-к"/"4+" и НЕ содержит студийного бакета вообще; deals-запрос (стр.152-158) отдаёт "Студии 15-30" по площади. Импакт: текст под графиком (page.tsx:114-116) утверждает финдиректору «52% портфеля — инвесторские студии и однушки», а на графике доля студий в портфеле = 0 — прямое видимое противоречие вердикта и визуализации; сумма видимых процентов портфеля ≠ 100%. Как чинить: согласовать бакетизацию портфеля и сделок в одних единицах (площадь area_per_unit) на backend, либо честно показать, что портфель не разделяет студии/1-к (объединить категории оси), и убрать ось, которой портфель не соответствует. **Почему баг:** Сам текст под графиком (page.tsx:114-116) утверждает финдиректору: «предложение перекошено в сторону инвесторских студий и однушек (52% портфеля)». На графике же доля студий в портфеле = 0 — клиент видит прямое противоречие между вердиктом и визуализацией. Плюс доля студий выпадает из распределения, и сумма видимых процентов портфеля больше не равна 100%. Backend для deals честно отдаёт бакет "Студии 15-30" (analytics_queries.py:153), для portfolio же бакеты — это типы по числу комнат (ONE/TWO/THREE/FOUR, стр.91-94); студии DOM.РФ (roomCountType STUDIO/ZERO) загрузчик 11_load_domrf.py:114 кладёт без whitelist, и портфельный запрос их не сворачивает в "1-к" → frontend такой бакет не маппит и молча теряет. **Как чинить:** Сложить студии в портфельный ряд: либо добавить в portfolioMap ключ "Студии 15-30" (маппинг на портфельный бакет студий, как только backend начнёт его отдавать отдельной категорией), либо если DOM.РФ не разделяет студии — убрать категорию «Студии 15-30» из buckets, чтобы ось и текст не обещали данные, которых в портфеле нет. Согласовать с текстом вердикта в page.tsx. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.95 · unit U72</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:53:35 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:01:59 +00:00
Owner

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

Текущее состояние кода: frontend/src/components/analytics/QuartirographyChart.tsx:19-35. buckets (стр.19-25) = 5 категорий, первая "Студии 15-30". portfolioMap (стр.26-31) задаёт только 4 ключа: "1-к 30-45", "2-к 45-60", "3-к 60-80", "80+ м²" — ключа "Студии 15-30" нет.

Корень: portfolioPercents = buckets.map((b) => portfolioMap[b] ?? 0) (стр.35) для первой категории даёт portfolioMap["Студии 15-30"] = undefined?? 0 → серый бар «Что строится (портфель)» для студий ВСЕГДА 0. Текст вердикта frontend/src/app/analytics/page.tsx:114-115 («37% сделок — 80+ м², 52% портфеля — студии и однушки») и title analytics/page.tsx:102 «Парадокс портфеля» прямо противоречат пустому бару студий; сумма видимых процентов портфеля ≠ 100%.

Что править:

  • Согласовать бакетизацию: либо backend начинает отдавать студийный бакет портфеля (DOM.РФ roomCountType STUDIO/ZERO) и в portfolioMap добавляется ключ "Студии 15-30", либо — если портфель не разделяет студии — убрать категорию "Студии 15-30" из buckets, чтобы ось/текст не обещали отсутствующие данные. Связано с #1406/#1436 (общая первопричина — рассогласование осей портфеля и сделок).

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

  • Код: QuartirographyChart.tsx:19-35, lib/analytics-api.ts (useQuartirographyPortfolio/useQuartirographyDeals), backend analytics_queries.py (portfolio-запрос по room_count_type vs deals по площади), app/analytics/page.tsx:102,114-115.
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/components/analytics/QuartirographyChart.tsx:19-35`. `buckets` (стр.19-25) = 5 категорий, первая `"Студии 15-30"`. `portfolioMap` (стр.26-31) задаёт только 4 ключа: `"1-к 30-45"`, `"2-к 45-60"`, `"3-к 60-80"`, `"80+ м²"` — ключа `"Студии 15-30"` нет. **Корень:** `portfolioPercents = buckets.map((b) => portfolioMap[b] ?? 0)` (стр.35) для первой категории даёт `portfolioMap["Студии 15-30"]` = `undefined` → `?? 0` → серый бар «Что строится (портфель)» для студий ВСЕГДА 0. Текст вердикта `frontend/src/app/analytics/page.tsx:114-115` («37% сделок — 80+ м², 52% портфеля — студии и однушки») и title `analytics/page.tsx:102` «Парадокс портфеля» прямо противоречат пустому бару студий; сумма видимых процентов портфеля ≠ 100%. **Что править:** - Согласовать бакетизацию: либо backend начинает отдавать студийный бакет портфеля (DOM.РФ roomCountType STUDIO/ZERO) и в `portfolioMap` добавляется ключ `"Студии 15-30"`, либо — если портфель не разделяет студии — убрать категорию `"Студии 15-30"` из `buckets`, чтобы ось/текст не обещали отсутствующие данные. Связано с #1406/#1436 (общая первопричина — рассогласование осей портфеля и сделок). **Что посмотреть:** - Код: `QuartirographyChart.tsx:19-35`, `lib/analytics-api.ts` (`useQuartirographyPortfolio`/`useQuartirographyDeals`), backend `analytics_queries.py` (portfolio-запрос по room_count_type vs deals по площади), `app/analytics/page.tsx:102,114-115`. - Vault: релевантных заметок не найдено.
bot-backend added the
needs-human
label 2026-06-15 16:44:04 +00:00
Owner

Проверка по forgejo/main: дефект уже устранён. QuartirographyChart.tsx:26-27,31 — «Студии 15-30» маппится в null с явным комментарием (DOM.РФ portfolio не имеет studio-сегмента), серый 0%-бар больше не рисуется. Закрываю как stale (фикс вне #1543).

Проверка по `forgejo/main`: дефект уже устранён. `QuartirographyChart.tsx:26-27,31` — «Студии 15-30» маппится в `null` с явным комментарием (DOM.РФ portfolio не имеет studio-сегмента), серый 0%-бар больше не рисуется. Закрываю как stale (фикс вне #1543).
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#1405
No description provided.