(low) conflict_resolution.py/_resolve cross_validate: молча возвращает медиану, не сигнализирует расхождение цен #1536

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

Severity: low · Категория: report · Файл: tradein-mvp/backend/app/services/matching/conflict_resolution.py:94-98, 151-157

conflict_resolution.py:151-157. price_rub помечен 'cross_validate' (:94), комментарий :96-98 и vault sec 4.5 требуют 'flag if diff > 10%'. Реализация: nums.sort(); return nums[len(nums)//2] — никакого флага/лога divergence; вызывающий не узнает, что Cian 8 млн vs Avito 12 млн (разница 50%). Доп.: для чётного числа кандидатов берётся верхнее из двух средних, а не их среднее — не медиана. Импакт сейчас ограничен: продакшен-консьюмер update_canonical_fields — stub (pass), cross_validate зовётся только из тестов, поэтому low. Как чинить: при подключении мерджа возвращать пару (value, divergence_flag) либо логировать warning при max/min > 10% медианы; для чётного n считать среднее двух центральных. Закрыть, когда Stage 8.x активирует арбитраж.

Почему баг: Заявленная цель cross_validate — пометить расхождение цен между источниками (важный сигнал качества данных для оценки квартиры и клиентского отчёта trade-in). Реализация не возвращает и не логирует никакого флага divergence — возвращает только скаляр, неотличимый от обычного выбора. Сигнал теряется молча; вызывающий код не может узнать, что источники сильно разошлись. Дополнительно: для чётного числа кандидатов nums[len//2] берёт ВЕРХНЕЕ из двух средних, а не их среднее — это не медиана.

Как чинить: Возвращать структуру (value, diverged: bool, spread_pct) или хотя бы логировать WARNING при (max-min)/min > 0.10. Для чётного n считать медиану как среднее двух центральных. Либо убрать обманчивый коммент про 'flag', если флаг не нужен.


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

**Severity:** low · **Категория:** report · **Файл:** `tradein-mvp/backend/app/services/matching/conflict_resolution.py:94-98, 151-157` conflict_resolution.py:151-157. price_rub помечен 'cross_validate' (:94), комментарий :96-98 и vault sec 4.5 требуют 'flag if diff > 10%'. Реализация: nums.sort(); return nums[len(nums)//2] — никакого флага/лога divergence; вызывающий не узнает, что Cian 8 млн vs Avito 12 млн (разница 50%). Доп.: для чётного числа кандидатов берётся верхнее из двух средних, а не их среднее — не медиана. Импакт сейчас ограничен: продакшен-консьюмер update_canonical_fields — stub (pass), cross_validate зовётся только из тестов, поэтому low. Как чинить: при подключении мерджа возвращать пару (value, divergence_flag) либо логировать warning при max/min > 10% медианы; для чётного n считать среднее двух центральных. Закрыть, когда Stage 8.x активирует арбитраж. **Почему баг:** Заявленная цель cross_validate — пометить расхождение цен между источниками (важный сигнал качества данных для оценки квартиры и клиентского отчёта trade-in). Реализация не возвращает и не логирует никакого флага divergence — возвращает только скаляр, неотличимый от обычного выбора. Сигнал теряется молча; вызывающий код не может узнать, что источники сильно разошлись. Дополнительно: для чётного числа кандидатов nums[len//2] берёт ВЕРХНЕЕ из двух средних, а не их среднее — это не медиана. **Как чинить:** Возвращать структуру (value, diverged: bool, spread_pct) или хотя бы логировать WARNING при (max-min)/min > 0.10. Для чётного n считать медиану как среднее двух центральных. Либо убрать обманчивый коммент про 'flag', если флаг не нужен. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U130</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:59:28 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:20 +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#1536
No description provided.