Phase 2.5 ПЗЗ собирается ДО auto-heal геометрии квартала — broken-geom кварталы молча остаются без территориальных зон при первом harvest #1583

Closed
opened 2026-06-16 17:09:00 +00:00 by bot-backend · 0 comments
Collaborator

Severity: medium · Категория: ordering / missing data · Файл: backend/app/services/cadastre/bulk_harvest.py:250-277

Файл: backend/app/services/cadastre/bulk_harvest.py:250-262 (Phase 2.5 territorial_zones) выполняется РАНЬШЕ Phase 4 (264-277, auto-heal geom). Механизм: при broken/NULL geom квартала quarter_bbox_3857 (grid_geometry.py:61-69) возвращает None → блок get_territorial_zones_in_bbox/_save_territorial_zones пропускается тихо (нет записи в harvest_meta). В том же прогоне Phase 4 чинит geometry квартала (upsert_quarter_geom_from_feature) и обновляет cad_quarter_stats.fetched_at=NOW() (1368-1390). Импакт: повторный сбор ПЗЗ возможен только при следующем harvest квартала, но enqueue_cadastre_harvest (scrape_cadastre.py:386, дефолт skip_fresh_hours=1) на 388-402 пропустит квартал с fetched_at >= now-1h. Кварталы, прогоняемые единожды (или повторно в пределах часа), навсегда остаются без территориального зонирования — ключевого supply-слоя жилая/нежилая для site_finder; затрагивает ~72% кварталов с broken geom (комментарий quarter_bbox_3857). Фикс: перенести Phase 2.5 (territorial_zones) ПОСЛЕ Phase 4 (auto-heal geom), чтобы свежевосстановленный bbox использовался для ПЗЗ в том же прогоне; либо при broken bbox в Phase 2.5 фиксировать пропуск в harvest_meta (например territorial_zones_skipped=True) и исключать такие кварталы из freshness-skip до успешного сбора ПЗЗ.

Почему баг: При первом harvest квартала с broken/NULL geom (по комментарию quarter_bbox_3857 — ~72% строк) ПЗЗ-зоны не собираются вообще, хотя в этом же прогоне geom чинится и стал бы валидным для bbox. ПЗЗ-слой добёрется только при ПОВТОРНОМ harvest квартала. Но enqueue_cadastre_harvest (scrape_cadastre.py:386) по умолчанию делает freshness-skip с порогом 1ч (skip_fresh_hours=1) по cad_quarter_stats.fetched_at — а Phase 4 как раз обновляет cad_quarter_stats.fetched_at в этом же прогоне. Значит повторный enqueue в пределах часа пропустит квартал, и многие кварталы, harvest'ящиеся единожды, навсегда останутся без ПЗЗ-зон (территориальное зонирование жилая/нежилая — ключевой supply-слой для site_finder).

Как чинить: Перенести Phase 2.5 (territorial_zones) ПОСЛЕ Phase 4 (auto-heal geom + commit), либо пересчитывать quarter_bbox_3857 после heal: сначала upsert_quarter_stats + upsert_quarter_geom_from_feature, commit, затем вычислять bbox и собирать territorial_zones. Тогда свежезалеченная geom будет доступна для bbox в том же прогоне.


deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.82 · unit B16

**Severity:** medium · **Категория:** ordering / missing data · **Файл:** `backend/app/services/cadastre/bulk_harvest.py:250-277` Файл: backend/app/services/cadastre/bulk_harvest.py:250-262 (Phase 2.5 territorial_zones) выполняется РАНЬШЕ Phase 4 (264-277, auto-heal geom). Механизм: при broken/NULL geom квартала quarter_bbox_3857 (grid_geometry.py:61-69) возвращает None → блок get_territorial_zones_in_bbox/_save_territorial_zones пропускается тихо (нет записи в harvest_meta). В том же прогоне Phase 4 чинит geometry квартала (upsert_quarter_geom_from_feature) и обновляет cad_quarter_stats.fetched_at=NOW() (1368-1390). Импакт: повторный сбор ПЗЗ возможен только при следующем harvest квартала, но enqueue_cadastre_harvest (scrape_cadastre.py:386, дефолт skip_fresh_hours=1) на 388-402 пропустит квартал с fetched_at >= now-1h. Кварталы, прогоняемые единожды (или повторно в пределах часа), навсегда остаются без территориального зонирования — ключевого supply-слоя жилая/нежилая для site_finder; затрагивает ~72% кварталов с broken geom (комментарий quarter_bbox_3857). Фикс: перенести Phase 2.5 (territorial_zones) ПОСЛЕ Phase 4 (auto-heal geom), чтобы свежевосстановленный bbox использовался для ПЗЗ в том же прогоне; либо при broken bbox в Phase 2.5 фиксировать пропуск в harvest_meta (например territorial_zones_skipped=True) и исключать такие кварталы из freshness-skip до успешного сбора ПЗЗ. **Почему баг:** При первом harvest квартала с broken/NULL geom (по комментарию quarter_bbox_3857 — ~72% строк) ПЗЗ-зоны не собираются вообще, хотя в этом же прогоне geom чинится и стал бы валидным для bbox. ПЗЗ-слой добёрется только при ПОВТОРНОМ harvest квартала. Но enqueue_cadastre_harvest (scrape_cadastre.py:386) по умолчанию делает freshness-skip с порогом 1ч (skip_fresh_hours=1) по cad_quarter_stats.fetched_at — а Phase 4 как раз обновляет cad_quarter_stats.fetched_at в этом же прогоне. Значит повторный enqueue в пределах часа пропустит квартал, и многие кварталы, harvest'ящиеся единожды, навсегда останутся без ПЗЗ-зон (территориальное зонирование жилая/нежилая — ключевой supply-слой для site_finder). **Как чинить:** Перенести Phase 2.5 (territorial_zones) ПОСЛЕ Phase 4 (auto-heal geom + commit), либо пересчитывать quarter_bbox_3857 после heal: сначала upsert_quarter_stats + upsert_quarter_geom_from_feature, commit, затем вычислять bbox и собирать territorial_zones. Тогда свежезалеченная geom будет доступна для bbox в том же прогоне. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.82 · unit B16</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:09:00 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#1583
No description provided.