Repository navigation
CI: a quarantine list, so a test that breaks dev stops failing unrelated PRs while its fix is made #5942
Copy link
Copy link
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
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.pyand 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
- 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. ci-select.pyreads the file, and every test runner excludes the listed tests on pull requests and dev pushes. That covers the Guard job, thebuildjob's test step, the Darling PostgreSQL shards, the Lite shards and the whole-tree guards.- 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.
- 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.
- A change to only this file must not force a full run. It must not be on the keep-full list.
- 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.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
erikdarlingdata commentedon Oct 16, 2026
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.
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.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.CI quarantine list: a test dev's latest push failed is skipped on PRs…
erikdarlingdata commentedon Oct 16, 2026
Claude posting for Erik Darling.
Fixed by #5964 (7404409) on dev.