Skip to content

CI: a quarantine list, so a test that breaks dev stops failing unrelated PRs while its fix is made #5942

Closed

Description

@erikdarlingdata

Claude posting for Erik Darling.

When a test breaks on dev, every pull request that runs it fails until a fix PR merges. CI has no way to set a broken test aside. In the week of 2026-10-09 to 2026-10-16, this made 10 unrelated PRs fail. They lost about 20 PR-hours and ran CI 15 extra times.

Source: GitHub Actions data for build.yml, runs created 2026-10-09 00:00Z to 2026-10-16 11:50Z (1,126 runs), and the logs of the 275 failed test jobs. Code read at dev 67835f03d.

What happened (measured)

  • 9 test classes went red on dev in the week, for 62 minutes to 33 hours each.
  • 8 of 86 completed dev push runs ended red.
  • Three of those breaks failed PRs that did not touch the broken test:
Break on dev PRs that failed on it Their failure to their next green run Fix
PlanRegressionBuiltDaysFallbackLiveTests pinned the date 2026-10-07, and that date left the test's window on 10-10 #5657, #5658 0.6 to 1.3 h #5662
ExternalAlertDrainLiveTests and ExternalAlertDrainLifecycleLiveTests did not skip when DARLING_TEST_PG was unset #5705, #5751, #5757, #5760 0.7 to 1.0 h #5756
EffectiveReadWindowCensusTests #5817, #5831, #5832, #5843 2.8 to 4.5 h #5845
  • Each of those PRs merged dev after the fix and ran CI again. Their failed runs used 873 runner-minutes.
  • A small test-fix PR needs a median of 19 minutes for its CI run, and a median of 41 minutes from that run to merge. So a broken test blocks other PRs for about an hour at best.
  • build.yml, .github/scripts/ci-select.py and the shard scripts have no quarantine or known-failing list. The Guard classes and the whole-tree guards job always run, so a broken Guard test fails every PR.

Proposal

  1. Add one file, for example .github/test-quarantine.txt. Each line names one test or one class, with an issue number, the date it was added, and an expiry date at most 7 days later.
  2. ci-select.py reads the file, and every test runner excludes the listed tests on pull requests and dev pushes. That covers the Guard job, the build job's test step, the Darling PostgreSQL shards, the Lite shards and the whole-tree guards.
  3. The nightly still runs the listed tests. It reports their results in its summary, but they do not fail the nightly. So a quarantined test stays visible.
  4. A Guard check fails when an entry is past its expiry date or names a test that does not exist. So the list cannot grow quietly.
  5. A change to only this file must not force a full run. It must not be on the keep-full list.
  6. The process: when a test breaks on dev, the first PR adds its line. The real fix follows in its own PR and removes the line.

Risks

  • A real regression can hide behind an entry. The 7-day expiry and the nightly report limit how long.
  • People can quarantine a test instead of fixing it. The expiry forces either a fix or a renewal with a reason.

Decision needed

  • Can a Guard class be quarantined? This proposal says yes, with the same expiry. A broken Guard test fails every PR, so it is the case where quarantine helps most.

Done when

  • The quarantine file exists, and all five runners named in item 2 honor it.
  • The expiry check exists.
  • The nightly summary lists the quarantined tests and their results.

Activity

  1. erikdarlingdata commented on Oct 16, 2026

    @erikdarlingdata
    OwnerAuthor

    Claude posting for Erik Darling. Adversarial review before any lane, at Erik's ask (an Opus reviewer re-derived the numbers from the run history and the repo).

    Verdict: floats with changes. Held for tomorrow.

    • The saving is about 15 PR-hours a week, but 12 of them came from one census break caused by three admin merges within 27 minutes (dev protection has strict: false, so each PR was green alone and red together). In a sample of 18 real PR failures, 1 was a dev break. The median time to green does not move.
    • As written, nothing stops a PR quarantining a test it broke itself.

    Changes before it is built: an entry counts only if the latest dev push run failed that exact test; expiry 72 hours, not 7 days; a PR cannot add an entry for a test whose files it changes; start with the Guard job and the two shard runners only; add the rule "our wrong test is a bug, not a flake" to .github/REVIEW-TRAPS.md (it lives only in agent memory today). Do not test PRs against the merge-base: that hides merge-race breaks until after the merge.

  2. erikdarlingdata commented on Oct 16, 2026

    @erikdarlingdata
    OwnerAuthor

    Claude posting for Erik Darling.

    Fixed by #5964 (7404409) on dev.

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

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions