fix(#243): cad_zouit fallback срабатывает когда nspd dump полностью отсутствует #248
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#248
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/243-cad-zouit-fallback-no-dump"
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
Regression fix для PR #240 (G3 cad_zouit fallback). После deploy QA обнаружил что
nspd_zouit_overlapsвсегда[]на проде потому чтоnspd_quarter_dumps = 0 строкглобально →_get_zouit_overlapsвозвращалmake_empty_result()до fallback path.Root cause
В
backend/app/services/site_finder/quarter_dump_lookup.pyв веткеif row is None:return make_empty_result(harvest_triggered=...)— fallback недостижимdump_row exists AND zouit_count == 0Fix
В ветке
if row is Noneтеперь вызываем_get_cad_zouit_overlaps(db, parcel_wkt)и включаем результат вnspd_zouit_overlapsперед возвратом:Tests (+5, 34 total, all pass)
test_cad_zouit_fallback_fires_when_no_dump— fallback fires,source='cad_zouit'test_cad_zouit_fallback_no_dump_no_parcel_wkt— wkt=None → empty, cad_zouit not queriedtest_cad_zouit_fallback_empty_when_no_overlaps— cad_zouit returns 0 rows → empty listtest_get_cad_zouit_overlaps_returns_correct_schema— field contract verifiedtest_nspd_path_used_when_zouit_count_nonzero— NSPD path unchanged (backward compat)Backward compat
NSPD path сохранён когда
dump_rowexists сzouit_count > 0(после #244 fix). Source priority: NSPD > cad_zouit > empty.Test plan
gate_verdict.blockersнепустой когда «охранная зона трубопроводов» в radiusdump_row.zouit_count > 0Closes #243.
Deep code review — verdict: APPROVE → merged
Squash-merged:
10b79da2.Что проверено
Fix correctness:
if row is Noneтеперь вызывает_get_cad_zouit_overlaps(db, parcel_wkt)с guardparcel_wkt is not None. Корректно.row is None→ cad_zouit (этот PR)row exists + zouit_count == 0→ cad_zouit (PR #240, через_get_zouit_overlaps)row exists + zouit_count > 0→ NSPD dump path (unchanged)Backward compat:
test_nspd_path_used_when_zouit_count_nonzeroявно валидирует чтоsource='nspd-quarter-dump'приzouit_count=3. NSPD path не сломан.make_empty_result()сохраняет схему — post-mutationresult["nspd_zouit_overlaps"] = cad_zouit_overlapsне ломает контракт.Cross-file impact:
parcels.py:2106— потребляетnspd_dump_data["nspd_zouit_overlaps"]без изменений. Response shape стабилен.gate_verdict.py:152-186— keyword-классификатор дляsource='cad_zouit'(BLOCKER_TYPE_ZONE_KEYWORDS / WARNING_TYPE_ZONE_KEYWORDS) уже на месте с PR #240. Заработает автоматически.Tests: +5 unit tests, mock-based с
MagicMock, sequentialdb.execute()стороны корректно замоканы (включая порядок helper-вызовов в test 5). 34/34 PASS.Conventions: ruff line ≤100 OK, psycopg v3 не trogal (используется существующий
_get_cad_zouit_overlapsиз PR #240). Нет SQL injection / N+1 / lock duration concerns.Vault:
fixes/Fix_G3_Zouit_Fallback_NoDump_May17.mdсоздан.domains/api/endpoints/Endpoint_Parcel_Analyze.mdобновлён секциейv3.8.1 fix (2026-05-17).Lesson learned (мой miss в review PR #240)
PR #240 я approve'нул вчера без проверки branch
if row is None(раннее завершение функцииget_quarter_dump_dataдо того как_get_zouit_overlapsбудет вызван). Тестировал только happy-fallbackzouit_count == 0. На будущее: для branching logic нужно перечислять все возможные early-return пути в review checklist.Production UX monitoring — критично
После deploy этот fix начнёт активно отдавать
nspd_zouit_overlapsсsource='cad_zouit'для всех кварталов где нет NSPD dump (= большинство прода, пока harvest #244 не отработает). Это приведёт к изменению UX:gate_verdictтеперь будет выдаватьZOUIT_CAD_BLOCKER(вместо unknown) для участков пересекающих type_zone с keyword'ами «охранная зона» / «трубопровод» / «электр» / «газ» вcad_zouit.Рекомендация:
66:41:0603016:194(test plan в PR body).SELECT count(*) FROM ... WHERE gate_verdict->>'can_build_mkd' = 'no' AND ...— посмотреть процент участков получивших новый BLOCKER.BLOCKER_TYPE_ZONE_KEYWORDSслишком широкие, рассмотреть сужение в отдельном PR.nspd-quarter-dumpoverlaps для свежих кварталов, и cad_zouit fallback станет редким edge-case.Ничего не блокирует
После merge — branch
fix/243-cad-zouit-fallback-no-dumpможно удалить (delete-branch-after-merge не активирован в репо, но руками — OK).