feat(#29,#232): wire cad_parcels.permitted_use в analyze + cad_zouit fallback (G2+G3) #240
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#240
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/g2-g3-analyze-parcel-meta-zouit-fallback"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Combined PR для двух Site Finder quick wins (оба меняют analyze endpoint).
TASK A — #29 G2: parcel_meta в analyze response
cad_parcels.permitted_use_established_by_documentимеет 98.1% coverage (38559/39287). Раньше эти данные не отдавались в analyze — теперь добавлено какparcel_metaблок.Изменения:
backend/app/schemas/parcel.py— новаяParcelMetaPydantic model (5 полей: permitted_use, land_category, land_subtype, cad_cost, source)backend/app/api/v1/parcels.py— SELECT изcad_parcels WHERE cad_num = CAST(:c AS text)на шаге 9fbackend/tests/api/v1/test_analyze_parcel_meta.py— 2 теста (found / not-found)TASK B — #232 G3: cad_zouit fallback
cad_zouitимеет 3 483 строки + GIST index (cad_zouit_geom_gist, ~1ms на ST_Intersects). До этого_get_zouit_overlapsчитал только изnspd_quarter_dumps(пуст из-за заморозки beat 2026-05-14). Теперь приzouit_count==0или отсутствии dump → fallback на cad_zouit.Важно:
cad_zouit.subcategory100% NULL → существующийBLOCKER_SUBCATEGORIES={17:...}не сработал бы. ДобавленBLOCKER_TYPE_ZONE_KEYWORDS/WARNING_TYPE_ZONE_KEYWORDSдля классификации черезtype_zonesubstring match (охранные зоны / трубопроводы / электр / газ = blocker, СЗЗ = warning).Изменения:
backend/app/services/site_finder/quarter_dump_lookup.py— новая функция_get_cad_zouit_overlaps, вызов из_get_zouit_overlapsприzouit_count==0backend/app/services/site_finder/gate_verdict.py— keyword fallback для overlaps сsource=="cad_zouit". NSPD subcategory path не тронут (backward compat)backend/tests/test_gate_verdict.py— 6 новых тестов (все 20 зелёные)Обновлены тесты с sequence shift
test_analyze_market_price.py,test_analyze_recent_permits.py,test_analyze_inline_weights.py— сдвиг +1 на позиции 10 из-за нового parcel_meta SELECT.Test plan
parcel_meta.permitted_useне None для ЕКБ-cadnspd_zouit_overlapsне пуст на проде даже приnspd_quarter_dumps=0Deep Code Review — APPROVE, merged
Verdict: APPROVE (LOW risk). Merged via deep-code-reviewer.
Что проверено
gate_verdict.py:155-202—if src == "cad_zouit"корректно изолирует keyword path от NSPD subcategory path. Backward compat verified тестомtest_nspd_subcategory_path_backward_compat.CAST(:c AS text)иST_GeomFromText(:wkt, 4326). Grep:[a-z_]+::[a-z]→ 0 matches.EXPLAINнаcad_zouit ST_Intersectsдля ЕКБ полигона: Bitmap Index Scan черезcad_zouit_geom_gist, cost 230, ~14 rows. ~1ms.layer_counts.zouit_count == 0. Безопасно для текущего состояния (beat заморожен perBug_NSPD_WMS_NotBulk_2026_May14).Low-severity рекомендации (не блокирующие, можно отдельным PR)
_get_cad_zouit_overlapsбезLIMIT— для consistency с_get_engineering_nearby(LIMIT 20) добавитьLIMIT 50. На сейчас не критично (3 483 строки в табл).ZOUIT_CAD_BLOCKER/ZOUIT_CAD_SZZ/ZOUIT_CAD_OTHERcodes против expected.type_zoneэто контролируемый Росреестром словарь, false-positive surface узкий — но проверить стоит.frontend/src/types/site-finder.tsне обновлён подparcel_meta. OK для merge (поле опционально, null-safe), ноnpm run codegenможно запустить отдельным PR.Smoke test после deploy
Ожидание:
parcel_meta.permitted_use != null,nspd_zouit_overlapsне пуст,gate_verdictреагирует на cad_zouit overlaps.