Additively extend #982 build_forecast_overlay: class recommendation (§10.2,
strongest aggregate deficit per class), USP-from-deficits (§10.5, top-3),
degraded-honest commercial signal (§10.4, premise_kind=нежилое → available:False
+caveat when thin, never fabricates), and a §16 structural reason
(why/drivers/rejected/what_would_change/confidence/advisory) on every ranked
segment. §16 rejected-alternatives derived from the what_to_build ranking
runner-ups. Deterministic, no LLM, advisory, no new SQL. All #982 keys/behavior
preserved; schema extended additively (RecommendReason + optional fields).
31 new tests (86 total recommendation+velocity green).
Scraper resume:
- /admin/scrape/queue autoclean уменьшен с 60min started_at до 10min
COALESCE(heartbeat_at, started_at). Не режет валидные long sweeps.
- Phase A пишет heartbeat после каждого objStatus fetch (3min Phase A
больше не рискует быть отмеченной как zombie при новом 10min threshold).
Recommend (Уровень 1 калькулятор):
- POST /api/v1/analytics/recommend/mix с velocity baseline (sale_graph),
price elasticity (regr_slope/r2 на sale_graph, fallback -1.5),
inverse mode (target_months → required price_factor), liquidity score
24mo, headline.
- /analytics/recommend: RecommendVelocityPanel (price slider 0.85..1.15
+ 4 KPI Чек/Срок/Темп/Ликвидность + методология эластичности),
RecommendLiquidityChart (cumulative 0..36 mo с пунктиром на 24).
- BucketsTable: +колонки Темп и Срок, цены/выручка масштабируются по
priceFactor live.
- Все слайдеры и target_months считаются клиентски — никаких round-trip.
Fix: SQLAlchemy не парсит :cls::text — заменено на CAST(:cls AS TEXT).