quality-engineering-flaky-triage · git:20260913.6db6862 · 2026-09-13 · sha256 43aec22376d71b15

quality-engineering-flaky-triage git:20260913.6db6862A

Immutable. This exact content is served forever at /api/v1/blob/43aec22376d71b15.

---
name: quality-engineering-flaky-triage
description: Quarantines an intermittently failing test behind a ticket with an owner and expiry, assigns a root-cause bucket from isolated reruns, and defines when the test leaves quarantine. Use when a test is a QUARANTINE_CANDIDATE or fails without a code change; not for deterministic failures.
guardrail: true
metadata:
  triggers:
    files:
      - "**/quarantine.json"
      - "**/.flaky-tests*"
    keywords:
      - flaky test
      - flake triage
      - quarantine test
      - intermittent failure
      - unquarantine
      - retry budget
      - passes on rerun
---
# Quality Engineering: Flaky Triage

## **Priority: P0 (CRITICAL)**

## Entry

Only a `QUARANTINE_CANDIDATE` verdict enters triage: the test fails intermittently across isolated reruns with no code change between runs. A deterministic failure is `REAL_BUG_DO_NOT_HEAL` and goes to `dev-fix`, never here.

## Quarantine Contract

- Quarantine means the test still runs, its result is reported, and it does not gate merge; it never means `test.skip`.
- Every quarantined test carries a ticket with an owner and an expiry of at most 14 days. No ticket, no quarantine.
- On expiry: fixed and un-quarantined, or expiry extended once with a written reason, or the test is deleted with the coverage gap recorded in the coverage report. Silent expiry is forbidden.
- Record each entry in `flake_quarantine[]` as `{test, ticket, expiry, bucket}` so `test-loop` carries it in its handoff.

## Root-Cause Buckets

`ORDER_DEPENDENCE` · `SHARED_STATE` · `TIMING` · `ENVIRONMENT` · `DATA` · `PRODUCT_NONDETERMINISM`. Assign exactly one from the evidence in [Root-Cause Buckets](references/root-cause-buckets.md); `UNKNOWN` is allowed only with the reruns that were tried.

## Evidence Required

Run the test alone 10 times sequentially in the foreground. Record pass count, the failing run's artifact, and whether the failure reproduces with a fresh environment. Fewer than 10 isolated runs is not evidence; a pass on plain CI rerun is not evidence.

## Un-quarantine

A test leaves quarantine only when the root cause is fixed and it passes 10 consecutive isolated green runs after the fix. Retries, longer timeouts, or a wider matcher are not fixes; they hide the bucket.

## Reliability Impact

Each flaky test counts against `suite_reliability_pct` in `quality-engineering-automation-health` until its root cause is fixed; quarantine removes its reds from the merge gate, not from the report. State the quarantine count and the oldest expiry next to `release_confidence`.

## Red Flags

"just add retries: 3" · "skip it for now, we'll come back" · "it passes locally" · "extend the expiry again" — each hides a bucket instead of naming it. Stop, run the 10 isolated reruns, assign the bucket.

## Anti-Patterns

- **No skip as quarantine**: a skipped test reports nothing; quarantine still runs and reports.
- **No ticketless quarantine**: a quarantine without owner and expiry is a permanent skip in disguise.
- **No retry as fix**: `retries: N` is not a fix; it raises the pass rate and leaves the bucket unnamed.
- **No un-quarantine on a single green**: 10 consecutive isolated green runs after the fix, or it stays.

## References

- [Quarantine Ticket Template](references/quarantine-ticket-template.md)
- [Root-Cause Buckets](references/root-cause-buckets.md)
- [Reliability Math](references/reliability-math.md)