diff --git a/ci/slices.yml b/ci/slices.yml index 7d1cceaf63..9022a6affc 100644 --- a/ci/slices.yml +++ b/ci/slices.yml @@ -178,10 +178,10 @@ "ui": ["core"], "native-abi": ["core"], "protocol": ["two-node-client"], - "split-serving": ["two-node-split"], + "split-serving": ["two-node-split", "product-integration-cpu"], "model-download": ["model-download"], - "platform-macos": ["metal-model-load"], - "platform-windows": ["core"], + "platform-macos": ["metal-model-load", "product-integration-metal"], + "platform-windows": ["product-integration-windows-cpu"], "backend-cuda": ["core-cuda"], "backend-rocm": ["core"], "backend-vulkan": ["core"] @@ -224,7 +224,10 @@ {"id": "two-node-client", "kind": "two-node-client", "runner_role": "linux-build-4"}, {"id": "two-node-split", "kind": "two-node-split", "runner_role": "linux-build-8"}, {"id": "model-download", "kind": "model-download", "runner_role": "linux-build-4"}, - {"id": "metal-model-load", "kind": "metal-model-load", "runner_role": "macos-build"} + {"id": "metal-model-load", "kind": "metal-model-load", "platform": "macos", "backend": "metal", "runner_role": "macos-build"}, + {"id": "product-integration-cpu", "kind": "product-integration", "platform": "linux", "backend": "cpu", "runner_role": "linux-build-4"}, + {"id": "product-integration-metal", "kind": "product-integration", "platform": "macos", "backend": "metal", "runner_role": "macos-build"}, + {"id": "product-integration-windows-cpu", "kind": "product-integration", "platform": "windows", "backend": "cpu", "runner_role": "windows-build"} ], "batch_limits": {"clippy": 3, "rust_tests": 4}, "slices": [ diff --git a/scripts/tests/test_ci_workflow_artifacts.py b/scripts/tests/test_ci_workflow_artifacts.py index 1e793a68fc..42c928e2cf 100644 --- a/scripts/tests/test_ci_workflow_artifacts.py +++ b/scripts/tests/test_ci_workflow_artifacts.py @@ -247,26 +247,24 @@ def test_product_integration_uploads_reconciled_phase_evidence_on_every_outcome( self.assertIn("-evidence", workflow) self.assertIn("if-no-files-found: error", workflow) - def test_protected_catalog_defers_product_integration_rollout(self): + def test_protected_catalog_selects_cpu_metal_and_windows_product_integration(self): slices = json.loads(SLICES.read_text()) smoke_ids = {row["id"] for row in slices["smoke_rows"]} linux = (WORKFLOWS / "ci-linux-product-smoke-slice.yml").read_text() - windows = (WORKFLOWS / "ci-windows-product-smoke-slice.yml").read_text() product_workflow = (WORKFLOWS / "product-integration-smoke.yml").read_text() - self.assertNotIn("product-integration-cpu", smoke_ids) - self.assertNotIn("product-integration-metal", smoke_ids) - self.assertNotIn("product-integration-windows-cpu", smoke_ids) + self.assertIn("product-integration-cpu", smoke_ids) + self.assertIn("product-integration-metal", smoke_ids) self.assertNotIn("qwen-recurrent-gate", smoke_ids) self.assertIn("core", smoke_ids) self.assertIn("two-node-client", smoke_ids) self.assertIn("two-node-split", smoke_ids) + self.assertIn("product-integration-windows-cpu", smoke_ids) self.assertIn( "binary_name: ${{ inputs.platform == 'windows' && 'mesh-llm.exe' || 'mesh-llm' }}", product_workflow, ) - self.assertIn("product-integration-windows-cpu", windows) - for smoke_id in ("core", "two-node-client", "two-node-split"): + for smoke_id in ("core", "two-node-client", "two-node-split", "product-integration-cpu"): self.assertIn( f"contains(fromJson(inputs.smoke_matrix).*.id, '{smoke_id}')", linux, diff --git a/scripts/tests/test_plan_ci.py b/scripts/tests/test_plan_ci.py index 57124f0d68..e6e8d1371b 100644 --- a/scripts/tests/test_plan_ci.py +++ b/scripts/tests/test_plan_ci.py @@ -369,6 +369,9 @@ def test_main_covers_every_workspace_crate_once(self) -> None: "two-node-split", "model-download", "metal-model-load", + "product-integration-cpu", + "product-integration-metal", + "product-integration-windows-cpu", }, ) self.assertIn(