diff --git a/backend/app/services/strategy_service.py b/backend/app/services/strategy_service.py index 9ed86ce..492ce7a 100644 --- a/backend/app/services/strategy_service.py +++ b/backend/app/services/strategy_service.py @@ -887,6 +887,33 @@ def _issue_message(event: str, message: str | None, data: dict | None, meta: dic return message or _humanize_reason(reason) or "Strategy update available." +def _issue_is_stale_for_current_state( + user_id: str, + status: dict, + event: str, + data: dict | None, + meta: dict | None, +): + cfg = status.get("config") if isinstance(status.get("config"), dict) else {} + mode = str(cfg.get("mode") or "").strip().upper() + if mode != "LIVE": + return False + + payload = data if isinstance(data, dict) else {} + extra = meta if isinstance(meta, dict) else {} + reason = payload.get("reason") or extra.get("reason") + reason_key = str(reason or "").strip().lower() + auth_related_issue = event == "BROKER_AUTH_EXPIRED" or ( + event == "SIP_NO_FILL" and reason_key == "broker_auth_expired" + ) or (event == "EXECUTION_BLOCKED" and reason_key in {"broker_auth_expired", "auth_expired"}) + if not auth_related_issue: + return False + + broker_state = get_user_broker(user_id) or {} + auth_state = str(broker_state.get("auth_state") or "").strip().upper() + return auth_state == "VALID" + + def get_strategy_summary(user_id: str): run_id = get_active_run_id(user_id) status = get_strategy_status(user_id) @@ -930,15 +957,16 @@ def get_strategy_summary(user_id: str): if issue_row: event, message, data, meta, ts = issue_row - summary.update( - { - "tone": "error" if event in {"ENGINE_ERROR", "ORDER_REJECTED"} else "warning", - "message": _issue_message(event, message, data, meta), - "event": event, - "ts": _format_local_ts(ts), - } - ) - return summary + if not _issue_is_stale_for_current_state(user_id, status, event, data, meta): + summary.update( + { + "tone": "error" if event in {"ENGINE_ERROR", "ORDER_REJECTED"} else "warning", + "message": _issue_message(event, message, data, meta), + "event": event, + "ts": _format_local_ts(ts), + } + ) + return summary status_key = (status.get("status") or "IDLE").upper() if status_key == "WAITING" and next_eligible_ts: