ci: skip device smoke lanes when a PR changes no lane input

Merged
TH
2d ago
+357-88

Summary

A PR that only changes unit tests (*.test.ts / __tests__/ under src/ or packages/*/src/) no longer runs the device smoke lanes. iOS smoke already worked this way. Android, Linux, the macOS phase of Apple, and the web smoke steps in CI now use the same affected-check rule: a lane runs only when selectChecks picks one of its checks. Pushes to main, empty or unknown diffs, and fail-open plans (scripts/, .github/, package.json, …) still run every lane.

  • scripts/device-lane-impact.ts <check-id>... holds the shared rule. apple-ci-impact.ts now uses it for iOS smoke, XCTest, and the new macOS selection.
  • The macOS phase also runs when the darwin-only bridge-proof inputs change.
  • Apple skips the build when neither phase is selected. The final status guard expects skipped for every unselected phase.
  • Scope: the lanes also route by platform family, as iOS already did. For example, an Android-only change skips Linux, web, and macOS.
  • 9 files changed.

Example: #3898, which only changed a test file, now skips Android and Linux.

Validation

At d0c85f95b7c6be5ce7f63713e95e6045e9e85949:

  • pnpm typecheck, pnpm check:fallow, check:gate-manifest, and the agent-guidance, docs-prose, production-exports, affected-selector, and depgraph gates pass.
  • vitest run scripts/__tests__/{device-lane,apple-ci}-impact.test.ts: 59 passed.
  • check:affected --run --head failed open to the full set. vitest-related ran 17,008 tests with 11 timeouts under host load around 950. All 8 failing files pass when rerun alone (65 tests). The gates after it did not run locally, so CI is authoritative for them.
  • Risk: family routing for Android, Linux, and web has not had the 90-day replay that iOS got. Pushes to main still run every lane as the backstop.

🤖 Generated with Claude Code