cad_zouit содержит ~1930 сетевых охранных зон (тепло 548/электро 69/газ 23/связь 9/
инж.коммуникации 1281), но analyze отдавал их общими ЗОУИТ-overlaps без сетевого среза.
Pure-function classify_network_zone (type_zone→NetworkKind), сверен с prod distinct.
Overlap-строки cad_zouit несут is_network_zone/network_kind/network_kind_label; gate_verdict
даёт выделенный blocker ZOUIT_NETWORK_OBREMENENIE с видом сети (back-compat: классификация
на месте если флага нет; блокирующее поведение МКД сохранено). ЗСО санохраны источника
исключена из water (не сеть). 18 тестов.
#1070-предложение «сетевые обременения как analyze-слой» — реализовано через текущий cad_zouit.
ТУ-данные ООО Брик = needs-human (нет публичного API). engineering_networks loader = honest
blocked (источник публично пуст — QGIS-темплейт Минстроя 0 строк).
Closes#1070
TASK A (#29 G2): add parcel_meta to analyze response
- New ParcelMeta Pydantic schema in app/schemas/parcel.py
- SELECT from cad_parcels WHERE cad_num=:c in analyze_parcel() (step 9f)
- Returns permitted_use_established_by_document, land_record_category_type,
land_record_subtype, cost_value; None when row absent
- Tests: test_analyze_parcel_meta.py (found + not-found cases)
TASK B (#232 G3): cad_zouit fallback in _get_zouit_overlaps
- When nspd_quarter_dumps has zouit_count==0, fall back to ST_Intersects
query on cad_zouit (3483 rows, GIST indexed)
- Overlaps tagged with source='cad_zouit'; format compatible with NSPD path
- gate_verdict.py: BLOCKER_TYPE_ZONE_KEYWORDS tuple for keyword-based
classification (охранная зона / трубопровод / электр / газ -> blocker;
СЗЗ -> warning); NSPD subcategory path preserved backward-compat
- Tests: 6 new test cases in test_gate_verdict.py covering cad_zouit path
and backward-compat for NSPD subcategory path
Updated db.execute call sequence in test_analyze_*.py (index shift +1 at pos 10).