(medium) RecommendVelocityPanel vs RecommendLiquidityChart: KPI ликвидности на per-bucket эластичности, график «24 мес = liquidity» — на единой scope-эластичности #1431

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

Severity: medium · Категория: report · Файл: frontend/src/components/analytics/RecommendVelocityPanel.tsx:68-75

RecommendVelocityPanel.tsx:68-75 vs RecommendLiquidityChart.tsx:35,55. Панель считает per-bucket ликвидность со СВОЕЙ эластичностью бакета: be = r.elasticity ?? elasticity; bucketPfPow = priceFactorbe; adjustedV = v*bucketPfPow (стр. 68-70). RecommendLiquidityChart считает ту же кумулятивную кривую с ЕДИНОЙ scope-эластичностью для всех бакетов: pfPow = priceFactorelasticity; v = velocity*pfPow (стр. 35,55). Подпись секции (page.tsx:238) обещает «Пунктир — горизонт 24 мес = liquidity score», т.е. значение кривой в 24 мес должно совпадать с KPI «Ликвидность 24 мес». При priceFactor != 1 и гетерогенных elasticity_per_bucket (Tier-3) priceFactorbe != priceFactorelasticity, поэтому adjustedV (панель) != v (график) → KPI-число и точка графика на 24 мес расходятся, хотя подпись декларирует равенство. Дополнительно: график вовсе не масштабирует velocity на shareRatio (стр. 55), а KPI ликвидности использует effective_units, что усиливает расхождение при сдвиге долей. Чинить: привести обе формулы к одной эластичности (передать per-bucket be в график или единую elasticity в панель) и согласовать обработку effective доли.

Почему баг: При priceFactor != 1 и разных эластичностях бакетов (scope.elasticity_per_bucket, Tier-3) priceFactorbe != priceFactorelasticity, поэтому adjustedV (панель) и v (график) различаются. Следствие — KPI-число ликвидности и визуализирующий его график на отметке 24 мес не совпадают, хотя подпись обещает равенство.

Как чинить: Привести обе реализации к одной формуле: либо график берёт per-bucket эластичность (r.elasticity), либо панель для liquidity-KPI использует единую scope elasticity, как график. Лучше вынести расчёт кумулятивной ликвидности в общую функцию.


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

**Severity:** medium · **Категория:** report · **Файл:** `frontend/src/components/analytics/RecommendVelocityPanel.tsx:68-75` RecommendVelocityPanel.tsx:68-75 vs RecommendLiquidityChart.tsx:35,55. Панель считает per-bucket ликвидность со СВОЕЙ эластичностью бакета: be = r.elasticity ?? elasticity; bucketPfPow = priceFactor**be; adjustedV = v*bucketPfPow (стр. 68-70). RecommendLiquidityChart считает ту же кумулятивную кривую с ЕДИНОЙ scope-эластичностью для всех бакетов: pfPow = priceFactor**elasticity; v = velocity*pfPow (стр. 35,55). Подпись секции (page.tsx:238) обещает «Пунктир — горизонт 24 мес = liquidity score», т.е. значение кривой в 24 мес должно совпадать с KPI «Ликвидность 24 мес». При priceFactor != 1 и гетерогенных elasticity_per_bucket (Tier-3) priceFactor**be != priceFactor**elasticity, поэтому adjustedV (панель) != v (график) → KPI-число и точка графика на 24 мес расходятся, хотя подпись декларирует равенство. Дополнительно: график вовсе не масштабирует velocity на shareRatio (стр. 55), а KPI ликвидности использует effective_units, что усиливает расхождение при сдвиге долей. Чинить: привести обе формулы к одной эластичности (передать per-bucket be в график или единую elasticity в панель) и согласовать обработку effective доли. **Почему баг:** При priceFactor != 1 и разных эластичностях бакетов (scope.elasticity_per_bucket, Tier-3) priceFactor**be != priceFactor**elasticity, поэтому adjustedV (панель) и v (график) различаются. Следствие — KPI-число ликвидности и визуализирующий его график на отметке 24 мес не совпадают, хотя подпись обещает равенство. **Как чинить:** Привести обе реализации к одной формуле: либо график берёт per-bucket эластичность (r.elasticity), либо панель для liquidity-KPI использует единую scope elasticity, как график. Лучше вынести расчёт кумулятивной ликвидности в общую функцию. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.75 · unit U86</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:54:46 +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.tsx:65-75 (per-bucket) vs frontend/src/components/analytics/RecommendLiquidityChart.tsx:35,55 (единая эластичность). Подпись секции — frontend/src/app/analytics/recommend/page.tsx:234 («Пунктир — горизонт 24 мес = liquidity score»). Chart получает elasticity={data.scope.elasticity} (recommend/page.tsx:239).

Корень: панель считает per-bucket: be = r.elasticity ?? elasticity (стр.68), bucketPfPow = priceFactor ** be (стр.69), adjustedV = v * bucketPfPow (стр.70), плюс масштаб shareRatio = effective_share_pct / share_pct (стр.66,71). График же берёт единую scope-эластичность: pfPow = priceFactor ** elasticity (стр.35), v = velocity_per_month * pfPow (стр.55), без shareRatio. При priceFactor != 1 и гетерогенных elasticity_per_bucket (Tier-3) priceFactor**be != priceFactor**elasticity → значение кривой графика в 24 мес ≠ KPI «Ликвидность 24 мес» панели, хотя подпись декларирует равенство.

Что править:

  • Свести обе реализации к одной формуле: вынести расчёт кумулятивной ликвидности (доля проданного к 24 мес) в общую функцию, использующую per-bucket эластичность и shareRatio в обоих местах. Либо явно передавать в RecommendLiquidityChart per-bucket r.elasticity и эффективные доли.
  • Лейбл scope/backend спорен: исправление целиком фронтовое (две TSX-формулы); согласовать с #1432 (общая первопричина — per-bucket vs scope elasticity).

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

  • Код: RecommendVelocityPanel.tsx:54-91, RecommendLiquidityChart.tsx:32-103, recommend/page.tsx:205-241; добавить unit-тест на совпадение KPI-ликвидности и точки кривой в 24 мес при priceFactor != 1 + Tier-3 эластичности.
  • Vault: domains/analytics/ui/Component_Recommend_Velocity_Panel.md (ссылается на Module_Liquidity_Score_24mo, Pricing_Slider_Range).
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/components/analytics/RecommendVelocityPanel.tsx:65-75` (per-bucket) vs `frontend/src/components/analytics/RecommendLiquidityChart.tsx:35,55` (единая эластичность). Подпись секции — `frontend/src/app/analytics/recommend/page.tsx:234` («Пунктир — горизонт 24 мес = liquidity score»). Chart получает `elasticity={data.scope.elasticity}` (recommend/page.tsx:239). **Корень:** панель считает per-bucket: `be = r.elasticity ?? elasticity` (стр.68), `bucketPfPow = priceFactor ** be` (стр.69), `adjustedV = v * bucketPfPow` (стр.70), плюс масштаб `shareRatio = effective_share_pct / share_pct` (стр.66,71). График же берёт единую scope-эластичность: `pfPow = priceFactor ** elasticity` (стр.35), `v = velocity_per_month * pfPow` (стр.55), без shareRatio. При `priceFactor != 1` и гетерогенных `elasticity_per_bucket` (Tier-3) `priceFactor**be != priceFactor**elasticity` → значение кривой графика в 24 мес ≠ KPI «Ликвидность 24 мес» панели, хотя подпись декларирует равенство. **Что править:** - Свести обе реализации к одной формуле: вынести расчёт кумулятивной ликвидности (доля проданного к 24 мес) в общую функцию, использующую per-bucket эластичность и shareRatio в обоих местах. Либо явно передавать в `RecommendLiquidityChart` per-bucket `r.elasticity` и эффективные доли. - Лейбл `scope/backend` спорен: исправление целиком фронтовое (две TSX-формулы); согласовать с #1432 (общая первопричина — per-bucket vs scope elasticity). **Что посмотреть:** - Код: `RecommendVelocityPanel.tsx:54-91`, `RecommendLiquidityChart.tsx:32-103`, `recommend/page.tsx:205-241`; добавить unit-тест на совпадение KPI-ликвидности и точки кривой в 24 мес при `priceFactor != 1` + Tier-3 эластичности. - Vault: `domains/analytics/ui/Component_Recommend_Velocity_Panel.md` (ссылается на `Module_Liquidity_Score_24mo`, `Pricing_Slider_Range`).
bot-backend added
scope/frontend
and removed
scope/backend
labels 2026-06-15 11:32:43 +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#1431
No description provided.