[high] СЗЗ с упоминанием газ/электр ошибочно эскалируется в hard-blocker — вердикт «Нельзя» вместо «С ограничениями» #1341

Closed
opened 2026-06-14 18:08:43 +00:00 by bot-backend · 1 comment
Collaborator

Описание

Главный бизнес-ответ системы (можно ли строить МКД на участке) выдаётся неверным для участков с санитарно-защитной зоной (СЗЗ) газораспределительной станции/электроподстанции. Такая СЗЗ — по замыслу модуля warning (ограничение), а не абсолютный запрет, но классифицируется как blocker → can_build_mkd=False, verdict_label='Нельзя'. Девелопер отказывается от участка с допустимой застройкой.

Корень

В cad_zouit-ветке Check 2 проверка BLOCKER_TYPE_ZONE_KEYWORDS выполняется ПЕРВОЙ (if, строка 158), и только потом WARNING_TYPE_ZONE_KEYWORDS (elif, строка 168). BLOCKER-список содержит широкие подстроки 'газ' и 'электр'. type_zone вида «Санитарно-защитная зона газораспределительной станции» содержит 'газ' → ловится в blocker-ветку РАНЬШЕ, чем достигается СЗЗ-warning. Порядок проверок инвертирован относительно семантики: специфичный СЗЗ-маркер должен иметь приоритет над общими blocker-подстроками.

Evidence

gate_verdict.py:30-38:

BLOCKER_TYPE_ZONE_KEYWORDS = ("охранная зона", "трубопровод", "электр", "газ")
WARNING_TYPE_ZONE_KEYWORDS = ("сзз", "санитарно-защитная")

gate_verdict.py:158-176:

if any(kw in type_zone_lower for kw in BLOCKER_TYPE_ZONE_KEYWORDS):   # газ/электр СЗЗ ловится здесь
    blockers.append(Blocker(code="ZOUIT_CAD_BLOCKER", ...))
elif any(kw in type_zone_lower for kw in WARNING_TYPE_ZONE_KEYWORDS):  # недостижимо для газ/электр-СЗЗ
    warnings.append(Warning(code="ZOUIT_CAD_SZZ", ...))
# classify('Санитарно-защитная зона газораспределительной станции') -> BLOCKER

Существующий тест test_cad_zouit_szz_is_warning_not_blocker покрывает только «Санитарно-защитная зона предприятия» (без газ/электр) и проходит, не обнаруживая дефект.

Suggested fix

Проверять СЗЗ-маркеры (WARNING_TYPE_ZONE_KEYWORDS / 'сзз' / 'санитарно-защитная') ПЕРЕД blocker-проверкой: если type_zone — СЗЗ, классифицировать как warning независимо от наличия газ/электр. Либо ввести явный признак is_sanitary и if is_sanitary: warning elif is_protection_blocker: blocker. Добавить тест на «СЗЗ газораспределительной станции» и «СЗЗ электроподстанции».

Обоснование severity (high)

Это главный user-facing ответ системы. Неверный вердикт «Нельзя» отправляет девелопера в отказ по участкам, пригодным под застройку. Confidence 0.97, реальные type_zone из кадастра содержат такие формулировки.


week ревью 1 · multi-agent аудит 2026-06-14 · severity=high · category=logic

Затронутые файлы:

  • /Users/anton/Птица/gendesign/backend/app/services/site_finder/gate_verdict.py
## Описание Главный бизнес-ответ системы (можно ли строить МКД на участке) выдаётся неверным для участков с санитарно-защитной зоной (СЗЗ) газораспределительной станции/электроподстанции. Такая СЗЗ — по замыслу модуля warning (ограничение), а не абсолютный запрет, но классифицируется как blocker → `can_build_mkd=False`, `verdict_label='Нельзя'`. Девелопер отказывается от участка с допустимой застройкой. ## Корень В cad_zouit-ветке Check 2 проверка `BLOCKER_TYPE_ZONE_KEYWORDS` выполняется ПЕРВОЙ (`if`, строка 158), и только потом `WARNING_TYPE_ZONE_KEYWORDS` (`elif`, строка 168). BLOCKER-список содержит широкие подстроки `'газ'` и `'электр'`. `type_zone` вида «Санитарно-защитная зона газораспределительной станции» содержит `'газ'` → ловится в blocker-ветку РАНЬШЕ, чем достигается СЗЗ-warning. Порядок проверок инвертирован относительно семантики: специфичный СЗЗ-маркер должен иметь приоритет над общими blocker-подстроками. ## Evidence `gate_verdict.py:30-38`: ```python BLOCKER_TYPE_ZONE_KEYWORDS = ("охранная зона", "трубопровод", "электр", "газ") WARNING_TYPE_ZONE_KEYWORDS = ("сзз", "санитарно-защитная") ``` `gate_verdict.py:158-176`: ```python if any(kw in type_zone_lower for kw in BLOCKER_TYPE_ZONE_KEYWORDS): # газ/электр СЗЗ ловится здесь blockers.append(Blocker(code="ZOUIT_CAD_BLOCKER", ...)) elif any(kw in type_zone_lower for kw in WARNING_TYPE_ZONE_KEYWORDS): # недостижимо для газ/электр-СЗЗ warnings.append(Warning(code="ZOUIT_CAD_SZZ", ...)) # classify('Санитарно-защитная зона газораспределительной станции') -> BLOCKER ``` Существующий тест `test_cad_zouit_szz_is_warning_not_blocker` покрывает только «Санитарно-защитная зона предприятия» (без газ/электр) и проходит, не обнаруживая дефект. ## Suggested fix Проверять СЗЗ-маркеры (`WARNING_TYPE_ZONE_KEYWORDS` / 'сзз' / 'санитарно-защитная') ПЕРЕД blocker-проверкой: если `type_zone` — СЗЗ, классифицировать как warning независимо от наличия газ/электр. Либо ввести явный признак `is_sanitary` и `if is_sanitary: warning elif is_protection_blocker: blocker`. Добавить тест на «СЗЗ газораспределительной станции» и «СЗЗ электроподстанции». ## Обоснование severity (high) Это главный user-facing ответ системы. Неверный вердикт «Нельзя» отправляет девелопера в отказ по участкам, пригодным под застройку. Confidence 0.97, реальные `type_zone` из кадастра содержат такие формулировки. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**high** · category=`logic`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/backend/app/services/site_finder/gate_verdict.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:08:43 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:49 +00:00
Owner

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

Текущее состояние кода: gate_verdict.py:30-35 BLOCKER_TYPE_ZONE_KEYWORDS = ("охранная зона", "трубопровод", "электр", "газ"); :38 WARNING_TYPE_ZONE_KEYWORDS = ("сзз", "санитарно-защитная"). В cad_zouit-ветке Check 2: :158 if any(kw in type_zone_lower for kw in BLOCKER_TYPE_ZONE_KEYWORDS) стоит ПЕРВЫМ, :168 elif any(... WARNING_TYPE_ZONE_KEYWORDS) — вторым. type_zone «Санитарно-защитная зона газораспределительной станции» содержит подстроку 'газ' → ловится в blocker-ветку раньше, чем достигается СЗЗ-warning → blockers.append(ZOUIT_CAD_BLOCKER) → финал :217-219 can_build=False, label="Нельзя".

Корень: Инвертирован приоритет: широкие blocker-подстроки ('газ'/'электр') проверяются раньше специфичных СЗЗ-маркеров. Существующий тест test_cad_zouit_szz_is_warning_not_blocker покрывает только СЗЗ без газ/электр и не ловит дефект.

Что править:

  • Проверять WARNING_TYPE_ZONE_KEYWORDS ('сзз'/'санитарно-защитная') ПЕРЕД blocker-проверкой: если type_zone — СЗЗ, классифицировать warning независимо от наличия газ/электр.
  • Альтернатива: явный флаг is_sanitaryif is_sanitary: warning; elif blocker_kw: blocker.
  • Добавить тесты на «СЗЗ газораспределительной станции» и «СЗЗ электроподстанции».

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

  • Код: gate_verdict.py (константы :30-38, cad_zouit-ветка :154-186, финальный вердикт :215-225), compute_gate_verdict. Источник overlaps: quarter_dump_lookup.py cad_zouit path (:411 subcategory=None, source="cad_zouit").
  • Vault: domains/api/endpoints/Endpoint_Parcel_Analyze.md — документирует именно BLOCKER_TYPE_ZONE_KEYWORDS/WARNING_TYPE_ZONE_KEYWORDS для cad_zouit (блокеры охранная зона/трубопровод/электр/газ → ZOUIT_CAD_BLOCKER, сзз/санитарно-защитная → ZOUIT_CAD_SZZ).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `gate_verdict.py:30-35` `BLOCKER_TYPE_ZONE_KEYWORDS = ("охранная зона", "трубопровод", "электр", "газ")`; `:38` `WARNING_TYPE_ZONE_KEYWORDS = ("сзз", "санитарно-защитная")`. В cad_zouit-ветке Check 2: `:158` `if any(kw in type_zone_lower for kw in BLOCKER_TYPE_ZONE_KEYWORDS)` стоит ПЕРВЫМ, `:168` `elif any(... WARNING_TYPE_ZONE_KEYWORDS)` — вторым. `type_zone` «Санитарно-защитная зона газораспределительной станции» содержит подстроку 'газ' → ловится в blocker-ветку раньше, чем достигается СЗЗ-warning → `blockers.append(ZOUIT_CAD_BLOCKER)` → финал `:217-219` `can_build=False, label="Нельзя"`. **Корень:** Инвертирован приоритет: широкие blocker-подстроки ('газ'/'электр') проверяются раньше специфичных СЗЗ-маркеров. Существующий тест `test_cad_zouit_szz_is_warning_not_blocker` покрывает только СЗЗ без газ/электр и не ловит дефект. **Что править:** - Проверять `WARNING_TYPE_ZONE_KEYWORDS` ('сзз'/'санитарно-защитная') ПЕРЕД blocker-проверкой: если `type_zone` — СЗЗ, классифицировать warning независимо от наличия газ/электр. - Альтернатива: явный флаг `is_sanitary` → `if is_sanitary: warning; elif blocker_kw: blocker`. - Добавить тесты на «СЗЗ газораспределительной станции» и «СЗЗ электроподстанции». **Что посмотреть:** - Код: `gate_verdict.py` (константы `:30-38`, cad_zouit-ветка `:154-186`, финальный вердикт `:215-225`), `compute_gate_verdict`. Источник overlaps: `quarter_dump_lookup.py` cad_zouit path (`:411` `subcategory=None`, `source="cad_zouit"`). - Vault: `domains/api/endpoints/Endpoint_Parcel_Analyze.md` — документирует именно `BLOCKER_TYPE_ZONE_KEYWORDS`/`WARNING_TYPE_ZONE_KEYWORDS` для cad_zouit (блокеры охранная зона/трубопровод/электр/газ → `ZOUIT_CAD_BLOCKER`, сзз/санитарно-защитная → `ZOUIT_CAD_SZZ`).
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#1341
No description provided.