fix(cadastre): skip grid-walk for broken quarter geometries (#168) #179
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#179
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/cadastre-skip-broken-geoms"
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
Pilot v5 revealed что 1735/2408 (72%) cad_quarters_geom rows для ЕКБ имеют broken micro-precision geometry (width 0.01м вместо 200-4000м).
Effects
Fix
quarter_bbox_3857sanity check: если width/height не в [100, 10000] метрах → return None → bulk_harvest_quarter скипает grid-walk, только snapshot phase запускается.Pilot v5 dynamics after fix:
Follow-up
Re-import cad_quarters_geom geometry from NSPD (category 36381) — отдельный issue.
Review
CI зелёный (backend 1m2s + frontend 1m39s), логика чистая, но тест на новую boundary не добавлен — тот же gap что был на #177.
🔴 Блокер: нет unit-теста на [100, 10000] boundary
Pure function, 4 очевидных boundary case (< 100, == 100, == 10000, > 10000), плюс happy path. Mock
db.execute().mappings().first()тривиален — секция "Grid geometry" уже есть вbackend/tests/services/test_cadastre_bulk.pyрядом с тестамиgenerate_grid_click_points. Добавитьtest_quarter_bbox_3857_skips_broken_geomиtest_quarter_bbox_3857_skips_oversized— ~20 строк.Per post-#177 правило (no "follow-up" для test coverage): тест должен поехать в этом же PR. Иначе следующий PR опять придёт без теста и регрессия (например, кто-то поменяет threshold 10000 → 1000 и сломает реальные quarters) пройдёт.
✅ Что хорошо
bulk_harvest.py:215-222(_grid_walk_category) корректно обрабатываетNoneотquarter_bbox_3857— логирует warning и возвращает(0, 0). Минор в PR body — author пишет "bulk_harvest_quarter скипает", реальный handler —_grid_walk_category, но поведение правильное.quarter_bbox_3857уже былtuple[...] | Noneдо этого PR — TS/pydantic ничего не задевает..2fна range 0.01..10000 — нет log poisoning.Что нужно
quarter_bbox_3857boundary:width < 100→ returns Nonewidth > 10000→ returns None100 ≤ width ≤ 10000happy path → returns tupleheight < 100→ returns None (симметрия)Жду новый SHA с тестом.
Re-review (SHA
e18e146)Все блокеры закрыты:
✅ 5 boundary tests добавлены
backend/tests/services/test_cadastre_bulk.py:201-244— новая секцияquarter_bbox_3857 sanity check:test_quarter_bbox_3857_healthy_geom— happy path ~750м (real ЕКБ-квартал)test_quarter_bbox_3857_skips_broken_micro_geom— width=60.7m (real broken example 66:41:0101005)test_quarter_bbox_3857_skips_oversized_geom— width=15000mtest_quarter_bbox_3857_skips_zero_height— height=50m (симметрия по Y)test_quarter_bbox_3857_returns_none_when_quarter_missing— null rowХорошо: helper
_mock_db_with_bboxдля DRY, реальные значения из broken examples в качестве test data.✅ CI зелёный
backend 1m12s + frontend 1m29s — все 5 новых тестов прошли.
✅ Логика без изменений с прошлого SHA
grid_geometry.pyфикс identical (sanity check на [100, 10000]m, return None для broken). Caller (bulk_harvest._grid_walk_category) корректно обрабатывает None — логирует warning и возвращает(0, 0).approve merge