@@ -72,6 +72,22 @@ def _signal_payload(*, strategy="tqqq_growth_income", plugin="crisis_response_sh
7272 }
7373
7474
75+ def _auditable_position_control_controls ():
76+ return {
77+ ** _signal_payload ()["execution_controls" ],
78+ "strategy_runtime_metadata_allowed" : True ,
79+ "position_control_allowed" : True ,
80+ "consumption_evidence_status" : "automation_approved" ,
81+ "evidence_package_id" : "pkg_001" ,
82+ "evidence_valid_until" : "2026-08-01T00:00:00Z" ,
83+ "bounded_budget" : {
84+ "name" : "position_control" ,
85+ "amount" : 0.4 ,
86+ "unit" : "fraction" ,
87+ },
88+ }
89+
90+
7591class StrategyPluginsTests (unittest .TestCase ):
7692 def test_parse_strategy_plugin_mounts_uses_artifact_mode_not_platform_mode (self ):
7793 with tempfile .TemporaryDirectory () as tmp_dir :
@@ -625,12 +641,7 @@ def test_strategy_plugin_notification_lines_include_auto_consumption_line(self):
625641 "canonical_route" : "risk_off" ,
626642 "suggested_action" : "defend" ,
627643 "would_trade_if_enabled" : True ,
628- "execution_controls" : {
629- ** _signal_payload ()["execution_controls" ],
630- "strategy_runtime_metadata_allowed" : True ,
631- "position_control_allowed" : True ,
632- "consumption_evidence_status" : "automation_approved" ,
633- },
644+ "execution_controls" : _auditable_position_control_controls (),
634645 }
635646 )
636647 translations = {
@@ -657,6 +668,44 @@ def test_strategy_plugin_notification_lines_include_auto_consumption_line(self):
657668 ),
658669 )
659670
671+ def test_strategy_plugin_auto_position_control_without_auditable_evidence_is_not_auto_consumed (self ):
672+ signal = validate_strategy_plugin_signal_payload (
673+ {
674+ ** _signal_payload (plugin = PLUGIN_MARKET_REGIME_CONTROL ),
675+ "canonical_route" : "risk_off" ,
676+ "suggested_action" : "defend" ,
677+ "would_trade_if_enabled" : True ,
678+ "execution_controls" : {
679+ ** _signal_payload ()["execution_controls" ],
680+ "strategy_runtime_metadata_allowed" : True ,
681+ "position_control_allowed" : True ,
682+ "consumption_evidence_status" : "automation_approved" ,
683+ },
684+ }
685+ )
686+ translations = {
687+ "strategy_plugin_line" : "plugin={plugin}|enabled={enabled}|route={route}|action={action}" ,
688+ "strategy_plugin_enabled_true" : "yes" ,
689+ "strategy_plugin_name_market_regime_control" : "Market Regime" ,
690+ "strategy_plugin_route_risk_off" : "risk off" ,
691+ "strategy_plugin_action_defend" : "defend" ,
692+ "strategy_plugin_consumption_loaded_not_applied" : "consumption=loaded-not-applied" ,
693+ }
694+
695+ self .assertTrue (should_alert_strategy_plugin_signal (signal ))
696+ self .assertEqual (
697+ build_strategy_plugin_notification_lines (
698+ [signal ],
699+ translator = lambda key , ** kwargs : translations .get (key , key ).format (** kwargs )
700+ if kwargs
701+ else translations .get (key , key ),
702+ ),
703+ (
704+ "plugin=Market Regime|enabled=yes|route=risk off|action=defend" ,
705+ "consumption=loaded-not-applied" ,
706+ ),
707+ )
708+
660709 def test_strategy_plugin_notification_lines_include_review_only_consumption_line (self ):
661710 signal = validate_strategy_plugin_signal_payload (
662711 {
@@ -820,12 +869,7 @@ def test_strategy_plugin_auto_position_control_signal_stays_with_strategy_notifi
820869 "canonical_route" : "risk_off" ,
821870 "suggested_action" : "defend" ,
822871 "would_trade_if_enabled" : True ,
823- "execution_controls" : {
824- ** _signal_payload ()["execution_controls" ],
825- "strategy_runtime_metadata_allowed" : True ,
826- "position_control_allowed" : True ,
827- "consumption_evidence_status" : "automation_approved" ,
828- },
872+ "execution_controls" : _auditable_position_control_controls (),
829873 }
830874 )
831875
@@ -890,6 +934,13 @@ def test_delegated_manual_review_strategy_signal_stays_with_notification_target(
890934 "strategy_runtime_metadata_allowed" : True ,
891935 "position_control_allowed" : True ,
892936 "consumption_evidence_status" : "automation_approved" ,
937+ "evidence_package_id" : "pkg_001" ,
938+ "evidence_valid_until" : "2026-08-01T00:00:00Z" ,
939+ "bounded_budget" : {
940+ "name" : "position_control" ,
941+ "amount" : 0.4 ,
942+ "unit" : "fraction" ,
943+ },
893944 "manual_review_notification_delegated" : True ,
894945 "manual_review_notification_target" : GENERAL_MARKET_REGIME_NOTIFICATION_TARGET ,
895946 "manual_review_notification_delegate" : (
0 commit comments