Artifex/tests/test_export_cohort_failure_context_v1.py
2026-08-18 20:45:09 +07:00

41 lines
1.8 KiB
Python

from control_plane.trading_studio.management.commands.export_cohort_failure_context_v1 import Command
def test_failure_labels_are_explicit_and_precedence_is_deterministic():
cases = [
({"net_pnl": -1}, {"return_1_bars_bps": 5}, "GOOD_SIGNAL_BAD_MONETIZATION"),
({"net_pnl": 1}, {"winner_negative_first": True}, "RECOVERY_DEPENDENT"),
({}, {"mae_bps": -25}, "HIGH_MAE_ENTRY"),
({}, {"return_1_bars_bps": -5}, "WRONG_DIRECTION"),
({}, {"return_1_bars_bps": 0, "return_5_bars_bps": 5}, "LATE_SIGNAL"),
({"net_pnl": 1}, {"return_1_bars_bps": 5}, "GOOD_ENTRY"),
({}, {}, "NO_EDGE"),
]
for ledger, deq, expected in cases:
assert Command._label(ledger, deq)[0] == expected
def test_rows_preserve_raw_ledger_deq_genome_context_and_rescue():
payload = {
"cohort_id": "cohort", "dataset_version_id": "dataset", "dataset_sha256": "hash",
"strategies": [{
"ordinal": 1, "membership_id": "member", "strategy_version_id": "strategy",
"runner_name": "runner", "genome": {"combo": "g"}, "feature_triples": [],
"folds": [{"fold": "F1", "scenarios": [{
"qualification_run_id": "run", "scenario": "BASE",
"summary": {"rescue": {"recovered": True}},
"deq_samples": [{"identity": "trade", "entry_bar": 2, "entry_execution_price": 10,
"take_profit_price": 11, "context": {"regime": "x"},
"deq": {"return_1_bars_bps": 5}}],
}]}],
}],
}
row = Command._rows(payload)[0]
assert row["direction"] == "LONG"
assert '"return_1_bars_bps":5' in row["raw_deq_json"]
assert '"combo":"g"' in row["genome_json"]
assert '"regime":"x"' in row["context_json"]
assert '"recovered":true' in row["rescue_json"]