fix(ptica): подпись сетевого обременения называет все виды, а не первый (#2464) #3001

Merged
bot-backend merged 1 commit from fix/2464-zouit-label into main 2026-08-20 18:53:33 +00:00
Collaborator

Дефект

cad_utility_label брался от первого overlap'а с распознанным network_kind, а покрытие агрегировалось по всему bucket'у. Участок под двумя видами охранных зон получал конкретную причину, дающую малую часть площади.

Вот что печатает origin/main на паре «теплосеть 10 % + инженерные коммуникации 64 %»:

Сетевое обременение (теплоснабжение) покрывает 74% участка — застройка МКД невозможна

Названа сеть, дающая 10 %. 64 % площади — от другой.

Это не редкость

Прод 20.08.2026, спатиальный self-join по cad_zouit:

пересечения охранных зон РАЗНЫХ видов:  316 пар, 155 зон вовлечено
    150  тепловых сетей          × инженерных коммуникаций
    146  инженерных коммуникаций × тепловых сетей
     12  электроэнергетики       × инженерных коммуникаций
      3  инженерных коммуникаций × трубопроводов

Правка

Копятся все различённые виды, называются через запятую, множественное число когда их больше одного. Покрытие — их объединение, и подпись это отражает.

Заодно снята зависимость от порядка: подпись бралась от первого overlap'а, а порядок задаёт ORDER BY reg_numb_border, id — к покрытию он отношения не имеет. Виды сортируются.

Довод пункта эпика не подтвердился — вывод подтвердился

Пункт говорит о смешении сетевых зон с keyword-совпадениями без network_kind. Проверил классификацию всех 3493 строк cad_zouit кодом из репозитория:

СЗЗ-предупреждение:              103
сеть распознана (даёт подпись):  1936
только по ключевому слову:          0   ← популяции, о которой пункт, НЕ СУЩЕСТВУЕТ
прочее (generic warning):        1454

classify_network_zone уже покрывает все шаблоны, встречающиеся в данных. То есть вывод пункта («конкретная причина приписывается чужой площади») верен, а механизм — другой: смешиваются разные виды сетей между собой.

Записываю это прямо, потому что чинил бы не то, если бы поверил формулировке.

Как проверено

  • Двусторонне: против origin/main три теста красные; головной падает с полной строкой, которую увидел бы пользователь.
  • Контроли, зелёные с обеих сторон: один вид → прежняя формулировка в единственном числе; две зоны одного вида → в подписи он один раз; area-gate не тронут (тонкая полоса остаётся warning, а не blocker).
  • Контроль детерминизма: перестановка overlap'ов местами не меняет подпись.
  • pytest backend/tests/test_gate_verdict.py backend/tests/services/site_finder/ — 727 passed.

Часть эпика #2464.

## Дефект `cad_utility_label` брался от **первого** overlap'а с распознанным `network_kind`, а покрытие агрегировалось по **всему** bucket'у. Участок под двумя видами охранных зон получал конкретную причину, дающую малую часть площади. Вот что печатает `origin/main` на паре «теплосеть 10 % + инженерные коммуникации 64 %»: ``` Сетевое обременение (теплоснабжение) покрывает 74% участка — застройка МКД невозможна ``` Названа сеть, дающая 10 %. 64 % площади — от другой. ## Это не редкость Прод 20.08.2026, спатиальный self-join по `cad_zouit`: ``` пересечения охранных зон РАЗНЫХ видов: 316 пар, 155 зон вовлечено 150 тепловых сетей × инженерных коммуникаций 146 инженерных коммуникаций × тепловых сетей 12 электроэнергетики × инженерных коммуникаций 3 инженерных коммуникаций × трубопроводов ``` ## Правка Копятся **все** различённые виды, называются через запятую, множественное число когда их больше одного. Покрытие — их объединение, и подпись это отражает. Заодно снята зависимость от порядка: подпись бралась от первого overlap'а, а порядок задаёт `ORDER BY reg_numb_border, id` — к покрытию он отношения не имеет. Виды сортируются. ## Довод пункта эпика не подтвердился — вывод подтвердился Пункт говорит о смешении сетевых зон с **keyword-совпадениями без `network_kind`**. Проверил классификацию всех 3493 строк `cad_zouit` кодом из репозитория: ``` СЗЗ-предупреждение: 103 сеть распознана (даёт подпись): 1936 только по ключевому слову: 0 ← популяции, о которой пункт, НЕ СУЩЕСТВУЕТ прочее (generic warning): 1454 ``` `classify_network_zone` уже покрывает все шаблоны, встречающиеся в данных. То есть **вывод** пункта («конкретная причина приписывается чужой площади») верен, а **механизм** — другой: смешиваются разные виды сетей между собой. Записываю это прямо, потому что чинил бы не то, если бы поверил формулировке. ## Как проверено - **Двусторонне:** против `origin/main` три теста красные; головной падает с полной строкой, которую увидел бы пользователь. - **Контроли, зелёные с обеих сторон:** один вид → прежняя формулировка в единственном числе; две зоны одного вида → в подписи он один раз; area-gate не тронут (тонкая полоса остаётся warning, а не blocker). - **Контроль детерминизма:** перестановка overlap'ов местами не меняет подпись. - `pytest backend/tests/test_gate_verdict.py backend/tests/services/site_finder/` — 727 passed. Часть эпика #2464.
bot-backend added 1 commit 2026-08-20 18:30:48 +00:00
fix(ptica): подпись сетевого обременения называет все виды, а не первый (#2464)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m0s
CI / backend-tests (pull_request) Successful in 17m6s
b1dc5d5507
`cad_utility_label` брался от ПЕРВОГО overlap'а с распознанным
`network_kind`, а покрытие агрегировалось по ВСЕМУ bucket'у. Участок под
двумя видами охранных зон получал в отчёте конкретную причину, дающую
малую часть площади:

    «Сетевое обременение (теплоснабжение) покрывает 74% участка»
     ← теплоснабжение даёт 10%, остальные 64% — инженерные коммуникации

Это не редкость. Прод 20.08.2026: 316 пересечений охранных зон РАЗНЫХ
видов, 155 зон вовлечено; самая частая пара — «тепловых сетей» ×
«инженерных коммуникаций» (296 из 316).

Теперь копятся ВСЕ различённые виды и называются через запятую;
множественное число, когда их больше одного. Покрытие — их объединение,
и подпись это отражает.

Заодно снята зависимость от порядка: подпись бралась от первого overlap'а,
а он определяется `ORDER BY reg_numb_border, id`, который к покрытию
отношения не имеет. Виды сортируются.

Проверка попутно опровергла ДОВОД пункта эпика. Пункт говорит о смешении
сетевых зон с keyword-совпадениями без network_kind. На проде таких ноль:
из 3493 строк cad_zouit — 103 СЗЗ-предупреждения, 1936 с распознанной
сетью, 1454 generic warning, и НИ ОДНОЙ «только по ключевому слову»
(classify_network_zone уже покрывает все встречающиеся шаблоны). Вывод
пункта — «конкретная причина приписывается чужой площади» — верен, но по
другой причине: смешиваются РАЗНЫЕ ВИДЫ СЕТЕЙ, а не сети с keyword'ами.

Двусторонне: против origin/main три теста красные, головной — с полной
строкой, которую увидел бы пользователь. Контроли зелёные с обеих сторон:
один вид сохраняет прежнюю формулировку в единственном числе, две зоны
одного вида не дают дубль в подписи, area-gate не тронут (тонкая полоса
остаётся warning).

pytest test_gate_verdict + services/site_finder — 727 passed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit c979cf886a into main 2026-08-20 18:53:33 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#3001
No description provided.