(low) conflict_resolution.py/_resolve: строковые правила игнорируют приоритет источников (порядок dict) #1539

Closed
opened 2026-06-15 05:59:31 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: logic · Файл: tradein-mvp/backend/app/services/matching/conflict_resolution.py:140-159

conflict_resolution.py:121-159. Ветки 'union', 'first_non_null', 'cross_validate' и неизвестное правило перебирают candidates.values() в порядке вставки словаря, без ранжирования источников — в отличие от priority-list ветки (:162-166). Для kadastr_num='first_non_null' (:95) кадастровый номер берётся от того источника, что оказался первым в dict, а не от самого надёжного. Импакт ограничен: кадастр обычно один; к тому же resolve_house_field/resolve_listing_field в проде не подключены (консьюмер update_canonical_fields — stub), зовутся лишь из тестов. Как чинить: при активации мерджа задать явный порядок источников и для first_non_null/cross_validate тоже идти по приоритету (как priority-list), а не по порядку ключей dict.

Почему баг: В отличие от ветки priority-list (162-166), где явно перебираются источники по рангу, строковые правила полагаются на недетерминированный/случайный порядок ключей candidates. Для kadastr_num это значит, что кадастровый номер может быть взят от менее надёжного источника, если он оказался первым в dict. Импакт ограниченный (обычно кадастр один), потому low.

Как чинить: Для first_non_null задать явный дефолтный порядок предпочтения источников (как в priority-list) либо передавать упорядоченный список источников и итерировать по нему, а не по candidates.values().


deep-audit «армия ботов 2» · verify+harden, confidence 0.8 · unit U130

**Severity:** low · **Категория:** logic · **Файл:** `tradein-mvp/backend/app/services/matching/conflict_resolution.py:140-159` conflict_resolution.py:121-159. Ветки 'union', 'first_non_null', 'cross_validate' и неизвестное правило перебирают candidates.values() в порядке вставки словаря, без ранжирования источников — в отличие от priority-list ветки (:162-166). Для kadastr_num='first_non_null' (:95) кадастровый номер берётся от того источника, что оказался первым в dict, а не от самого надёжного. Импакт ограничен: кадастр обычно один; к тому же resolve_house_field/resolve_listing_field в проде не подключены (консьюмер update_canonical_fields — stub), зовутся лишь из тестов. Как чинить: при активации мерджа задать явный порядок источников и для first_non_null/cross_validate тоже идти по приоритету (как priority-list), а не по порядку ключей dict. **Почему баг:** В отличие от ветки priority-list (162-166), где явно перебираются источники по рангу, строковые правила полагаются на недетерминированный/случайный порядок ключей candidates. Для kadastr_num это значит, что кадастровый номер может быть взят от менее надёжного источника, если он оказался первым в dict. Импакт ограниченный (обычно кадастр один), потому low. **Как чинить:** Для first_non_null задать явный дефолтный порядок предпочтения источников (как в priority-list) либо передавать упорядоченный список источников и итерировать по нему, а не по candidates.values(). --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.8 · unit U130</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:59:31 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:20 +00:00
bot-backend added the
needs-human
label 2026-06-15 16:44:16 +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#1539
No description provided.