(medium) RecommendVelocityPanel footnote: текст «темп = базовый × pf^elasticity» не совпадает с фактическим Темпом продаж #1432

Closed
opened 2026-06-15 05:54:47 +00:00 by bot-backend · 1 comment
Collaborator

Severity: medium · Категория: report · Файл: frontend/src/components/analytics/RecommendVelocityPanel.tsx:78-79,494-496

RecommendVelocityPanel.tsx:78-79 (расчёт), 138 (вывод KPI), 494-496 (подпись). Подпись внизу панели утверждает: «При price ×pf темп = базовый × pf^elasticity = ×pfPow» (стр. 494-496), где pfPow = priceFactorscope.elasticity (стр. 46-49). Но показанный KPI «Темп продаж» = totals.tempo (стр. 138) = adjustedVelocity, когда adjustedVelocity > 0 (стр. 78-79), который суммирует per-bucket скорости с СОБСТВЕННОЙ эластичностью каждого бакета (be = r.elasticity ?? elasticity, стр. 68) и масштабом shareRatio (стр. 71): tempo = Σ(v × shareRatio × priceFactorbe). При elasticity_per_bucket (Tier-3) или при сдвиге долей (shareRatio != 1) показанный Темп не равен base × priceFactor**scope.elasticity. Fallback base × pfPow (стр. 79) срабатывает только когда adjustedVelocity == 0, то есть в основном пути формула footnote не используется. Импакт: пояснение для клиента описывает формулу, отличную от способа получения показанного числа. Чинить: переписать подпись под фактическую per-bucket агрегацию, либо показывать pfPow как иллюстрацию, а не как формулу Темпа.

Почему баг: tempo = Σ(v × shareRatio × priceFactorbe), be = per-bucket elasticity. footnote же описывает base × priceFactorscope.elasticity. При elasticity_per_bucket (Tier-3) или при сдвиге долей (shareRatio!=1) число Темпа не равно тому, что декларирует пояснение → рассинхрон данных и текста.

Как чинить: Либо переписать footnote (отразить per-bucket эластичность и нормировку по долям), либо вычислять отображаемый Темп как base×pfPow, как обещает текст.


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

**Severity:** medium · **Категория:** report · **Файл:** `frontend/src/components/analytics/RecommendVelocityPanel.tsx:78-79,494-496` RecommendVelocityPanel.tsx:78-79 (расчёт), 138 (вывод KPI), 494-496 (подпись). Подпись внизу панели утверждает: «При price ×pf темп = базовый × pf^elasticity = ×pfPow» (стр. 494-496), где pfPow = priceFactor**scope.elasticity (стр. 46-49). Но показанный KPI «Темп продаж» = totals.tempo (стр. 138) = adjustedVelocity, когда adjustedVelocity > 0 (стр. 78-79), который суммирует per-bucket скорости с СОБСТВЕННОЙ эластичностью каждого бакета (be = r.elasticity ?? elasticity, стр. 68) и масштабом shareRatio (стр. 71): tempo = Σ(v × shareRatio × priceFactor**be). При elasticity_per_bucket (Tier-3) или при сдвиге долей (shareRatio != 1) показанный Темп не равен base × priceFactor**scope.elasticity. Fallback base × pfPow (стр. 79) срабатывает только когда adjustedVelocity == 0, то есть в основном пути формула footnote не используется. Импакт: пояснение для клиента описывает формулу, отличную от способа получения показанного числа. Чинить: переписать подпись под фактическую per-bucket агрегацию, либо показывать pfPow как иллюстрацию, а не как формулу Темпа. **Почему баг:** tempo = Σ(v × shareRatio × priceFactor**be), be = per-bucket elasticity. footnote же описывает base × priceFactor**scope.elasticity. При elasticity_per_bucket (Tier-3) или при сдвиге долей (shareRatio!=1) число Темпа не равно тому, что декларирует пояснение → рассинхрон данных и текста. **Как чинить:** Либо переписать footnote (отразить per-bucket эластичность и нормировку по долям), либо вычислять отображаемый Темп как base×pfPow, как обещает текст. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.8 · unit U86</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:54:47 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:03 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: frontend/src/components/analytics/RecommendVelocityPanel.tsxpfPow на стр.46-49 (priceFactor ** scope.elasticity), расчёт tempo на стр.78-79, вывод KPI «Темп продаж» на стр.136-140 (totals.tempo), подпись-footnote на стр.494-496.

Корень: footnote утверждает «При price ×pf темп = базовый × pf^elasticity = ×pfPow» (стр.494-496), где pfPow = priceFactor ** scope.elasticity. Но показанный KPI = totals.tempo = adjustedVelocity (стр.78), который суммируется per-bucket с собственной эластичностью (be = r.elasticity ?? elasticity, стр.68) и масштабом shareRatio (стр.66,71): tempo = Σ(v × shareRatio × priceFactor**be). Fallback baseVelocity * pfPow (стр.79) срабатывает только при adjustedVelocity == 0 — т.е. в основном пути формула footnote не используется. При Tier-3 elasticity_per_bucket или shareRatio != 1 показанный Темп ≠ base × pf^scope.elasticity.

Что править:

  • Переписать footnote под фактическую агрегацию: Темп = Σ по бакетам (базовый_v × доля × pf^эластичность_бакета), отметить нормировку по эффективным долям; либо подавать pfPow как иллюстрацию для одного бакета, а не как формулу итогового Темпа.
  • Смежно с #1431 (один источник — per-bucket vs scope elasticity). Лейбл scope/backend спорен: правка чисто фронтовая (текст + опционально формула в TSX).

Что посмотреть:

  • Код: RecommendVelocityPanel.tsx:46-49,54-91,136-140,442-497; проверить, что текст footnote и формула KPI согласованы.
  • Vault: domains/analytics/ui/Component_Recommend_Velocity_Panel.md (упоминает нижнюю подпись «Эластичность … (регрессия sale_graph / fallback)»; ссылки Module_Liquidity_Score_24mo, Pricing_Slider_Range).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/components/analytics/RecommendVelocityPanel.tsx` — `pfPow` на стр.46-49 (`priceFactor ** scope.elasticity`), расчёт `tempo` на стр.78-79, вывод KPI «Темп продаж» на стр.136-140 (`totals.tempo`), подпись-footnote на стр.494-496. **Корень:** footnote утверждает «При price ×pf темп = базовый × pf^elasticity = ×pfPow» (стр.494-496), где `pfPow = priceFactor ** scope.elasticity`. Но показанный KPI = `totals.tempo` = `adjustedVelocity` (стр.78), который суммируется per-bucket с собственной эластичностью (`be = r.elasticity ?? elasticity`, стр.68) и масштабом `shareRatio` (стр.66,71): `tempo = Σ(v × shareRatio × priceFactor**be)`. Fallback `baseVelocity * pfPow` (стр.79) срабатывает только при `adjustedVelocity == 0` — т.е. в основном пути формула footnote не используется. При Tier-3 `elasticity_per_bucket` или `shareRatio != 1` показанный Темп ≠ `base × pf^scope.elasticity`. **Что править:** - Переписать footnote под фактическую агрегацию: `Темп = Σ по бакетам (базовый_v × доля × pf^эластичность_бакета)`, отметить нормировку по эффективным долям; либо подавать `pfPow` как иллюстрацию для одного бакета, а не как формулу итогового Темпа. - Смежно с #1431 (один источник — per-bucket vs scope elasticity). Лейбл `scope/backend` спорен: правка чисто фронтовая (текст + опционально формула в TSX). **Что посмотреть:** - Код: `RecommendVelocityPanel.tsx:46-49,54-91,136-140,442-497`; проверить, что текст footnote и формула KPI согласованы. - Vault: `domains/analytics/ui/Component_Recommend_Velocity_Panel.md` (упоминает нижнюю подпись «Эластичность … (регрессия sale_graph / fallback)»; ссылки `Module_Liquidity_Score_24mo`, `Pricing_Slider_Range`).
bot-backend added
scope/frontend
and removed
scope/backend
labels 2026-06-15 11:32:44 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#1432
No description provided.