@@ -663,6 +663,71 @@ def test_strategy_plugin_no_action_signal_does_not_escalate_alert(self):
663663 self .assertFalse (should_alert_strategy_plugin_signal (signal ))
664664 self .assertEqual (build_strategy_plugin_alert_messages ([signal ]), ())
665665
666+ def test_strategy_plugin_auto_position_control_signal_stays_with_strategy_notification (self ):
667+ signal = validate_strategy_plugin_signal_payload (
668+ {
669+ ** _signal_payload (plugin = PLUGIN_MARKET_REGIME_CONTROL ),
670+ "canonical_route" : "risk_off" ,
671+ "suggested_action" : "defend" ,
672+ "would_trade_if_enabled" : True ,
673+ "execution_controls" : {
674+ ** _signal_payload ()["execution_controls" ],
675+ "strategy_runtime_metadata_allowed" : True ,
676+ "position_control_allowed" : True ,
677+ "consumption_evidence_status" : "automation_approved" ,
678+ },
679+ }
680+ )
681+
682+ self .assertFalse (should_alert_strategy_plugin_signal (signal ))
683+ self .assertEqual (build_strategy_plugin_alert_messages ([signal ]), ())
684+
685+ def test_strategy_plugin_notification_target_still_alerts_plugin_bot (self ):
686+ signal = validate_strategy_plugin_signal_payload (
687+ {
688+ ** _signal_payload (plugin = PLUGIN_MARKET_REGIME_CONTROL ),
689+ "target_type" : "notification_target" ,
690+ "strategy" : "" ,
691+ "notification_target" : GENERAL_MARKET_REGIME_NOTIFICATION_TARGET ,
692+ "canonical_route" : "risk_off" ,
693+ "suggested_action" : "defend" ,
694+ "would_trade_if_enabled" : True ,
695+ "execution_controls" : {
696+ ** _signal_payload ()["execution_controls" ],
697+ "strategy_runtime_metadata_allowed" : False ,
698+ "position_control_allowed" : False ,
699+ "consumption_evidence_status" : "notification_only" ,
700+ "capital_impact" : "notification_only" ,
701+ },
702+ }
703+ )
704+
705+ self .assertTrue (should_alert_strategy_plugin_signal (signal ))
706+ alerts = build_strategy_plugin_alert_messages ([signal ])
707+ self .assertEqual (len (alerts ), 1 )
708+ self .assertEqual (alerts [0 ].metadata ["target_type" ], "notification_target" )
709+
710+ def test_strategy_plugin_manual_review_strategy_signal_still_alerts_plugin_bot (self ):
711+ signal = validate_strategy_plugin_signal_payload (
712+ {
713+ ** _signal_payload (plugin = PLUGIN_MARKET_REGIME_CONTROL ),
714+ "canonical_route" : "opportunity_watch" ,
715+ "suggested_action" : "notify_manual_review" ,
716+ "would_trade_if_enabled" : False ,
717+ "execution_controls" : {
718+ ** _signal_payload ()["execution_controls" ],
719+ "strategy_runtime_metadata_allowed" : True ,
720+ "position_control_allowed" : True ,
721+ "consumption_evidence_status" : "automation_approved" ,
722+ },
723+ }
724+ )
725+
726+ self .assertTrue (should_alert_strategy_plugin_signal (signal ))
727+ alerts = build_strategy_plugin_alert_messages ([signal ])
728+ self .assertEqual (len (alerts ), 1 )
729+ self .assertIn ("Manual review only" , alerts [0 ].body )
730+
666731 def test_strategy_plugin_true_crisis_builds_generic_alert_message (self ):
667732 signal = validate_strategy_plugin_signal_payload (
668733 {
0 commit comments