(high) Section2NetworksUtilities.buildSubtitle: газ/водопровод теряются в подзаголовке (неверные subtype-ключи) #1464

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

Severity: high · Категория: report · Файл: frontend/src/components/site-finder/analysis/Section2NetworksUtilities.tsx:134-150

Section2NetworksUtilities.tsx:140-145 — buildSubtitle ищет газ как items.find(i => i.subtype === 'pipeline') и воду как i.subtype === 'water_intake'. Backend (noise_loader.py:50-62) для газа отдаёт 'gas_pipeline' ('pipeline' — это generic man_made=pipeline без вещества, строка 47), для воды — 'water_main'/'water_works'/'water_tower', никогда 'water_intake'. Следствие: в headline-подзаголовке '2. Сети' расстояния 'газ N м' и 'водопровод N м' не показываются даже при наличии данных, либо 'газ' ошибочно подхватывается из generic-трубы неизвестной субстанции. Электричество частично работает (substation/power_line совпадают, строки 137-139). Импакт: клиент видит fallback 'данные из НСПД…' или неполный список вместо фактических дистанций. Это тот же корневой дефект, что и #0 (рассинхрон subtype-литералов фронта с backend road_class). Чинить вместе с #0: gas → 'gas_pipeline', water → ['water_main','water_works','water_tower'].

Почему баг: Те же реальные значения subtype из noise_loader.py:50-62 (gas_pipeline, water_main, …) не совпадают с литералами 'pipeline'/'water_intake' в find(). Электричество отчасти работает (substation/power_line есть), но газ/вода в подзаголовке теряются → клиент видит '… данные из НСПД…' fallback или неполный список вместо фактических дистанций.

Как чинить: Сопоставлять с фактическими ключами: gas = i.subtype === 'gas_pipeline'; water = ['water_main','water_works','water_tower'].includes(i.subtype). При нескольких — брать min(nearest_m), как делает backend _nearest().


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

**Severity:** high · **Категория:** report · **Файл:** `frontend/src/components/site-finder/analysis/Section2NetworksUtilities.tsx:134-150` Section2NetworksUtilities.tsx:140-145 — buildSubtitle ищет газ как items.find(i => i.subtype === 'pipeline') и воду как i.subtype === 'water_intake'. Backend (noise_loader.py:50-62) для газа отдаёт 'gas_pipeline' ('pipeline' — это generic man_made=pipeline без вещества, строка 47), для воды — 'water_main'/'water_works'/'water_tower', никогда 'water_intake'. Следствие: в headline-подзаголовке '2. Сети' расстояния 'газ N м' и 'водопровод N м' не показываются даже при наличии данных, либо 'газ' ошибочно подхватывается из generic-трубы неизвестной субстанции. Электричество частично работает (substation/power_line совпадают, строки 137-139). Импакт: клиент видит fallback 'данные из НСПД…' или неполный список вместо фактических дистанций. Это тот же корневой дефект, что и #0 (рассинхрон subtype-литералов фронта с backend road_class). Чинить вместе с #0: gas → 'gas_pipeline', water → ['water_main','water_works','water_tower']. **Почему баг:** Те же реальные значения subtype из noise_loader.py:50-62 (gas_pipeline, water_main, …) не совпадают с литералами 'pipeline'/'water_intake' в find(). Электричество отчасти работает (substation/power_line есть), но газ/вода в подзаголовке теряются → клиент видит '… данные из НСПД…' fallback или неполный список вместо фактических дистанций. **Как чинить:** Сопоставлять с фактическими ключами: gas = i.subtype === 'gas_pipeline'; water = ['water_main','water_works','water_tower'].includes(i.subtype). При нескольких — брать min(nearest_m), как делает backend _nearest(). --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.92 · unit U98</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:56:45 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:08 +00:00
Owner

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

Текущее состояние кода: frontend/src/components/site-finder/analysis/Section2NetworksUtilities.tsx:133-149 (buildSubtitle): электричество i.subtype === "substation" || "power_line" (стр.136-138), газ i.subtype === "pipeline" (стр.139), вода i.subtype === "water_intake" (стр.140). Backend-источник subtype — колонка road_class в osm_noise_sources_ekb, заполняется 4-м элементом тэг-кортежей noise_loader.py:45-54; группировка/выдача — backend/app/api/v1/parcels.py:1900-1913 (subtype = r["road_class"]).

Корень (уточнение к телу issue):

  • Газ — НЕ подтверждается. noise_loader.py:47 отдаёт ("man_made","pipeline","utility","pipeline") → subtype = pipeline (НЕ gas_pipeline; литерала gas_pipeline в loader нет вовсе). Фронт i.subtype === "pipeline" (стр.139) этому ЗНАЧЕНИЮ соответствует. Оговорка: pipeline — generic man_made без вещества, т.е. подпись «газ» семантически неточна (может быть не газ), но subtype-литерал совпадает и расстояние показывается.
  • Вода — ПОДТВЕРЖДЕНО. Backend отдаёт water_works (стр.49), water_tower (стр.51); water_intake не существует. Фронт i.subtype === "water_intake" (стр.140) никогда не матчит → «водопровод N м» не показывается даже при наличии данных.

Что править:

  • Вода: ['water_works','water_tower'].includes(i.subtype) (а не water_intake); при нескольких узлах брать min(nearest_m). Бэкенд уже группирует по subtype и отдаёт ближайший, но фронту нужен поиск по нескольким ключам.
  • Газ: оставить pipeline (литерал верный); опц. уточнить подпись «трубопровод» вместо «газ» т.к. вещество неизвестно. Рекоменд. issue gas_pipeline неприменима — такого subtype бэкенд не эмитит.

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

  • Код: Section2NetworksUtilities.tsx:133-149; noise_loader.py:45-54; parcels.py:1900-1913 (фактический shape subtype); UtilitySummaryItem тип.
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ЧАСТИЧНО)** **Текущее состояние кода:** `frontend/src/components/site-finder/analysis/Section2NetworksUtilities.tsx:133-149` (`buildSubtitle`): электричество `i.subtype === "substation" || "power_line"` (стр.136-138), газ `i.subtype === "pipeline"` (стр.139), вода `i.subtype === "water_intake"` (стр.140). Backend-источник subtype — колонка `road_class` в `osm_noise_sources_ekb`, заполняется 4-м элементом тэг-кортежей `noise_loader.py:45-54`; группировка/выдача — `backend/app/api/v1/parcels.py:1900-1913` (`subtype = r["road_class"]`). **Корень (уточнение к телу issue):** - **Газ — НЕ подтверждается.** `noise_loader.py:47` отдаёт `("man_made","pipeline","utility","pipeline")` → subtype = `pipeline` (НЕ `gas_pipeline`; литерала `gas_pipeline` в loader нет вовсе). Фронт `i.subtype === "pipeline"` (стр.139) этому ЗНАЧЕНИЮ соответствует. Оговорка: `pipeline` — generic man_made без вещества, т.е. подпись «газ» семантически неточна (может быть не газ), но subtype-литерал совпадает и расстояние показывается. - **Вода — ПОДТВЕРЖДЕНО.** Backend отдаёт `water_works` (стр.49), `water_tower` (стр.51); `water_intake` не существует. Фронт `i.subtype === "water_intake"` (стр.140) никогда не матчит → «водопровод N м» не показывается даже при наличии данных. **Что править:** - Вода: `['water_works','water_tower'].includes(i.subtype)` (а не `water_intake`); при нескольких узлах брать `min(nearest_m)`. Бэкенд уже группирует по subtype и отдаёт ближайший, но фронту нужен поиск по нескольким ключам. - Газ: оставить `pipeline` (литерал верный); опц. уточнить подпись «трубопровод» вместо «газ» т.к. вещество неизвестно. Рекоменд. issue `gas_pipeline` неприменима — такого subtype бэкенд не эмитит. **Что посмотреть:** - Код: `Section2NetworksUtilities.tsx:133-149`; `noise_loader.py:45-54`; `parcels.py:1900-1913` (фактический shape subtype); `UtilitySummaryItem` тип. - 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#1464
No description provided.