[Fable 5][P4] §25.3 _geo_weight: подтверждённо-далёкий проект (>6.9 км) получает вес ниже floor для проекта без координат — инверсия против комментария #1633

Closed
opened 2026-06-16 18:44:26 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: веса/пороги скоринга · Файл: backend/app/services/forecasting/special_indices.py:618-643, 146

special_indices.py:618-643 (+ константа стр. 146). При scale_km=3.0 известное расстояние даёт вес exp(-d/3); неизвестное расстояние — floor _GEO_WEIGHT_UNKNOWN=0.1. Точка равенства exp(-d/3)=0.1 → d≈6.9 км: любой наш проект с подтверждённым расстоянием >6.9 км оценивается как более слабый каннибализатор, чем проект, у которого координат вообще нет. Это противоречит комментарию (стр. 142-145), где floor задумывался как заведомо НЕ доминирующий над подтверждённой близостью. Импакт: возможна инверсия порядка top_contributors и (редко) смещение max-агрегата в _aggregate_overlap (стр. 704-716), когда все остальные проекты ещё дальше/слабее. Фикс (опционально): ограничить known-вес снизу значением unknown_weight (max(unknown_weight, exp(-d/scale))) либо завести отдельный «far»-флор, чтобы неизвестная геопривязка никогда не была сильнее подтверждённой дальности. Severity low: агрегация — max по overlap×geo_weight, далёкий проект редко доминирует.

Почему баг: Комментарий к _GEO_WEIGHT_UNKNOWN (строки 142-145) прямо формулирует намерение: floor должен быть «низким, чтобы проект мог сигналить, но НЕ доминировал над проектом с подтверждённой близостью». Но фактически unknown-floor (0.1) ВЫШЕ веса подтверждённо-далёкого проекта (<0.1), т.е. неизвестная геопривязка оценивается как более сильный каннибализатор, чем проект, про который точно известно, что он далеко. Это может инвертировать порядок top_contributors и (в редком случае, когда все остальные проекты ещё дальше/слабее) сместить max-агрегат каннибализации (_aggregate_overlap, строки 704-716). Импакт ограничен: агрегация — max по signal=overlap×geo_weight, и далёкий проект редко оказывается максимумом, поэтому severity low.

Как чинить: Либо опустить floor ниже минимально-осмысленного известного веса (напр. _GEO_WEIGHT_UNKNOWN на уровне exp(-радиус_города/scale)), либо клампить известный вес снизу тем же floor: max(unknown_weight, exp(...)) — чтобы «известно далеко» не оказывалось слабее «неизвестно где». Выбор зависит от продуктового намерения, но текущая инверсия противоречит комментарию.


deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.82 · unit B22

**Severity:** low · **Категория:** веса/пороги скоринга · **Файл:** `backend/app/services/forecasting/special_indices.py:618-643, 146` special_indices.py:618-643 (+ константа стр. 146). При scale_km=3.0 известное расстояние даёт вес exp(-d/3); неизвестное расстояние — floor _GEO_WEIGHT_UNKNOWN=0.1. Точка равенства exp(-d/3)=0.1 → d≈6.9 км: любой наш проект с подтверждённым расстоянием >6.9 км оценивается как более слабый каннибализатор, чем проект, у которого координат вообще нет. Это противоречит комментарию (стр. 142-145), где floor задумывался как заведомо НЕ доминирующий над подтверждённой близостью. Импакт: возможна инверсия порядка top_contributors и (редко) смещение max-агрегата в `_aggregate_overlap` (стр. 704-716), когда все остальные проекты ещё дальше/слабее. Фикс (опционально): ограничить known-вес снизу значением unknown_weight (`max(unknown_weight, exp(-d/scale))`) либо завести отдельный «far»-флор, чтобы неизвестная геопривязка никогда не была сильнее подтверждённой дальности. Severity low: агрегация — max по overlap×geo_weight, далёкий проект редко доминирует. **Почему баг:** Комментарий к _GEO_WEIGHT_UNKNOWN (строки 142-145) прямо формулирует намерение: floor должен быть «низким, чтобы проект мог сигналить, но НЕ доминировал над проектом с подтверждённой близостью». Но фактически unknown-floor (0.1) ВЫШЕ веса подтверждённо-далёкого проекта (<0.1), т.е. неизвестная геопривязка оценивается как более сильный каннибализатор, чем проект, про который точно известно, что он далеко. Это может инвертировать порядок top_contributors и (в редком случае, когда все остальные проекты ещё дальше/слабее) сместить max-агрегат каннибализации (_aggregate_overlap, строки 704-716). Импакт ограничен: агрегация — max по signal=overlap×geo_weight, и далёкий проект редко оказывается максимумом, поэтому severity low. **Как чинить:** Либо опустить floor ниже минимально-осмысленного известного веса (напр. _GEO_WEIGHT_UNKNOWN на уровне exp(-радиус_города/scale)), либо клампить известный вес снизу тем же floor: `max(unknown_weight, exp(...))` — чтобы «известно далеко» не оказывалось слабее «неизвестно где». Выбор зависит от продуктового намерения, но текущая инверсия противоречит комментарию. --- <sub>deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.82 · unit B22</sub>
bot-backend added the
week ревью 1
label 2026-06-16 18:44:26 +00:00
bot-backend added the
needs-human
label 2026-06-16 20:44:18 +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#1633
No description provided.