diff --git a/app/routers/market.py b/app/routers/market.py index e4fc038..aa73563 100644 --- a/app/routers/market.py +++ b/app/routers/market.py @@ -120,8 +120,9 @@ async def refresh_regime_fundamentals( _admin: User = Depends(require_admin), db: AsyncSession = Depends(get_db), ) -> APIEnvelope: - """Ask the configured LLM to re-estimate F1/F3 now (forces past a lock).""" + """Refresh F1/F3 via LLM, then recompute the latest eligible snapshot.""" data = await regime_monitor_service.refresh_fundamental_overrides(db, force=True) + await regime_monitor_service.update_regime_monitor(db) return APIEnvelope(status="success", data=data) diff --git a/tests/unit/test_regime_monitor.py b/tests/unit/test_regime_monitor.py index 5e3fa9e..b78b8d2 100644 --- a/tests/unit/test_regime_monitor.py +++ b/tests/unit/test_regime_monitor.py @@ -10,6 +10,7 @@ import pytest from sqlalchemy import select from app.models.regime_snapshot import RegimeSnapshot +from app.routers import market as market_router from app.services import regime_monitor_service as rms from app.services.regime_monitor_service import ( DEFAULT_CONFIG, @@ -222,6 +223,39 @@ async def test_routine_can_refresh_latest_trading_session_after_civil_day_rolls( assert rewrites == [True] +@pytest.mark.asyncio +async def test_manual_llm_refresh_recomputes_latest_regime_snapshot(monkeypatch): + calls: list[str] = [] + refreshed = {"f1_score": 0.0, "f3_score": 100.0} + + async def fake_refresh(_db, force): + assert force is True + calls.append("refresh") + return refreshed + + async def fake_recompute(_db): + calls.append("recompute") + return {"available": True} + + monkeypatch.setattr( + market_router.regime_monitor_service, + "refresh_fundamental_overrides", + fake_refresh, + ) + monkeypatch.setattr( + market_router.regime_monitor_service, + "update_regime_monitor", + fake_recompute, + ) + + response = await market_router.refresh_regime_fundamentals( + _admin=object(), db=object() + ) + + assert calls == ["refresh", "recompute"] + assert response.data == refreshed + + def test_compute_index_uses_one_max_price_vote_and_has_no_combined_score(): end = date(2026, 6, 26) rising = [100.0 + index * 0.2 for index in range(700)]