Flaky test triage board for Buildkite, with Linear quarantine

Rank your most unreliable tests by failure rate, drill into the real failure messages, and file quarantine tickets without ever opening a duplicate.

App
BuildkiteLinearEngineeringOperationsResearch & Monitoring
PromptCreate

Build me a flaky test triage board on top of my Buildkite Test Engine data. Our QA lead and each team's code owners open it every week to work through the worst offenders. Buildkite is the data source and Linear is where quarantine tickets get filed. Nothing runs on a schedule; a person opens this and works out of it.

Main view. Start with a suite picker: use List Test Suites to show the organization's Test Engine suites, and Get a Test Suite for details on the one that is selected. Remember the suite choice so returning users land back where they were. Note for the build: Test Engine endpoints live under a separate /analytics path prefix (/analytics/organizations/{org.slug}/suites/...) and the Buildkite token needs the read_suites scope.

The ranked board. For the selected suite, pull the most recent test runs with List Test Runs (default the last 25, configurable) and for each of those runs pull Get a Test Run's Failed Executions. Aggregate the failed executions by test to compute three numbers per test: failure rate, meaning runs where the test failed divided by runs the test appeared in; how many of those recent runs the test actually touched; and when it last failed. Use List Tests for the suite roster so the app knows the full set of tests and can show or filter ones that never failed. Sort by failure rate descending so the worst offenders float to the top rather than being buried. Apply a minimum appearances threshold, default 3 runs, so a test that failed once in a single run does not outrank a chronic flake; show tests below the threshold in a separate low confidence section rather than dropping them. Columns: test name, scope or file, failure rate, runs touched, last failed as relative time, triage state, and the linked ticket if one exists.

Drill-down panel. Clicking a test opens a side panel so a human can judge whether it is a real bug or a genuine flake. Use Get a Test for the test's own record, and Find a Test to resolve a test's UUID by scope and name when a failed execution only gives you the name. In the panel show the recent failed executions for that test with their failure messages and expanded output, which run each failure came from, the branch if available, and timestamps. Group identical failure messages together with a count, because five failures with the same message read very differently from five with different ones.

Quarantine tickets, with deduplication first. The panel has a File quarantine ticket action. Before offering to create anything, run Search Issues in Linear using the test name plus a consistent marker such as the test scope. If a matching issue comes back, show it inline with its current status via Get Issue and link straight to it, instead of showing the create button, so nobody opens a duplicate. If nothing matches, use Create Issue in the configured Linear team with a title like "Quarantine flaky test: <test name>" and a description carrying the test name, its scope, the failure rate over the last N runs, how many runs it touched, when it last failed, two or three representative failure messages, and a link back to the Buildkite suite and test. Then optionally use Add Link to Issue to attach the suite link as an attachment on the issue. Once created, show the issue identifier and URL on that test's row so the board reflects it immediately.

Triage state that makes the board a working queue. Let any user mark a test as triaged or ignored, and persist that per organization rather than per user, so everyone works from the same queue. Store who set the state and when, and show that on the row. By default the board hides triaged and ignored tests so the queue empties as the week goes on, with toggles to bring them back into view. Put counters in the header: open flakes, triaged this week, and ignored. If a test that was marked triaged starts failing again in newer runs, surface it back into the open queue with a small "regressed" marker rather than leaving it hidden.

Details that matter: nothing in this app writes to Buildkite, it is read only there, and Linear is the only system it creates records in. Add a refresh control with a visible last-updated time, since aggregating runs takes a moment. Cap how many runs get fetched at once and show progress while aggregating so a large suite does not feel frozen. Handle the empty states properly: a suite with no recent runs, a suite where nothing has failed, and an organization with no Test Engine suites at all.

What does this prompt do?

  • Lists your test suites, then ranks every test inside the one you pick by how often it fails across recent runs, so the worst offenders float to the top instead of staying buried in build logs.
  • Shows each test's failure rate, how many recent runs it actually ran in, and when it last failed, so you can tell a chronic flake from a one-off blip.
  • Opens a panel on any test with its recent failures and error messages, so a person can judge whether it is a real bug or a genuine flake before acting.
  • Files a quarantine ticket in Linear with the test name, failure rate, and a link back to the suite, checking first for an existing ticket so the same test never gets two.
  • Lets anyone mark a test as triaged or ignored, saved for your whole organization, so the board works as a queue that empties instead of a report people stop reading.

What do I need to use this?

  • A Buildkite account with Test Engine enabled and at least one suite collecting test results
  • Access to the Buildkite organization whose suites you want to triage, with permission to read test suite data
  • A Linear workspace, and the team you want quarantine tickets filed into
  • A couple of weeks of recent test runs already recorded, so failure rates are meaningful from day one

How can I customize it?

  • Change how many recent runs count toward the failure rate, for example the last 20 runs instead of the last 50.
  • Set the minimum number of runs a test must appear in before it can top the board, so one bad run does not outrank a genuine repeat offender.
  • Point tickets at a different Linear team, adjust the ticket title and description format, or use Jira instead if that is where your team tracks work.

FAQs

Do I need Buildkite Test Engine, or is build history enough?
You need Test Engine. The board is built on per-test results, which is what Test Engine records. Plain build history only tells you a build passed or failed, not which individual test was responsible or how often it misbehaves.
How does it decide whether a test is flaky or actually broken?
It does not decide for you, and that is deliberate. It ranks tests by how often they fail across recent runs and puts the failure messages one click away, so a human makes the call. A test that fails every single run is usually a real bug; one that fails intermittently on the same code is usually a flake.
Will two people triaging at the same time create duplicate tickets?
No. Before offering to create anything, the app searches your Linear workspace for an existing ticket about that test. If one is found it shows that ticket and its current status instead of the create button, so the second person sees the work is already filed.
Can we use Jira instead of Linear?
Yes. The ticket step is straightforward to point at Jira instead if that is your tracker. Everything else about the board stays the same.
If I mark a test as triaged, does that hide it for everyone?
Yes. Triage state is saved for the whole organization, not per person, so the QA lead and each team's code owners are working from the same queue. The app records who marked it and when, and you can always switch the filter back on to review what has been triaged or ignored.

Related templates

Voice agent QA review board for your Hume EVI calls

Open one board each morning, see which voice calls went badly, replay the exact moment the caller got frustrated, and file the fix.

Hume
Linear
Slack Bot
App
Close the loop between Front tickets and Linear bug fixes

See every customer waiting on a bug fix, file the ticket without creating a duplicate, and tell them the moment engineering ships it.

Front
Linear
App
Open a Heroku release war room the moment production looks wrong

See every recent deploy across all your Heroku apps in one timeline, then roll back, restart, or file an incident without leaving the screen.

Heroku
GitHub
Linear
App
Find the themes Help Scout tags miss and file them in Linear

Pick a date range, see which support topics are climbing fastest, read the real customer threads behind them, and file the worst ones as tickets.

Help Scout
Linear
App
A Hacker News mention inbox your team actually works through

See every Hacker News story and comment that mentions your product or your competitors, mark each one new, needs reply or handled, and stop losing threads.

Hacker News
Slack Bot
Linear
+1
App
Morning data freshness board for your BigQuery tables

One grid of every table you track, when it last landed, and what broke, with stale tables pinned to the top and an agent that explains why.

Google BigQuery
Linear
Slack Bot
App

Stop rediscovering the same flaky tests every week.

Turn your test results into a ranked triage queue your team actually works through, with quarantine tickets filed in one click.