Skip to content

Commit 583d225

Browse files
Pigbibicodex
andcommitted
fix(export): reject incompatible legacy opt-out
Co-Authored-By: Codex <noreply@openai.com>
1 parent c5c2de9 commit 583d225

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

src/pipeline.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,12 @@ def build_live_pool_outputs(
344344
universe_mode: Optional[str] = None,
345345
) -> dict[str, Any]:
346346
"""Train on the latest eligible history and export live universe/ranking files."""
347+
if config["export"].get("save_legacy_live_pool", True) is False:
348+
raise ValueError(
349+
"export.save_legacy_live_pool=false is incompatible with the required "
350+
"four-artifact release contract."
351+
)
352+
347353
logger = get_logger("build_live_pool_outputs")
348354
resolved_mode, _ = resolve_universe_mode(config, universe_mode=universe_mode, purpose="live")
349355
logger.info("Building live pool with universe mode '%s'.", resolved_mode)

tests/test_build_live_pool_smoke.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
export_strategy_artifact_manifest,
2020
resolve_clean_source_revision,
2121
)
22-
from src.pipeline import resolve_scoring_input_timestamp
22+
from src.pipeline import build_live_pool_outputs, resolve_scoring_input_timestamp
2323

2424

2525
PROJECT_ROOT = Path(__file__).resolve().parents[1]
@@ -118,6 +118,27 @@ def fake_build_live_pool_outputs(config, as_of_date=None, universe_mode=None):
118118
self.assertEqual(validation["version"], "2026-03-13-core_major")
119119
self.assertEqual(validation["pool_size"], 5)
120120

121+
def test_build_live_pool_rejects_disabled_legacy_before_any_output_write(self) -> None:
122+
with tempfile.TemporaryDirectory() as tmp_dir:
123+
output_dir = Path(tmp_dir) / "fresh-output"
124+
config = {
125+
"paths": {"output_dir": output_dir},
126+
"export": {"save_legacy_live_pool": False},
127+
"universe": {"live_mode": "core_major", "modes": {"core_major": {}}},
128+
}
129+
130+
with (
131+
patch("src.pipeline.prepare_research_panel") as prepare_research_panel,
132+
self.assertRaisesRegex(
133+
ValueError,
134+
r"export\.save_legacy_live_pool=false is incompatible with the required four-artifact release contract",
135+
),
136+
):
137+
build_live_pool_outputs(config)
138+
139+
prepare_research_panel.assert_not_called()
140+
self.assertFalse(output_dir.exists())
141+
121142
def test_manifest_identity_uses_git_head_and_panel_cutoff_not_environment_or_now(self) -> None:
122143
with tempfile.TemporaryDirectory() as tmp_dir:
123144
output_dir = Path(tmp_dir)

0 commit comments

Comments
 (0)