The split failure is the nasty part, because a CI job that only checks screenshots will keep passing while every tap silently does nothing. A cheap guard is a smoke step at the start of the run that taps a known element and asserts the screen changed, so a moved framework path fails loudly in the first minute. Pinning the Xcode version per runner image until the tools catch up also helps.