Skip to content

CI structure amplifies flakes: fail-fast matrix + test-complete mirror check #3066

Description

@schani

What happens

Two aspects of the fixture-test workflow (.github/workflows/test-pr.yaml) inflate the blast radius of every flaky job and hide the results of unrelated languages.

  1. fail-fast: true on the fixture matrix. The test job's matrix (strategy.fail-fast: true, line 34) runs every language fixture as a matrix leg. When any one leg fails — including a pure infra flake — GitHub cancels all sibling legs. A single flaky job therefore turns into a wall of "cancelled" jobs, and we lose the signal of whether the other languages would have passed.

  2. test-complete only mirrors the matrix. The test-complete job (line 211) runs if: cancelled() || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'failure') and simply prints "Some workflows have failed!" and exit 1. It never fails independently — it only reflects whatever the matrix did. During triage its failure carries no information beyond "some matrix leg failed or was cancelled."

Evidence

  • .github/workflows/test-pr.yaml line 34: fail-fast: true on the test matrix.
  • .github/workflows/test-pr.yaml lines 211-218: test-complete gate that mirrors the matrix result.
  • Today's triage of 31 failing PRs: several PRs showed many "cancelled" sibling jobs stemming from a single flaky leg, and test-complete "Some workflows have failed!" was never an independent failure — it only mirrored whichever matrix job failed.

Impact

  • One flaky job (Scala Bloop timeout, Elm warmup deadlock, cjson download reset) cancels the entire language matrix.
  • Triage is harder: the real failing leg is buried among cancellations, and passing languages never report.
  • The test-complete red X is noise on its own; you must open the matrix to learn anything.

Suggested solutions

  • Set fail-fast: false on the fixture matrix so each language leg runs to completion independently and one flake stops masking the rest.
  • During triage, treat test-complete as a mirror only — inspect the individual matrix legs, not the aggregate gate.

Related flaky areas

These are the specific flakes this structure amplifies:

Interim policy

Per CLAUDE.md ("Known CI flakiness"), we accept these flakes for now and retry the failed jobs (gh run rerun <run-id> --failed) when they occur.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions