(low) recommend_mix: comparables/competitors матчат obj_class = :cls точно, has_class_data проверяет лишь NOT NULL — молчаливо пустой результат при разном словаре (RU vs EN) #1375

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

Описание

has_class_data гейтится только на obj_class IS NOT NULL. БД хранит русские названия классов (Комфорт/Бизнес/Элит/Стандарт/Типовой — из domrf_kn.py), а UI шлёт английские (ClassLiteral = Literal["Comfort","Comfort+","Business","Elite"]). При непустом obj_class (русские строки) has_class_data=True, и target_class_for_geo="Comfort" (английский) пробрасывается дальше. Точный матч obj_class = :cls в comparables CTE (строка 2838) и в _competitors_two_dim class_filter (строка 2149) даёт ноль строк: "Comfort" != "Комфорт". Comparables молча возвращает [], а подсчёт конкурентов проваливается на более грубые fallbacks (Tier 1 district+class → 0 → Tier 2 district без класса) — без предупреждения. Это тот же класс рассогласования словаря, который velocity/elasticity-запросы избегают, обращаясь к другой таблице. Связанная проблема в _bucket_success_ranking (строка 2227): COALESCE(o.obj_class, 'Comfort') подставляет английский 'Comfort', тогда как реальные строки русские.

Корень

Языковой/словарный mismatch (RU в БД vs EN из UI) для domrf_kn_objects.obj_class. Маппинга UI↔БД для этой таблицы нет (существующий vocabulary-map строки 2345-2354 переводит только для yandex_realty_zk). LOWER-нормализации недостаточно — Комфорт != Comfort и при одинаковом регистре.

Evidence

/Users/anton/Птица/gendesign/backend/app/services/analytics_queries.py:2464-2478, 2838-2839, 2149

has_class_data = bool(... WHERE obj_class IS NOT NULL ...)
comparables: (CAST(:cls AS TEXT) IS NULL OR obj_class = :cls)
_competitors_two_dim: class_filter = "AND obj_class = :cls"

Suggested fix

Добавить маппинг UI→БД (русские значения) перед передачей :cls в запросы к domrf_kn_objects, либо нормализовать значения класса в БД к английскому на write-time. Применить согласованно в comparables CTE, _competitors_two_dim и _bucket_success_ranking.

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

Low: comparables [] обрабатывается gracefully; competitors fallback всё равно даёт счётчик (district-wide вместо class-specific); velocity/pricing-движок не затронут. Деградация молчаливая, но ограниченная.


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

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

  • /Users/anton/Птица/gendesign/backend/app/services/analytics_queries.py
## Описание `has_class_data` гейтится только на `obj_class IS NOT NULL`. БД хранит русские названия классов (`Комфорт`/`Бизнес`/`Элит`/`Стандарт`/`Типовой` — из `domrf_kn.py`), а UI шлёт английские (`ClassLiteral = Literal["Comfort","Comfort+","Business","Elite"]`). При непустом `obj_class` (русские строки) `has_class_data=True`, и `target_class_for_geo="Comfort"` (английский) пробрасывается дальше. Точный матч `obj_class = :cls` в comparables CTE (строка 2838) и в `_competitors_two_dim` class_filter (строка 2149) даёт ноль строк: `"Comfort" != "Комфорт"`. Comparables молча возвращает `[]`, а подсчёт конкурентов проваливается на более грубые fallbacks (Tier 1 district+class → 0 → Tier 2 district без класса) — без предупреждения. Это тот же класс рассогласования словаря, который velocity/elasticity-запросы избегают, обращаясь к другой таблице. Связанная проблема в `_bucket_success_ranking` (строка 2227): `COALESCE(o.obj_class, 'Comfort')` подставляет английский 'Comfort', тогда как реальные строки русские. ## Корень Языковой/словарный mismatch (RU в БД vs EN из UI) для `domrf_kn_objects.obj_class`. Маппинга UI↔БД для этой таблицы нет (существующий vocabulary-map строки 2345-2354 переводит только для `yandex_realty_zk`). LOWER-нормализации недостаточно — `Комфорт` != `Comfort` и при одинаковом регистре. ## Evidence `/Users/anton/Птица/gendesign/backend/app/services/analytics_queries.py:2464-2478, 2838-2839, 2149` ``` has_class_data = bool(... WHERE obj_class IS NOT NULL ...) comparables: (CAST(:cls AS TEXT) IS NULL OR obj_class = :cls) _competitors_two_dim: class_filter = "AND obj_class = :cls" ``` ## Suggested fix Добавить маппинг UI→БД (русские значения) перед передачей `:cls` в запросы к `domrf_kn_objects`, либо нормализовать значения класса в БД к английскому на write-time. Применить согласованно в comparables CTE, `_competitors_two_dim` и `_bucket_success_ranking`. ## Обоснование severity Low: comparables `[]` обрабатывается gracefully; competitors fallback всё равно даёт счётчик (district-wide вместо class-specific); velocity/pricing-движок не затронут. Деградация молчаливая, но ограниченная. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**low** · category=`correctness`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/backend/app/services/analytics_queries.py`
bot-backend added the
week ревью 1
label 2026-06-14 18:09:56 +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#1375
No description provided.