demand_only: rate_future=0.0 placeholder при отсутствии будущей ставки даёт максимальный аплифт §9.4 (clamp 1.2), а не нейтраль — комментарий ложный #1594

Closed
opened 2026-06-16 17:14:45 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: logic/misleading-default · Файл: backend/app/services/forecasting/recommendation.py:614-616

Файл backend/app/services/forecasting/recommendation.py:614-616. При rate_future is None (hold_last_rate не дал ставку) код передаёт rate_future=0.0 в compute_demand_normalization с комментарием «rate_future None → деградирует к нейтрали внутри себя, передаём 0.0 как placeholder». Фактически (demand_normalization.py:169-173) нейтраль 1.0 возвращается только при beta=None / rate_window_avg=None; при надёжном β<0 и rate_window_avg≈14.5 → delta=-14.5 → exp(β·delta)>1 → клэмп к _NORM_MAX=1.2 (максимальный аплифт +20%). ИМПАКТ: на текущий выход НЕ влияет, т.к. множитель одинаков для всех bucket'ов и сокращается в deficit_index=pace/max_pace; но при любой будущей правке (per-bucket base_pace или использование абсолютного pace) placeholder начнёт молча инфлировать спрос; плюс комментарий вводит в заблуждение о graceful-поведении. ФИКС: при rate_future is None пропускать §9.4-нормализацию (использовать norm.coefficient=1.0 явно) или передавать rate_future=rate_window_avg (delta=0 → нейтраль), вместо 0.0; одновременно исправить комментарий.

Почему баг: Комментарий в коде ложно утверждает graceful-нейтраль; фактически placeholder 0% — это экстремальное смягчение режима ставки, максимально инфлирующее спрос. В текущей реализации demand_only эффект сокращается в pace/max_pace (множитель одинаков для всех bucket'ов, см. отдельную находку), поэтому на ВЫХОД сейчас не влияет, но это скрытая мина: при любой будущей правке (per-bucket base_pace, или использование абсолютного pace) placeholder начнёт молча искажать. Передавать 0.0 вместо honest-degrade — нарушение принципа graceful всего стека.

Как чинить: Не выдумывать ставку: при rate_future is None пропускать §9.4-нормализацию (norm.coefficient = 1.0) явно, либо ввести в compute_demand_normalization отдельный путь rate_future: float | None с честной нейтралью при None, вместо подмены на 0.0.


deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.85 · unit B23

**Severity:** low · **Категория:** logic/misleading-default · **Файл:** `backend/app/services/forecasting/recommendation.py:614-616` Файл backend/app/services/forecasting/recommendation.py:614-616. При rate_future is None (hold_last_rate не дал ставку) код передаёт rate_future=0.0 в compute_demand_normalization с комментарием «rate_future None → деградирует к нейтрали внутри себя, передаём 0.0 как placeholder». Фактически (demand_normalization.py:169-173) нейтраль 1.0 возвращается только при beta=None / rate_window_avg=None; при надёжном β<0 и rate_window_avg≈14.5 → delta=-14.5 → exp(β·delta)>1 → клэмп к _NORM_MAX=1.2 (максимальный аплифт +20%). ИМПАКТ: на текущий выход НЕ влияет, т.к. множитель одинаков для всех bucket'ов и сокращается в deficit_index=pace/max_pace; но при любой будущей правке (per-bucket base_pace или использование абсолютного pace) placeholder начнёт молча инфлировать спрос; плюс комментарий вводит в заблуждение о graceful-поведении. ФИКС: при rate_future is None пропускать §9.4-нормализацию (использовать norm.coefficient=1.0 явно) или передавать rate_future=rate_window_avg (delta=0 → нейтраль), вместо 0.0; одновременно исправить комментарий. **Почему баг:** Комментарий в коде ложно утверждает graceful-нейтраль; фактически placeholder 0% — это экстремальное смягчение режима ставки, максимально инфлирующее спрос. В текущей реализации demand_only эффект сокращается в pace/max_pace (множитель одинаков для всех bucket'ов, см. отдельную находку), поэтому на ВЫХОД сейчас не влияет, но это скрытая мина: при любой будущей правке (per-bucket base_pace, или использование абсолютного pace) placeholder начнёт молча искажать. Передавать 0.0 вместо honest-degrade — нарушение принципа graceful всего стека. **Как чинить:** Не выдумывать ставку: при `rate_future is None` пропускать §9.4-нормализацию (norm.coefficient = 1.0) явно, либо ввести в `compute_demand_normalization` отдельный путь `rate_future: float | None` с честной нейтралью при None, вместо подмены на 0.0. --- <sub>deep-audit backend v2 (после PR #1543) · verify+harden, confidence 0.85 · unit B23</sub>
bot-backend added the
week ревью 1
label 2026-06-16 17:14:45 +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#1594
No description provided.