gendesign/frontend/src/components/site-finder/analysis
Light1YT dcccebf2c2
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / frontend-tests (pull_request) Successful in 1m17s
CI / openapi-codegen-check (pull_request) Successful in 2m11s
CI / backend-tests (pull_request) Successful in 10m19s
fix(forecasting): honest scenarios collapse when β rate-sensitivity gate fails (audit #1871 P1)
Когда demand_normalization honesty-gate отбивает β rate-sensitivity
(`sensitivity.confidence=='low'`, ЕКБ-регрессия не проходит n≥30/R²≥0.1/slope<0),
все 393 прод-отчёта получают coefficient=1.0 для всех трёх сценариев
conservative/base/aggressive. По дизайну backend честно деградирует, но фронт
рисует 3 разноцветные карточки/линии одинаковых чисел без caveat.

Backend (scenarios.py, report.py, report_assembler.py, orchestrator.py):
- compute_scenarios теперь возвращает (list, collapsed: bool, reason: str|None)
- _detect_collapsed(): math.isclose(rel_tol=1e-9, abs_tol=1e-6) сравнивает
  projected_demand_units И deficit_index на всех горизонтах между
  conservative и aggressive — расхождение в любой метрике на любом h → False
- _COLLAPSE_REASON_LOW_BETA — единственный источник истины каноничного
  русского предложения
- ReportScenarios получает поля scenarios_collapsed + scenarios_collapse_reason
- demand_normalization.py НЕ ТРОНУТ — поведение корректно по контракту

Backend экспортёры (report_pdf.py, excel.py):
- PDF: при collapse — тёмная плашка-параграф вместо таблицы трёх столбцов
- Excel: ОДНА строка «base» + caveat-ячейка вместо трёх идентичных столбцов

Frontend (forecast.ts, ScenariosBlock, ScenarioCards, ScenarioCompareTable,
ForecastChart, Section6Forecast, ptica.module.css):
- Тип ReportScenarios расширен двумя optional-полями
- ScenariosBlock (light): headline-bar + одна grid-карточка base + caveat
- ScenarioCards (ptica dark): sub-component ScenarioBaseCard, одна карточка
  + collapse-note, ScenarioCompareTable return null
- ForecastChart: effectiveScenarios filter — одна линия viz-1 «Базовый»
  вместо трёх перекрывающихся
- Section6Forecast: caveat выше графика, читается ТОЛЬКО из
  scenarios_collapse_reason (источник истины — backend constant)

Тесты: +18 новых (TestMetricsEqual×6, TestDetectCollapsed×7,
TestComputeScenariosCollapseDetection×4 + 1 проверка graceful + corner).
102 forecasting passed, 88 cross-module passed.

Refs #1871
2026-06-22 19:06:22 +05:00
..
__tests__ test(site-finder): wrap MiniMap test render in QueryClientProvider (#1736) 2026-06-18 10:03:48 +03:00
AnalysisBreadcrumb.tsx feat(sf-fe-a4): AnalysisSidebar (scrollspy) + Breadcrumb + UserAvatar 2026-05-18 01:12:18 +03:00
AnalysisSidebar.tsx fix(week-review): автофиксы код-ревью — 169 issue (label «week ревью 1») 2026-06-15 20:21:11 +05:00
EgrnPropertyTable.tsx fix(week-review): автофиксы код-ревью — 169 issue (label «week ревью 1») 2026-06-15 20:21:11 +05:00
ExportButtons.tsx fix(site-finder): adapt backend egrn_block → frontend ParcelEgrn (#1217) 2026-06-13 05:36:52 +00:00
forecast-helpers.ts feat(site-finder): продуктовые решения по фидбеку analyze (#1741 #1742 #1743 #1744 #1745) 2026-06-18 12:18:04 +05:00
ForecastAssortmentBlock.tsx feat(site-finder): продуктовые решения по фидбеку analyze (#1741 #1742 #1743 #1744 #1745) 2026-06-18 12:18:04 +05:00
ForecastChart.tsx fix(forecasting): honest scenarios collapse when β rate-sensitivity gate fails (audit #1871 P1) 2026-06-22 19:06:22 +05:00
ForecastConfidenceBlock.tsx fix(site-finder): 5 дефектов из боевого фидбека analyze (#1736 #1737 #1738 #1739 #1740) 2026-06-18 11:47:21 +05:00
ForecastExportButtons.tsx feat(forecast): expose DOCX & PPTX export buttons in forecast UI 2026-06-07 15:12:52 +05:00
ForecastFutureSupplyBlock.tsx feat(sf): 6.6 in-app future-supply pressure + pipeline competitors (§13.3) 2026-06-07 10:55:59 +00:00
ForecastHorizonsBlock.tsx feat(site-finder): продуктовые решения по фидбеку analyze (#1741 #1742 #1743 #1744 #1745) 2026-06-18 12:18:04 +05:00
ForecastMetaLine.tsx feat(forecast): show compute date / horizons / schema in Section 6 footer 2026-06-07 16:08:31 +05:00
ForecastProductTzBlock.tsx feat(site-finder): продуктовые решения по фидбеку analyze (#1741 #1742 #1743 #1744 #1745) 2026-06-18 12:18:04 +05:00
ForecastScoringBlock.tsx feat(forecast): render scoring transparency (§13.6) as in-app subsection 6.5 2026-06-07 10:08:28 +00:00
MiniMap.tsx fix(site-finder): 5 дефектов из боевого фидбека analyze (#1736 #1737 #1738 #1739 #1740) 2026-06-18 11:47:21 +05:00
NspdVerifyLink.tsx feat(site-finder): НСПД verify deep-links + landing GenDesign vs НСПД таблица (#97 #100) 2026-06-13 15:53:02 +00:00
PoiList2Gis.tsx fix(site-finder): correct POI-score mock shape+values, routing empty assert (#1486 review) 2026-06-17 20:47:01 +03:00
ScenariosBlock.tsx fix(forecasting): honest scenarios collapse when β rate-sensitivity gate fails (audit #1871 P1) 2026-06-22 19:06:22 +05:00
Section1ParcelInfo.tsx fix(week-review): автофиксы код-ревью — 169 issue (label «week ревью 1») 2026-06-15 20:21:11 +05:00
Section2NetworksUtilities.tsx Merge pull request 'feat(site-finder): карта точек подключения (НСПД) в секции «Сети» (#1746 part)' (#1751) from fix/1746-networks-section-map into main 2026-06-18 08:44:16 +00:00
Section3SettingsAndCompetitors.tsx fix(site-finder): перенумеровать под-подписи Section3 4.1/4.2/4.3 под новый порядок + doc-хедеры (#1741 хвост) 2026-06-18 12:38:54 +05:00
Section4Estimate.tsx fix(site-finder): перенумеровать под-подписи Section3 4.1/4.2/4.3 под новый порядок + doc-хедеры (#1741 хвост) 2026-06-18 12:38:54 +05:00
Section5Atmosphere.tsx feat(sf-fe-a11): Section 5 «Атмосфера / воздух» (#361) 2026-05-18 04:07:48 +00:00
Section6Forecast.tsx fix(forecasting): honest scenarios collapse when β rate-sensitivity gate fails (audit #1871 P1) 2026-06-22 19:06:22 +05:00
UserAvatar.tsx feat(sf-fe-a4): AnalysisSidebar (scrollspy) + Breadcrumb + UserAvatar 2026-05-18 01:12:18 +03:00