(medium) ConceptVariantsResult/VariantPanel: FAR (безразмерный) подписан единицей «м²/га» — неверная единица и рассинхрон с PDF движка #1441

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

Severity: medium · Категория: report · Файл: frontend/src/components/concept/ConceptVariantsResult.tsx:111-113, 160-164

ConceptVariantsResult.tsx:112 (headline «плотность {teap.density.toLocaleString('ru-RU')} м²/га») и :161-164 (KpiCard label='Плотность', value=teap.density, unit='м²/га'). По контракту teap.density — это FAR = GFA / площадь участка (безразмерный коэффициент). Подтверждено backend: teap.py:11,81,91 — density = total_floor_area / site_area_sqm, round(density,3), типичное значение 1.5–3.0; собственный PDF-экспортёр pdf.py:77 подписывает поле как «Плотность (FAR)» и печатает f'{v.teap.density:.2f}'. Frontend приписывает безразмерному FAR единицу «м²/га» и показывает крошечное число (напр. «2,345 м²/га»). Импакт: единица семантически неверна (FAR ≠ плотность в м²/га; настоящая плотность была бы тысячи), и UI рассинхронизирован с PDF того же движка — финдиректор видит в UI «2,3 м²/га», в PDF «Плотность (FAR) 2,35». Фикс: убрать unit='м²/га', переименовать label/headline в «Плотность застройки (FAR)» (как в PDF), значение оставить безразмерным.

Почему баг: Backend backend/app/services/generative/teap.py:11,81,91 явно определяет density = FAR = total_floor_area / site_area_sqm и округляет до 3 знаков (round(density,3)) — типичное значение порядка 1.5–3.0. Собственный backend-экспортёр backend/app/services/generative/exporters/pdf.py:77 подписывает это поле как «Плотность (FAR)» и печатает f'{v.teap.density:.2f}'. Frontend же приписывает безразмерному FAR единицу «м²/га» и показывает крошечное число (напр. «2.345 м²/га»), что и фактически неверно по смыслу (FAR ≠ плотность в м²/га; настоящая плотность в м²/га была бы порядка тысяч), и рассинхронизировано с PDF-отчётом того же движка. Финдиректор видит в UI одно («2.3 м²/га»), а в выгруженном PDF другое («Плотность (FAR) 2.35») — прямое враньё в клиентском показателе.

Как чинить: Убрать unit='м²/га' и текст «м²/га», подписать показатель как «Плотность застройки (FAR)» (или «Коэф. плотности, FAR»), форматировать как число с 2 знаками (toFixed(2)) — синхронно с backend PDF. Если действительно нужна плотность в м²/га, её надо считать как GFA/площадь_участка_в_га на backend и менять контракт, а не клеить единицу к FAR.


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

**Severity:** medium · **Категория:** report · **Файл:** `frontend/src/components/concept/ConceptVariantsResult.tsx:111-113, 160-164` ConceptVariantsResult.tsx:112 (headline «плотность {teap.density.toLocaleString('ru-RU')} м²/га») и :161-164 (KpiCard label='Плотность', value=teap.density, unit='м²/га'). По контракту teap.density — это FAR = GFA / площадь участка (безразмерный коэффициент). Подтверждено backend: teap.py:11,81,91 — density = total_floor_area / site_area_sqm, round(density,3), типичное значение 1.5–3.0; собственный PDF-экспортёр pdf.py:77 подписывает поле как «Плотность (FAR)» и печатает f'{v.teap.density:.2f}'. Frontend приписывает безразмерному FAR единицу «м²/га» и показывает крошечное число (напр. «2,345 м²/га»). Импакт: единица семантически неверна (FAR ≠ плотность в м²/га; настоящая плотность была бы тысячи), и UI рассинхронизирован с PDF того же движка — финдиректор видит в UI «2,3 м²/га», в PDF «Плотность (FAR) 2,35». Фикс: убрать unit='м²/га', переименовать label/headline в «Плотность застройки (FAR)» (как в PDF), значение оставить безразмерным. **Почему баг:** Backend backend/app/services/generative/teap.py:11,81,91 явно определяет density = FAR = total_floor_area / site_area_sqm и округляет до 3 знаков (round(density,3)) — типичное значение порядка 1.5–3.0. Собственный backend-экспортёр backend/app/services/generative/exporters/pdf.py:77 подписывает это поле как «Плотность (FAR)» и печатает f'{v.teap.density:.2f}'. Frontend же приписывает безразмерному FAR единицу «м²/га» и показывает крошечное число (напр. «2.345 м²/га»), что и фактически неверно по смыслу (FAR ≠ плотность в м²/га; настоящая плотность в м²/га была бы порядка тысяч), и рассинхронизировано с PDF-отчётом того же движка. Финдиректор видит в UI одно («2.3 м²/га»), а в выгруженном PDF другое («Плотность (FAR) 2.35») — прямое враньё в клиентском показателе. **Как чинить:** Убрать unit='м²/га' и текст «м²/га», подписать показатель как «Плотность застройки (FAR)» (или «Коэф. плотности, FAR»), форматировать как число с 2 знаками (toFixed(2)) — синхронно с backend PDF. Если действительно нужна плотность в м²/га, её надо считать как GFA/площадь_участка_в_га на backend и менять контракт, а не клеить единицу к FAR. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.92 · unit U90</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:38 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:05 +00:00
Owner

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

Текущее состояние кода: проверял против forgejo/main (canonical prod), т.к. в текущей рабочей ветке feat/cian-city-sweep-schedule модуль generative оказался в stale-состоянии (локальный backend/app/services/generative/teap.py — 5-строчный stub). На prod:

  • forgejo/main:frontend/src/components/concept/ConceptVariantsResult.tsx:112 — headline плотность {teap.density.toLocaleString("ru-RU")} м²/га.
  • forgejo/main:frontend/src/components/concept/ConceptVariantsResult.tsx:163unit="м²/га" в KpiCard «Плотность».
  • forgejo/main:backend/app/services/generative/teap.py:81density = total_floor_area / site_area_sqm if site_area_sqm > 0 else 0.0, :91 density=round(density, 3), docstring :11 «плотность застройки = FAR = GFA / площадь участка».
  • forgejo/main:backend/app/services/generative/exporters/pdf.py:77("Плотность (FAR)", [f"{v.teap.density:.2f}" for v in variants]).

Корень: teap.density по контракту — безразмерный FAR (GFA / площадь участка, типично 1.5–3.0). Frontend приписывает ему единицу «м²/га» (112, 163) и показывает крошечное число (напр. «2,345 м²/га»), что семантически неверно (настоящая плотность в м²/га была бы тысячи) и рассинхронизировано с PDF того же движка, где поле подписано «Плотность (FAR)» и форматируется :.2f.

Что править (frontend — scope/frontend, не backend):

  • В ConceptVariantsResult.tsx: убрать unit="м²/га" (:163) и текст «м²/га» из headline (:112); подписать показатель «Плотность застройки (FAR)» (как в backend PDF), формат toFixed(2) синхронно с pdf.py.
  • Если действительно нужна плотность в м²/га — считать GFA / площадь_участка_в_га на backend и менять контракт, а не клеить единицу к FAR.

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

  • Код: frontend/src/components/concept/ConceptVariantsResult.tsx:111-113, 160-164; backend reference teap.py:60-91, exporters/pdf.py:77. NB: issue помечен scope/backend, но правка фронтовая (FAR на бэке корректен) — переразметить на scope/frontend. Тест: snapshot/unit на рендер KpiCard «Плотность» без единицы «м²/га».
  • Vault: релевантных заметок по FAR/density-единице не найдено (concept variants TEAP density FAR — пусто).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** проверял против `forgejo/main` (canonical prod), т.к. в текущей рабочей ветке `feat/cian-city-sweep-schedule` модуль generative оказался в stale-состоянии (локальный `backend/app/services/generative/teap.py` — 5-строчный stub). На prod: - `forgejo/main:frontend/src/components/concept/ConceptVariantsResult.tsx:112` — headline `плотность {teap.density.toLocaleString("ru-RU")} м²/га.` - `forgejo/main:frontend/src/components/concept/ConceptVariantsResult.tsx:163` — `unit="м²/га"` в KpiCard «Плотность». - `forgejo/main:backend/app/services/generative/teap.py:81` — `density = total_floor_area / site_area_sqm if site_area_sqm > 0 else 0.0`, `:91` `density=round(density, 3)`, docstring `:11` «плотность застройки = FAR = GFA / площадь участка». - `forgejo/main:backend/app/services/generative/exporters/pdf.py:77` — `("Плотность (FAR)", [f"{v.teap.density:.2f}" for v in variants])`. **Корень:** `teap.density` по контракту — безразмерный FAR (GFA / площадь участка, типично 1.5–3.0). Frontend приписывает ему единицу «м²/га» (112, 163) и показывает крошечное число (напр. «2,345 м²/га»), что семантически неверно (настоящая плотность в м²/га была бы тысячи) и рассинхронизировано с PDF того же движка, где поле подписано «Плотность (FAR)» и форматируется `:.2f`. **Что править (frontend — scope/frontend, не backend):** - В `ConceptVariantsResult.tsx`: убрать `unit="м²/га"` (:163) и текст «м²/га» из headline (:112); подписать показатель «Плотность застройки (FAR)» (как в backend PDF), формат `toFixed(2)` синхронно с pdf.py. - Если действительно нужна плотность в м²/га — считать `GFA / площадь_участка_в_га` на backend и менять контракт, а не клеить единицу к FAR. **Что посмотреть:** - Код: `frontend/src/components/concept/ConceptVariantsResult.tsx:111-113, 160-164`; backend reference `teap.py:60-91`, `exporters/pdf.py:77`. NB: issue помечен `scope/backend`, но правка фронтовая (FAR на бэке корректен) — переразметить на `scope/frontend`. Тест: snapshot/unit на рендер KpiCard «Плотность» без единицы «м²/га». - Vault: релевантных заметок по FAR/density-единице не найдено (`concept variants TEAP density FAR` — пусто).
bot-backend added
scope/frontend
and removed
scope/backend
labels 2026-06-15 11:32:44 +00:00
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#1441
No description provided.