diff --git a/README.md b/README.md index 64b4ce6..118cf23 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ Canonical profile names were simplified in this branch. The old names are not ke These profiles use platform-provided `market_history` and do not require a separate snapshot artifact before the strategy entrypoint can produce target weights. +The combo wrapper `hk_equity_combo` is retained for research/orchestration only and should not be treated as a runtime-enabled profile. + | Profile | Name | Input | Benchmark | Current role | | --- | --- | --- | --- | --- | | `hk_global_etf_tactical_rotation` | HK Global ETF Tactical Rotation | `market_history` | `02800` | Retained HK ETF runtime profile with broader ETF exposure and heavier product checks. | diff --git a/src/hk_equity_strategies/catalog.py b/src/hk_equity_strategies/catalog.py index 1122ecc..f370bbe 100644 --- a/src/hk_equity_strategies/catalog.py +++ b/src/hk_equity_strategies/catalog.py @@ -32,7 +32,7 @@ ) HK_SNAPSHOT_BACKED_PROFILES = frozenset({HK_LOW_VOL_DIVIDEND_QUALITY_SNAPSHOT_PROFILE}) HK_EXTERNAL_SNAPSHOT_SCAFFOLD_PROFILES = frozenset() -HK_RESEARCH_BACKTEST_ONLY_PROFILES = frozenset() +HK_RESEARCH_BACKTEST_ONLY_PROFILES = frozenset({HK_EQUITY_COMBO_PROFILE}) STRATEGY_PLATFORM_COMPATIBILITY: dict[str, frozenset[str]] = { HK_GLOBAL_ETF_TACTICAL_ROTATION_PROFILE: frozenset({"ibkr", "longbridge"}), @@ -190,7 +190,7 @@ def _build_strategy_definition( asset_scope="hk_equity_combo", benchmark="2800", role="hk_equity_combo", - status="runtime_enabled", + status="research_backtest_only", ), } diff --git a/src/hk_equity_strategies/live_enablement_matrix.py b/src/hk_equity_strategies/live_enablement_matrix.py index dd9937d..89a66f3 100644 --- a/src/hk_equity_strategies/live_enablement_matrix.py +++ b/src/hk_equity_strategies/live_enablement_matrix.py @@ -374,7 +374,23 @@ def _common_platform_evidence_requirements(profile: str) -> tuple[str, ...]: ), } -RESEARCH_ONLY_PROFILES: dict[str, dict[str, object]] = {} +RESEARCH_ONLY_PROFILES: dict[str, dict[str, object]] = { + "hk_equity_combo": { + "display_name": "HK Equity Combo", + "profile_type": "research_backtest_only", + "reason": "Retained combo wrapper for research comparison only; not part of the HK runtime allowlist.", + "required_next_evidence": ( + "long_history_backtest_replay", + "platform_dry_run_order_preview", + "live_enablement_review_pack", + ), + "research_evidence_urls": ( + "docs/research/hk_equity_combo_backtest_20260628.json", + "docs/research/hk_strategy_selection_20260603.md", + "docs/research/hk_quant_strategy_ideas.md", + ), + }, +} diff --git a/tests/test_catalog.py b/tests/test_catalog.py index 0b1d535..c64a42e 100644 --- a/tests/test_catalog.py +++ b/tests/test_catalog.py @@ -66,10 +66,9 @@ def test_profile_groups_keep_runtime_research_and_snapshot_scaffolds_separate(): ) assert get_snapshot_backed_profiles() == frozenset({HK_LOW_VOL_DIVIDEND_QUALITY_SNAPSHOT_PROFILE}) assert get_external_snapshot_scaffold_profiles() == frozenset() - assert get_research_backtest_only_profiles() == frozenset() + assert get_research_backtest_only_profiles() == frozenset({HK_EQUITY_COMBO_PROFILE}) assert get_runtime_enabled_profiles() == frozenset( { - HK_EQUITY_COMBO_PROFILE, HK_GLOBAL_ETF_TACTICAL_ROTATION_PROFILE, HK_LOW_VOL_DIVIDEND_QUALITY_SNAPSHOT_PROFILE, } diff --git a/tests/test_live_enablement_matrix.py b/tests/test_live_enablement_matrix.py index 837bfa9..4ed24d6 100644 --- a/tests/test_live_enablement_matrix.py +++ b/tests/test_live_enablement_matrix.py @@ -41,11 +41,11 @@ def test_live_enablement_matrix_keeps_only_runtime_profiles_selectable_or_listed matrix = build_live_enablement_matrix() assert set(matrix["selectable_profiles"]) == get_runtime_enabled_profiles() - assert matrix["selectable_profile_count"] == 3 + assert matrix["selectable_profile_count"] == 2 assert matrix["profile_count"] == 3 - assert matrix["blocked_profile_count"] == 0 + assert matrix["blocked_profile_count"] == 1 assert get_external_snapshot_scaffold_profiles() == frozenset() - assert get_research_backtest_only_profiles() == frozenset() + assert get_research_backtest_only_profiles() == frozenset({HK_EQUITY_COMBO_PROFILE}) assert matrix["first_snapshot_candidates"] == [HK_LOW_VOL_DIVIDEND_QUALITY_SNAPSHOT_PROFILE] assert matrix["snapshot_required_repository_policies"] == ["quality_yield_live_enablement_policy"] assert matrix["backtest_validation_policy"]["policy_version"] == "hk_backtest_validation_policy.v1" @@ -142,5 +142,5 @@ def test_print_hk_live_enablement_matrix_json(): payload = json.loads(completed.stdout) assert payload["profile_count"] == 3 - assert payload["blocked_profile_count"] == 0 + assert payload["blocked_profile_count"] == 1 assert set(payload["selectable_profiles"]) == get_runtime_enabled_profiles()