Grid-walk discovered-счётчик завышается на skipped/чужекатегорийные features и misattribution parcels/buildings #1584

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

Severity: low · Категория: incorrect aggregate / reporting · Файл: backend/app/services/cadastre/bulk_harvest.py:411-414, 230-233

Файл: backend/app/services/cadastre/bulk_harvest.py:411-414 (grid_walk_category) + 230-233 (атрибуция в harvest_quarter) + 622-664 (upsert_features). Механизм: upserted += sum(stats.values()) суммирует ВСЕ значения dict из upsert_features, включая counts['skipped'] (664) и категории, не совпадающие с запрашиваемым layer_id. Возвращённый discovered затем приписывается к result.parcels_upserted/buildings_upserted по layer_id (230-233), а не по реальной таблице. Импакт: (1) feature с нераспознанным category_id (cat is None → counts['skipped']) увеличивает discovered, хотя в cad* ничего не вставлено; (2) feature соседней категории, попавший в cell другого слоя, пишется в правильную таблицу, но засчитывается в счётчик запрошенного слоя. Итог — завышенные/искажённые parcels/buildings в HarvestResult, result_dict (scrape_cadastre.py:211-216) и логах: метрика покрытия и observability врут. Данные в БД при этом корректны (per-feature SAVEPOINT 640, точный routing) → severity low. Фикс: в _grid_walk_category суммировать только релевантный ключ — например upserted += stats['parcels'] if layer_id==CAT_PARCEL else stats['buildings'] (исключив 'skipped' и чужие категории), либо инкрементировать соответствующее поле result напрямую по фактической таблице из stats.

Почему баг: Если WMS GetFeatureInfo для layer 36368 (ЗУ) вернёт feature без распознаваемого properties.category (category_id is None → ветка else → counts['skipped'] += 1), он будет посчитан в discovered и приписан к parcels_upserted, хотя в cad_parcels НИЧЕГО не записано. Аналогично feature соседней категории (например здание, попавшее в parcel-cell на границе) корректно уходит в cad_buildings через upsert_building, но засчитывается в result.parcels_upserted. Итоговые счётчики parcels/buildings в HarvestResult и в task-result_dict (scrape_cadastre.py:211-216) и логах — завышены/искажены: метрика покрытия и observability врут. Данные в БД при этом корректны — поэтому low.

Как чинить: Считать discovered только по фактически записанным строкам нужной таблицы: например брать stats['parcels'] / stats['buildings'] по layer_id вместо sum(stats.values()), либо исключать 'skipped' из суммы и приписывать каждую категорию к своему счётчику.


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

**Severity:** low · **Категория:** incorrect aggregate / reporting · **Файл:** `backend/app/services/cadastre/bulk_harvest.py:411-414, 230-233` Файл: backend/app/services/cadastre/bulk_harvest.py:411-414 (_grid_walk_category) + 230-233 (атрибуция в harvest_quarter) + 622-664 (upsert_features). Механизм: upserted += sum(stats.values()) суммирует ВСЕ значения dict из upsert_features, включая counts['skipped'] (664) и категории, не совпадающие с запрашиваемым layer_id. Возвращённый discovered затем приписывается к result.parcels_upserted/buildings_upserted по layer_id (230-233), а не по реальной таблице. Импакт: (1) feature с нераспознанным category_id (cat is None → counts['skipped']) увеличивает discovered, хотя в cad_* ничего не вставлено; (2) feature соседней категории, попавший в cell другого слоя, пишется в правильную таблицу, но засчитывается в счётчик запрошенного слоя. Итог — завышенные/искажённые parcels/buildings в HarvestResult, result_dict (scrape_cadastre.py:211-216) и логах: метрика покрытия и observability врут. Данные в БД при этом корректны (per-feature SAVEPOINT 640, точный routing) → severity low. Фикс: в _grid_walk_category суммировать только релевантный ключ — например upserted += stats['parcels'] if layer_id==CAT_PARCEL else stats['buildings'] (исключив 'skipped' и чужие категории), либо инкрементировать соответствующее поле result напрямую по фактической таблице из stats. **Почему баг:** Если WMS GetFeatureInfo для layer 36368 (ЗУ) вернёт feature без распознаваемого properties.category (category_id is None → ветка else → counts['skipped'] += 1), он будет посчитан в discovered и приписан к parcels_upserted, хотя в cad_parcels НИЧЕГО не записано. Аналогично feature соседней категории (например здание, попавшее в parcel-cell на границе) корректно уходит в cad_buildings через upsert_building, но засчитывается в result.parcels_upserted. Итоговые счётчики parcels/buildings в HarvestResult и в task-result_dict (scrape_cadastre.py:211-216) и логах — завышены/искажены: метрика покрытия и observability врут. Данные в БД при этом корректны — поэтому low. **Как чинить:** Считать discovered только по фактически записанным строкам нужной таблицы: например брать stats['parcels'] / stats['buildings'] по layer_id вместо sum(stats.values()), либо исключать 'skipped' из суммы и приписывать каждую категорию к своему счётчику. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.85 · unit B16</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:10:37 +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#1584
No description provided.