(low) _classify зависит от порядка вставки в OSM_CATEGORIES — вторая категория multi-tag элемента молча теряется #1372

Closed
opened 2026-06-14 18:09:53 +00:00 by bot-backend · 0 comments
Collaborator

Описание

_classify итерирует OSM_CATEGORIES.items() и возвращает первую совпавшую категорию. fetch_overpass делает per-category запросы и extend'ит все результаты в один список, поэтому элемент с двумя целевыми тегами (например amenity=pharmacy + shop=supermarket — аптека в супермаркете) попадёт в all_elements дважды. Оба раза _classify вернёт ОДНУ И ТУ ЖЕ категорию (первую по dict-порядку). UPSERT по ключу UNIQUE(osm_type, osm_id, category) (строка 166): обе вставки дают одинаковый тройной ключ, вторая тихо превращается в DO UPDATE. Ошибки нет, но вторая категория элемента молча теряется (например, shop_supermarket никогда не вставится для аптеки в супермаркете) → неполный охват POI в edge-cases.

Корень

Классификация пере-выводится из тегов независимо для каждой копии и зависит от позиции в dict, а не от того, под чей Overpass-запрос элемент реально пришёл. Dict-порядок как неявный приоритет — хрупко.

Evidence

/Users/anton/Птица/gendesign/backend/app/services/site_finder/poi_loader.py:64-69

def _classify(tags):
    for (k, v), cat in OSM_CATEGORIES.items():
        if tags.get(k) == v:
            return cat
    return None

Suggested fix

Либо задать явный приоритет категорий (упорядоченный список правил по убыванию значимости), либо классифицировать по той категории, под чей Overpass-запрос элемент пришёл (прокинуть category в элемент при fetch_overpass, как сделано с _source_type в noise_loader), а не пере-выводить из тегов независимо.

Обоснование severity

Low: элемент присутствует, одна из его категорий представлена; теряется только вторая категория в edge-cases multi-tag элементов. Не критично для работы системы, но потеря данных происходит без предупреждения.


week ревью 1 · multi-agent аудит 2026-06-14 · severity=low · category=correctness

Затронутые файлы:

  • /Users/anton/Птица/gendesign/backend/app/services/site_finder/poi_loader.py
## Описание `_classify` итерирует `OSM_CATEGORIES.items()` и возвращает первую совпавшую категорию. `fetch_overpass` делает per-category запросы и extend'ит все результаты в один список, поэтому элемент с двумя целевыми тегами (например `amenity=pharmacy` + `shop=supermarket` — аптека в супермаркете) попадёт в `all_elements` дважды. Оба раза `_classify` вернёт ОДНУ И ТУ ЖЕ категорию (первую по dict-порядку). UPSERT по ключу `UNIQUE(osm_type, osm_id, category)` (строка 166): обе вставки дают одинаковый тройной ключ, вторая тихо превращается в `DO UPDATE`. Ошибки нет, но вторая категория элемента молча теряется (например, `shop_supermarket` никогда не вставится для аптеки в супермаркете) → неполный охват POI в edge-cases. ## Корень Классификация пере-выводится из тегов независимо для каждой копии и зависит от позиции в dict, а не от того, под чей Overpass-запрос элемент реально пришёл. Dict-порядок как неявный приоритет — хрупко. ## Evidence `/Users/anton/Птица/gendesign/backend/app/services/site_finder/poi_loader.py:64-69` ```python def _classify(tags): for (k, v), cat in OSM_CATEGORIES.items(): if tags.get(k) == v: return cat return None ``` ## Suggested fix Либо задать явный приоритет категорий (упорядоченный список правил по убыванию значимости), либо классифицировать по той категории, под чей Overpass-запрос элемент пришёл (прокинуть `category` в элемент при `fetch_overpass`, как сделано с `_source_type` в `noise_loader`), а не пере-выводить из тегов независимо. ## Обоснование severity Low: элемент присутствует, одна из его категорий представлена; теряется только вторая категория в edge-cases multi-tag элементов. Не критично для работы системы, но потеря данных происходит без предупреждения. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**low** · category=`correctness`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/backend/app/services/site_finder/poi_loader.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:09:53 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:54 +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#1372
No description provided.