From 19cefcea1e44395ec10f290d9af30579601f2baf Mon Sep 17 00:00:00 2001 From: Pigbibi <20649888+Pigbibi@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:09:20 +0800 Subject: [PATCH] Show plugin load errors in strategy notifications --- application/rebalance_service.py | 6 +++++- notifications/telegram.py | 5 +++++ pyproject.toml | 4 ++-- requirements.txt | 4 ++-- tests/test_rebalance_service.py | 3 +++ 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/application/rebalance_service.py b/application/rebalance_service.py index 070ab13..744b8f0 100644 --- a/application/rebalance_service.py +++ b/application/rebalance_service.py @@ -48,6 +48,7 @@ ) from quant_platform_kit.common.strategy_plugins import ( attach_strategy_plugin_metadata, + build_strategy_plugin_error_notification_lines, build_strategy_plugin_report_payload, load_configured_strategy_plugin_signals, parse_strategy_plugin_mounts, @@ -200,11 +201,14 @@ def attach_strategy_plugin_result( error: str | None, translator: Callable[..., str], ) -> dict[str, Any]: - del translator if signals: result.update(build_strategy_plugin_report_payload(signals)) if error: result["strategy_plugin_error"] = error + result["strategy_plugin_error_lines"] = build_strategy_plugin_error_notification_lines( + error, + translator=translator, + ) return result diff --git a/notifications/telegram.py b/notifications/telegram.py index e1ee4d8..128c62e 100644 --- a/notifications/telegram.py +++ b/notifications/telegram.py @@ -1078,6 +1078,11 @@ def render_cycle_summary(result: Mapping[str, Any], *, lang: str = "en") -> str: lines.extend(_format_signal_lines(execution, translator=translator)) lines.append(SEPARATOR) lines.extend(target_diff_lines) + lines.extend( + str(line).strip() + for line in result.get("strategy_plugin_error_lines") or () + if str(line).strip() + ) execution_notes = tuple(result.get("execution_notes") or allocation.get("small_account_whole_share_cash_notes") or ()) lines.extend(format_small_account_cash_substitution_notes(execution_notes, translator=translator)) if submitted: diff --git a/pyproject.toml b/pyproject.toml index 7f529ff..4c3e9a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,8 +14,8 @@ authors = [ ] dependencies = [ "firstrade==0.0.39", - "quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@2a711adf60b585ca02932bab9ee1bac7ce1df7c6", - "us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@fdd39ef0313181bee9083319b87b7175c32b364d", + "quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@1a31ddde0dde0f2ad423e841a84af3ba0869e612", + "us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@0ad01faaa2741195d06ecf8dae6a0f3fda712080", "google-cloud-storage", "requests", ] diff --git a/requirements.txt b/requirements.txt index 8da772c..1b1d918 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ flask gunicorn firstrade==0.0.39 -quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@2a711adf60b585ca02932bab9ee1bac7ce1df7c6 -us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@fdd39ef0313181bee9083319b87b7175c32b364d +quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@1a31ddde0dde0f2ad423e841a84af3ba0869e612 +us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@0ad01faaa2741195d06ecf8dae6a0f3fda712080 google-cloud-storage requests pytest diff --git a/tests/test_rebalance_service.py b/tests/test_rebalance_service.py index d0600b6..e33d51a 100644 --- a/tests/test_rebalance_service.py +++ b/tests/test_rebalance_service.py @@ -450,6 +450,9 @@ def test_run_strategy_cycle_strategy_plugin_load_error_is_non_blocking(monkeypat assert result["ok"] is True assert result["action_done"] is True assert result["strategy_plugin_error"].startswith("JSONDecodeError:") + assert result["strategy_plugin_error_lines"] == ( + "⚠️ Plugin signal failed to load: invalid plugin mount JSON; this run falls back to built-in strategy rules", + ) assert result["strategy_plugin_alert_email_sent_count"] == 0 assert result["strategy_plugin_alert_sms_sent_count"] == 0