@@ -251,7 +251,33 @@ def test_print_strategy_profile_status_json_matches_registry():
251251 text = True ,
252252 )
253253
254- assert json .loads (result .stdout ) == get_platform_profile_status_matrix ()
254+ rows = json .loads (result .stdout )
255+ assert [
256+ {
257+ key : row [key ]
258+ for key in (
259+ "canonical_profile" ,
260+ "display_name" ,
261+ "domain" ,
262+ "eligible" ,
263+ "enabled" ,
264+ "is_default" ,
265+ "is_rollback" ,
266+ "platform" ,
267+ )
268+ }
269+ for row in rows
270+ ] == get_platform_profile_status_matrix ()
271+ by_profile = {row ["canonical_profile" ]: row for row in rows }
272+ assert by_profile ["global_etf_rotation" ]["profile_group" ] == "direct_runtime_inputs"
273+ assert by_profile ["global_etf_rotation" ]["input_mode" ] == "market_history"
274+ assert by_profile ["global_etf_rotation" ]["requires_snapshot_artifacts" ] is False
275+ assert by_profile ["global_etf_rotation" ]["requires_strategy_config_path" ] is False
276+ assert by_profile ["qqq_tech_enhancement" ]["profile_group" ] == "snapshot_backed"
277+ assert by_profile ["qqq_tech_enhancement" ]["input_mode" ] == "feature_snapshot"
278+ assert by_profile ["qqq_tech_enhancement" ]["requires_snapshot_artifacts" ] is True
279+ assert by_profile ["qqq_tech_enhancement" ]["requires_strategy_config_path" ] is True
280+ assert by_profile ["russell_1000_multi_factor_defensive" ]["requires_strategy_config_path" ] is False
255281
256282
257283def test_print_strategy_profile_status_table_contains_expected_headers ():
@@ -264,6 +290,9 @@ def test_print_strategy_profile_status_table_contains_expected_headers():
264290
265291 assert "canonical_profile" in result .stdout
266292 assert "display_name" in result .stdout
293+ assert "profile_group" in result .stdout
294+ assert "input_mode" in result .stdout
295+ assert "requires_snapshot_artifacts" in result .stdout
267296 assert "global_etf_rotation" in result .stdout
268297 assert "QQQ Tech Enhancement" in result .stdout
269298 assert "TQQQ Growth Income" in result .stdout
@@ -282,6 +311,10 @@ def test_print_strategy_switch_env_plan_for_tqqq_growth_income():
282311 assert plan ["canonical_profile" ] == "tqqq_growth_income"
283312 assert plan ["eligible" ] is True
284313 assert plan ["enabled" ] is True
314+ assert plan ["profile_group" ] == "direct_runtime_inputs"
315+ assert plan ["input_mode" ] == "benchmark_history+portfolio_snapshot"
316+ assert plan ["requires_snapshot_artifacts" ] is False
317+ assert plan ["requires_strategy_config_path" ] is False
285318 assert plan ["set_env" ]["STRATEGY_PROFILE" ] == "tqqq_growth_income"
286319 assert "ACCOUNT_GROUP" in plan ["keep_env" ]
287320 assert "IBKR_FEATURE_SNAPSHOT_PATH" in plan ["remove_if_present" ]
@@ -297,6 +330,10 @@ def test_print_strategy_switch_env_plan_for_feature_snapshot_profile():
297330
298331 plan = json .loads (result .stdout )
299332 assert plan ["canonical_profile" ] == "qqq_tech_enhancement"
333+ assert plan ["profile_group" ] == "snapshot_backed"
334+ assert plan ["input_mode" ] == "feature_snapshot"
335+ assert plan ["requires_snapshot_artifacts" ] is True
336+ assert plan ["requires_strategy_config_path" ] is True
300337 assert plan ["set_env" ]["IBKR_FEATURE_SNAPSHOT_PATH" ] == "<required>"
301338 assert plan ["set_env" ]["IBKR_FEATURE_SNAPSHOT_MANIFEST_PATH" ] == "<required>"
302339 assert plan ["set_env" ]["IBKR_STRATEGY_CONFIG_PATH" ].endswith (
0 commit comments