@@ -590,11 +590,12 @@ def test_attach_strategy_plugin_metadata_ignores_shadow_artifact_without_runtime
590590 def test_strategy_plugin_notification_lines_use_translator_when_available (self ):
591591 signal = validate_strategy_plugin_signal_payload (_signal_payload ())
592592 translations = {
593- "strategy_plugin_line" : "plugin={plugin}|mode={mode }|route={route}|action={action}" ,
593+ "strategy_plugin_line" : "plugin={plugin}|enabled={enabled }|route={route}|action={action}" ,
594594 "strategy_plugin_error_line" : "plugin-error={reason}|fallback=built-in" ,
595595 "strategy_plugin_error_reason_ValueError" : "config validation failed" ,
596+ "strategy_plugin_consumption_unavailable" : "consumption=none" ,
597+ "strategy_plugin_enabled_true" : "yes" ,
596598 "strategy_plugin_name_crisis_response_shadow" : "Crisis" ,
597- "strategy_plugin_mode_shadow" : "shadow" ,
598599 "strategy_plugin_route_no_action" : "no action" ,
599600 "strategy_plugin_action_watch_only" : "watch only" ,
600601 }
@@ -606,15 +607,134 @@ def test_strategy_plugin_notification_lines_use_translator_when_available(self):
606607 else translations .get (key , key ),
607608 )
608609
609- self .assertEqual (lines , ("plugin=Crisis|mode=shadow |route=no action|action=watch only" ,))
610+ self .assertEqual (lines , ("plugin=Crisis|enabled=yes |route=no action|action=watch only" ,))
610611 self .assertEqual (
611612 build_strategy_plugin_error_notification_lines (
612613 "ValueError: bad config\n trace line" ,
613614 translator = lambda key , ** kwargs : translations .get (key , key ).format (** kwargs )
614615 if kwargs
615616 else translations .get (key , key ),
616617 ),
617- ("plugin-error=config validation failed|fallback=built-in" ,),
618+ ("plugin-error=config validation failed|fallback=built-in" , "consumption=none" ),
619+ )
620+
621+ def test_strategy_plugin_notification_lines_include_auto_consumption_line (self ):
622+ signal = validate_strategy_plugin_signal_payload (
623+ {
624+ ** _signal_payload (plugin = PLUGIN_MARKET_REGIME_CONTROL ),
625+ "canonical_route" : "risk_off" ,
626+ "suggested_action" : "defend" ,
627+ "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+ },
634+ }
635+ )
636+ translations = {
637+ "strategy_plugin_line" : "plugin={plugin}|enabled={enabled}|route={route}|action={action}" ,
638+ "strategy_plugin_enabled_true" : "yes" ,
639+ "strategy_plugin_name_market_regime_control" : "Market Regime" ,
640+ "strategy_plugin_route_risk_off" : "risk off" ,
641+ "strategy_plugin_action_defend" : "defend" ,
642+ "strategy_plugin_consumption_auto_defend" : "consumption=auto-defend" ,
643+ }
644+
645+ lines = build_strategy_plugin_notification_lines (
646+ [signal ],
647+ translator = lambda key , ** kwargs : translations .get (key , key ).format (** kwargs )
648+ if kwargs
649+ else translations .get (key , key ),
650+ )
651+
652+ self .assertEqual (
653+ lines ,
654+ (
655+ "plugin=Market Regime|enabled=yes|route=risk off|action=defend" ,
656+ "consumption=auto-defend" ,
657+ ),
658+ )
659+
660+ def test_strategy_plugin_notification_lines_include_review_only_consumption_line (self ):
661+ signal = validate_strategy_plugin_signal_payload (
662+ {
663+ ** _signal_payload (plugin = PLUGIN_MARKET_REGIME_CONTROL ),
664+ "canonical_route" : "opportunity_watch" ,
665+ "suggested_action" : "notify_manual_review" ,
666+ "would_trade_if_enabled" : False ,
667+ "execution_controls" : {
668+ ** _signal_payload ()["execution_controls" ],
669+ "strategy_runtime_metadata_allowed" : False ,
670+ "position_control_allowed" : False ,
671+ "consumption_evidence_status" : "notification_only" ,
672+ "capital_impact" : "notification_only" ,
673+ },
674+ }
675+ )
676+ translations = {
677+ "strategy_plugin_line" : "plugin={plugin}|enabled={enabled}|route={route}|action={action}" ,
678+ "strategy_plugin_enabled_true" : "yes" ,
679+ "strategy_plugin_name_market_regime_control" : "Market Regime" ,
680+ "strategy_plugin_route_opportunity_watch" : "opportunity watch" ,
681+ "strategy_plugin_action_notify_manual_review" : "manual review" ,
682+ "strategy_plugin_consumption_review_only" : "consumption=review-only" ,
683+ }
684+
685+ lines = build_strategy_plugin_notification_lines (
686+ [signal ],
687+ translator = lambda key , ** kwargs : translations .get (key , key ).format (** kwargs )
688+ if kwargs
689+ else translations .get (key , key ),
690+ )
691+
692+ self .assertEqual (
693+ lines ,
694+ (
695+ "plugin=Market Regime|enabled=yes|route=opportunity watch|action=manual review" ,
696+ "consumption=review-only" ,
697+ ),
698+ )
699+
700+ def test_strategy_plugin_notification_lines_include_loaded_not_applied_consumption_line (self ):
701+ signal = validate_strategy_plugin_signal_payload (
702+ {
703+ ** _signal_payload (plugin = PLUGIN_MARKET_REGIME_CONTROL ),
704+ "canonical_route" : "risk_reduced" ,
705+ "suggested_action" : "delever" ,
706+ "would_trade_if_enabled" : True ,
707+ "execution_controls" : {
708+ ** _signal_payload ()["execution_controls" ],
709+ "strategy_runtime_metadata_allowed" : False ,
710+ "position_control_allowed" : False ,
711+ "consumption_evidence_status" : "automation_approved" ,
712+ },
713+ }
714+ )
715+ translations = {
716+ "strategy_plugin_line" : "plugin={plugin}|enabled={enabled}|route={route}|action={action}" ,
717+ "strategy_plugin_enabled_true" : "yes" ,
718+ "strategy_plugin_name_market_regime_control" : "Market Regime" ,
719+ "strategy_plugin_route_risk_reduced" : "risk reduced" ,
720+ "strategy_plugin_action_delever" : "de-lever" ,
721+ "strategy_plugin_consumption_review_only" : "consumption=review-only" ,
722+ "strategy_plugin_consumption_loaded_not_applied" : "consumption=loaded-not-applied" ,
723+ }
724+
725+ lines = build_strategy_plugin_notification_lines (
726+ [signal ],
727+ translator = lambda key , ** kwargs : translations .get (key , key ).format (** kwargs )
728+ if kwargs
729+ else translations .get (key , key ),
730+ )
731+
732+ self .assertEqual (
733+ lines ,
734+ (
735+ "plugin=Market Regime|enabled=yes|route=risk reduced|action=de-lever" ,
736+ "consumption=loaded-not-applied" ,
737+ ),
618738 )
619739
620740 def test_strategy_plugin_notification_lines_can_use_artifact_localized_message (self ):
0 commit comments