A strategy.matrix job has fail-fast: true by default. When any matrix leg fails, GitHub cancels all in-progress and pending legs immediately. The cancelled legs report as cancelled, not failed, and produce no test output.
This is the right default for expensive matrices where the first failure is representative, and the wrong one for compatibility matrices where the whole point is to learn which combinations break. A test suite run across five runtime versions reports one failure and four cancellations, so a second run is needed to see the full picture.
Set fail-fast: false on matrices whose legs are independent. Use max-parallel to bound concurrency instead of relying on early cancellation for cost control. Separately, continue-on-error: true at the job level makes a failing job not fail the workflow, and combined with strategy.matrix it allows marking specific legs as experimental through matrix.include entries carrying an experimental flag referenced by the expression.