feat(forecast): in-app scoring transparency (subsection 6.5) (#958) #1120

Merged
bot-backend merged 1 commit from feat/forecast-scoring-panel into main 2026-06-07 10:08:29 +00:00
Collaborator

Что

Подсекция «6.5 Прозрачность скоринга» в браузерный экран прогноза (Section6Forecast) — рендер scoring (§13.6/§14): разбивка из 10 продуктовых скоров + 6 спец-индексов, которая объясняет ИЗ ЧЕГО сложился итоговый KPI. Раньше существовала только в экспортах; в приложении был виден лишь один общий балл.

Относится к #958 (EPIC 14: UI экран прогноза).

Честность визуализации (два решённых капкана)

  1. Пороги цвета привязаны к задокументированному балансу 0.5 (product_scoring.py:127 _MARKET_FIT_MIDPOINT=0.5; риск-скоры пред-инвертированы → score>0.5 = благоприятно). Полоса: ≥0.55 зелёная/«сильный», 0.45–0.55 жёлтая/«средний», <0.45 красная/«слабый». (Первая версия ошибочно красила благоприятный 0.60 тем же жёлтым, что неблагоприятный 0.42 — code-reviewer отловил, исправлено.)
  2. Спец-индексы — нейтральный акцент, без good/bad градиента, т.к. их значение = «сила сигнала» с НЕ-однородным направлением (special_indices.py:139: cost_of_error/cannibalization растут к худшему, launch_window/product_void — к лучшему). Применять зелёно-красную шкалу к ним = ложная валентность.

Содержимое

  • types/forecast.tsReportScoring + вложенные (dict-keyed scores/indices как Record<>, сверено с as_dict() в product_scoring.py/special_indices.py).
  • ForecastScoringBlock.tsx (новый) — две группы token-полос; value:null рендерится как «нет данных» (НЕ 0-полоса, чтобы не выдать отсутствие данных за настоящий ноль); a11y role=img+aria.
  • forecast-helpers.tsscoreVariant/scoreBarWidthPct + RU-карты меток (PRODUCT_SCORE_RU/SPECIAL_INDEX_RU как единый источник).
  • Section6Forecast + сайдбар-нав — проводка 6.5. Общий KPI НЕ дублируется.

Качество

  • code-reviewer: ⚠️ — порог-honesty исправлен на 0.5-anchored; null-vs-zero gate пройден, нейтральные индексы верны, типы сверены с backend, no-regression к 6.1-6.4, токены, RU, no any, no deps. npm run build зелёный, prettier чисто.

Тест-план (post-deploy)

/site-finder/analysis/66:41:0702048:27 → Секция 6 → «6.5 Прозрачность скоринга»: 10 скоров + 6 индексов, цвет полос переключается на 0.55/0.45, null-метрики показывают «нет данных».

## Что Подсекция **«6.5 Прозрачность скоринга»** в браузерный экран прогноза (Section6Forecast) — рендер `scoring` (§13.6/§14): разбивка из 10 продуктовых скоров + 6 спец-индексов, которая объясняет ИЗ ЧЕГО сложился итоговый KPI. Раньше существовала только в экспортах; в приложении был виден лишь один общий балл. Относится к #958 (EPIC 14: UI экран прогноза). ## Честность визуализации (два решённых капкана) 1. **Пороги цвета привязаны к задокументированному балансу 0.5** (`product_scoring.py:127` `_MARKET_FIT_MIDPOINT=0.5`; риск-скоры пред-инвертированы → score>0.5 = благоприятно). Полоса: ≥0.55 зелёная/«сильный», 0.45–0.55 жёлтая/«средний», <0.45 красная/«слабый». (Первая версия ошибочно красила благоприятный 0.60 тем же жёлтым, что неблагоприятный 0.42 — code-reviewer отловил, исправлено.) 2. **Спец-индексы — нейтральный акцент, без good/bad градиента**, т.к. их значение = «сила сигнала» с НЕ-однородным направлением (`special_indices.py:139`: cost_of_error/cannibalization растут к худшему, launch_window/product_void — к лучшему). Применять зелёно-красную шкалу к ним = ложная валентность. ## Содержимое - `types/forecast.ts` — `ReportScoring` + вложенные (dict-keyed `scores`/`indices` как `Record<>`, сверено с `as_dict()` в product_scoring.py/special_indices.py). - `ForecastScoringBlock.tsx` (новый) — две группы token-полос; `value:null` рендерится как «нет данных» (НЕ 0-полоса, чтобы не выдать отсутствие данных за настоящий ноль); a11y `role=img`+aria. - `forecast-helpers.ts` — `scoreVariant`/`scoreBarWidthPct` + RU-карты меток (PRODUCT_SCORE_RU/SPECIAL_INDEX_RU как единый источник). - `Section6Forecast` + сайдбар-нав — проводка 6.5. Общий KPI НЕ дублируется. ## Качество - `code-reviewer`: ⚠️→✅ — порог-honesty исправлен на 0.5-anchored; null-vs-zero gate пройден, нейтральные индексы верны, типы сверены с backend, no-regression к 6.1-6.4, токены, RU, no `any`, no deps. `npm run build` зелёный, prettier чисто. ## Тест-план (post-deploy) `/site-finder/analysis/66:41:0702048:27` → Секция 6 → «6.5 Прозрачность скоринга»: 10 скоров + 6 индексов, цвет полос переключается на 0.55/0.45, null-метрики показывают «нет данных».
bot-backend added the
scope/frontend
GG-форсайт
site-finder
labels 2026-06-07 10:08:26 +00:00
bot-backend added 1 commit 2026-06-07 10:08:27 +00:00
feat(forecast): render scoring transparency (§13.6) as in-app subsection 6.5
All checks were successful
CI / backend-tests (push) Has been skipped
CI / changes (push) Successful in 7s
CI / changes (pull_request) Successful in 6s
CI / backend-tests (pull_request) Has been skipped
a04f2d98fc
Surface the product-score + special-index breakdown behind the overall KPI
as two token-bar groups in Section 6 (6.5), sidebar anchor section-6-5.
Product scores use a 0..1 quality gradient anchored on the documented 0.5
balance point (>=0.55 strong / 0.45-0.55 mid / <0.45 weak; risk scores are
pre-inverted so higher=better); special indices use a neutral accent
(value = signal strength, direction non-uniform). Null values render as
«нет данных», never a 0-bar that implies a real zero. Graceful on
absent/partial/202-pending.

- types/forecast.ts: ReportScoring + nested (dict-keyed scores/indices)
- ForecastScoringBlock.tsx: two bar groups, a11y, null-distinct rendering
- forecast-helpers.ts: scoreVariant/scoreBarWidthPct + RU label maps
- Section6Forecast + sidebar nav: wire 6.5

Part of #958.
bot-backend merged commit a66c35ae49 into main 2026-06-07 10:08:29 +00:00
Sign in to join this conversation.
No reviewers
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#1120
No description provided.