@@ -165,6 +165,35 @@ public function testEveryFixtureCategoryAuthorityDocIsACustomerResolvableUrl():
165165 }
166166 }
167167
168+ public function testMigrationRuntimeContractIsDeferredUntilPublicScenarioManifestPublishes (): void
169+ {
170+ $ manifest = PlatformConformanceSuite::manifest ();
171+
172+ $ this ->assertSame (
173+ 12 ,
174+ $ manifest ['version ' ],
175+ 'the workflow mirror must stay aligned with the currently published platform conformance contract ' ,
176+ );
177+ $ this ->assertArrayNotHasKey (
178+ 'migration_runtime_contract ' ,
179+ $ manifest ['fixture_catalog ' ],
180+ 'migration conformance becomes a fixture category only after its public scenario manifest exists ' ,
181+ );
182+ $ this ->assertNotContains (
183+ 'migration_runtime_contract ' ,
184+ $ manifest ['pass_fail_rules ' ]['stable_runtime_scenario_coverage ' ]['applies_to_categories ' ],
185+ 'missing migration scenarios must not be part of stable runtime coverage while the source manifest is unpublished ' ,
186+ );
187+
188+ foreach ($ manifest ['targets ' ] as $ name => $ target ) {
189+ $ this ->assertNotContains (
190+ 'migration_runtime_contract ' ,
191+ $ target ['required_fixture_categories ' ],
192+ "$ name must not require migration conformance before the public scenario manifest is published " ,
193+ );
194+ }
195+ }
196+
168197 public function testMcpDiscoveryCategoryNamesCurrentReferenceSurface (): void
169198 {
170199 $ manifest = PlatformConformanceSuite::manifest ();
0 commit comments