Cutting runner cost without cutting test coverage
Where minutes actually go: matrix sprawl, serial jobs that could fan out, and suites that never needed the heaviest runner class.
Runner bills often climb after a year of well-intentioned matrix growth. Every OS and Node version combination felt reasonable alone; together they dominate the invoice.
We map minutes per job family, then ask which combinations protect a real supported matrix versus which exist from habit. Shrink the merge matrix; keep the full matrix on a nightly or weekly lane.
Serial jobs that wait on unrelated work deserve fan-out. Independent lint, unit, and contract stages can run in parallel once artifact hand-offs are explicit.
Heavy runners should be reserved for integration suites that need them. Unit suites on overspecced machines are a quiet tax. Match class to job, not to the loudest request in chat.