diff --git a/app/scheduler.py b/app/scheduler.py index 942fc5a..16efaa3 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -1561,8 +1561,12 @@ def configure_scheduler(schedule_config: dict[str, str] | None = None) -> None: (scan_rr, "rr_scanner", "R:R Scanner"), (run_shadow_book, "shadow_book", "Shadow Book (auto-traded strategy)"), (evaluate_outcomes, "outcome_evaluator", "Outcome Evaluator"), - (compute_market_regime, "market_regime", "Market Regime"), - (compute_regime_monitor, "regime_monitor", "Regime Monitor"), + # Labels only -- the ids are persisted (pipeline steps, cron config, run + # history), so they stay. "Market Regime"/"Regime Monitor" read as the + # same job and had it backwards besides: the SPY guard is the one that + # changes what a setup shows, while the monitor is observational. + (compute_market_regime, "market_regime", "Market Trend (SPY)"), + (compute_regime_monitor, "regime_monitor", "AI/Tech Risk Monitor"), ] for fn, job_id, job_name in _members: scheduler.add_job( diff --git a/app/services/admin_service.py b/app/services/admin_service.py index 6de12b2..a5f20f8 100644 --- a/app/services/admin_service.py +++ b/app/services/admin_service.py @@ -639,8 +639,9 @@ JOB_LABELS = { "ticker_universe_sync": "Ticker Universe Sync", "outcome_evaluator": "Outcome Evaluator", "alerts": "Alerts Dispatcher", - "market_regime": "Market Regime", - "regime_monitor": "Regime Monitor", + # Keys are persisted job ids and must not change; these are display only. + "market_regime": "Market Trend (SPY)", + "regime_monitor": "AI/Tech Risk Monitor", "event_study": "Event Study", "backtest": "Backtest", "daily_pipeline": "Morning Pipeline", diff --git a/app/services/alert_service.py b/app/services/alert_service.py index 7fd2bcd..3c07b42 100644 --- a/app/services/alert_service.py +++ b/app/services/alert_service.py @@ -860,7 +860,7 @@ async def _collect_regime_quadrant(db: AsyncSession) -> list[tuple[str, str]]: else: metrics = f"State {x:.0f} · Warning {y:.0f}" text = ( - f"🧭 Regime quadrant change\n" + f"🧭 AI/Tech risk quadrant change\n" f"{QUAD_LABELS.get(prev, prev)} → {QUAD_LABELS.get(new_q, new_q)}\n" f"{metrics}\n" f"coverage: state {state.get('coverage'):.0f}% / warning {warning.get('coverage'):.0f}%\n" diff --git a/frontend/src/components/admin/AlertSettings.tsx b/frontend/src/components/admin/AlertSettings.tsx index 9dad744..f8a4190 100644 --- a/frontend/src/components/admin/AlertSettings.tsx +++ b/frontend/src/components/admin/AlertSettings.tsx @@ -21,7 +21,7 @@ const TRIGGERS: { key: TriggerKey; label: string; hint: string }[] = [ { key: 'sr_proximity_enabled', label: 'Watchlist S/R proximity', hint: 'a watched ticker nears a strong support/resistance' }, { key: 'score_drop_enabled', label: 'Score deterioration', hint: 'a watched ticker’s composite drops sharply' }, { key: 'digest_enabled', label: 'Daily digest', hint: 'end-of-day summary incl. open trades + trailing stops' }, - { key: 'regime_quadrant_enabled', label: 'Regime quadrant change', hint: 'the regime monitor shifts quadrant (hysteresis + cooldown)' }, + { key: 'regime_quadrant_enabled', label: 'Risk quadrant change', hint: 'the AI/Tech risk monitor shifts quadrant (hysteresis + cooldown)' }, { key: 'trade_closed_enabled', label: 'Trade closed', hint: 'a paper trade auto-closes (trailing/target/stop) — incl. losses' }, ]; diff --git a/frontend/src/components/admin/ScheduleSettings.tsx b/frontend/src/components/admin/ScheduleSettings.tsx index 4d2f21c..ef74740 100644 --- a/frontend/src/components/admin/ScheduleSettings.tsx +++ b/frontend/src/components/admin/ScheduleSettings.tsx @@ -22,7 +22,7 @@ const FIELDS: { key: keyof ScheduleConfig; label: string; hint: string; mono?: b { key: 'schedule_daily_pipeline_cron', label: 'Morning pipeline', - hint: 'OHLCV → benchmark → sentiment → regime → alerts (no R:R scan). Default 02:00 ET so regime-quadrant changes hit Telegram in the morning.', + hint: 'OHLCV → benchmark → sentiment → trend/risk → alerts (no R:R scan). Default 02:00 ET so risk-quadrant changes hit Telegram in the morning.', mono: true, }, { diff --git a/frontend/src/components/layout/MobileNav.tsx b/frontend/src/components/layout/MobileNav.tsx index 2762c87..7cc45e8 100644 --- a/frontend/src/components/layout/MobileNav.tsx +++ b/frontend/src/components/layout/MobileNav.tsx @@ -7,7 +7,7 @@ const navItems = [ { to: '/', label: 'Overview', end: true }, { to: '/market', label: 'Market', end: false }, { to: '/signals', label: 'Signals', end: false }, - { to: '/regime', label: 'Regime', end: false }, + { to: '/regime', label: 'Risk', end: false }, ]; export default function MobileNav() { diff --git a/frontend/src/components/layout/TopBar.tsx b/frontend/src/components/layout/TopBar.tsx index dc77cac..479bea6 100644 --- a/frontend/src/components/layout/TopBar.tsx +++ b/frontend/src/components/layout/TopBar.tsx @@ -13,7 +13,8 @@ const navItems = [ { to: '/', label: 'Overview', end: true }, { to: '/market', label: 'Market', end: false }, { to: '/signals', label: 'Signals', end: false }, - { to: '/regime', label: 'Regime', end: false }, + // Route stays /regime so existing links keep working; only the label changes. + { to: '/regime', label: 'Risk', end: false }, ]; const linkClasses = (isActive: boolean) => diff --git a/frontend/src/pages/RegimePage.tsx b/frontend/src/pages/RegimePage.tsx index 241666e..4fac24e 100644 --- a/frontend/src/pages/RegimePage.tsx +++ b/frontend/src/pages/RegimePage.tsx @@ -507,13 +507,13 @@ export default function RegimePage() { return (
{monitor.isLoading && <>} {monitor.isError && monitor.refetch()}>Failed to load: {(monitor.error as Error).message}} - {data && !data.available && Not computed yet — run “Regime Monitor” from Admin → Jobs or wait for the daily pipeline.} + {data && !data.available && Not computed yet — run “AI/Tech Risk Monitor” from Admin → Jobs or wait for the daily pipeline.} {data?.available && data.state && data.warning && ( <>