| name | flaky-test-triage |
| description | 실패하는 테스트를 여러 번 반복 실행해 각 실패를 불안정(flaky)인지 진짜 회귀(real)인지 분류하고, 확인된 진짜 회귀만 고치는 닫힌 루프입니다. 사용자가 "이 테스트 flaky인지 진짜 깨진 건지 가려줘", "간헐적으로 깨지는 테스트 분류해줘", "테스트 여러 번 돌려서 불안정한 거 골라줘", "flaky 테스트 트리아지", "flaky test triage", "classify flaky vs real failures", "run failing tests repeatedly and fix only real regressions"처럼 간헐 실패와 진짜 실패를 구분하고 싶을 때 사용하세요. (구분: 전체 스위트를 무조건 green까지 고치는 건 looping:test-until-green, 버그 하나를 재현 스크립트로 파고드는 건 looping:investigation-script-loop, 실패할 때마다 회고 메모를 남기며 재시도하는 건 looping:reflexion-debug-loop, 원격 CI 실패 감시는 looping:ci-failure-watcher) |
Flaky 테스트 트리아지 (Flaky Test Triage)
실패하는 테스트를 반복 실행하고, 각 실패를 flaky인지 진짜인지 분류한 뒤, 확인된 회귀만 고칩니다.
| 항목 | 값 |
|---|
| 카테고리 | 테스트(Testing) |
| 트리거 | 수동(manual) — 사람이 직접 시작 |
| 종료 조건(Exit) | 모든 실패가 분류되고, 진짜 회귀는 고쳐졌거나 명시적으로 보류(deferred)될 때 |
| 반복 한도(Max iterations) | 5 |
| 매 반복 체크 명령 | npm test -- --testPathPattern=<failing-suite> |
| 가드레일 | 강화됨(Hardened) |
| 지원 에이전트 | Claude Code · Cursor |
이 루프는 언제 쓰나
CI나 로컬에서 테스트가 깨지는데 "이게 진짜 버그인지, 그냥 가끔 빨개지는 불안정 테스트인지" 감이 안 잡힐 때 씁니다. 이런 상황에서 모든 실패를 똑같이 "고쳐야 할 버그"로 취급하면, 멀쩡한 프로덕션 코드를 건드리거나 정작 진짜 회귀는 flaky로 오인해 넘겨버리기 쉽습니다.
이 루프는 의심스러운 스위트를 3~5회 반복 실행해 실패 패턴을 먼저 수집합니다. 매번 깨지면 진짜(real) 회귀, 들쭉날쭉하면 불안정(flaky)으로 라벨을 붙이고 — 진짜 회귀만 최소 변경으로 고치고, flaky는 안정화 방안(재시도, 격리, mock)을 제안하거나 문서화합니다. 멀쩡한 코드를 헛고치는 일을 막는 게 핵심입니다.
루프 흐름
수동 시작 → 실패 테스트 반복 실행 → 실패 분류(flaky/real) → 진짜 실패 수정 → 안정성 재확인
↑ │
│ 〔피드백 게이트〕 │
│ 전부 분류됐고 진짜 회귀는 고쳐졌나(또는 보류)? │
└──────────────────────────── 아니오 ───────────────────────────────┘
│ 예
종료
매 반복(pass)마다 하는 일
- 실패 테스트 반복 실행 — 실패하는 테스트 파일이나 스위트를 3~5회 돌립니다. 테스트별 pass/fail 패턴을 기록합니다.
npm test -- --testPathPattern=<failing-suite>
- 실패 분류 — 각 실패를 flaky(간헐적)인지 real(일관되게 실패)인지 라벨링합니다. 타이밍, 실행 순서, 환경 의존성을 메모합니다.
- 진짜 실패 수정 — 확인된 진짜 실패를 최소 변경으로 고칩니다. flaky 테스트는 안정화 방안(재시도, 격리, mock)을 제안합니다.
- 안정성 재확인 — 스위트를 여러 번 다시 돌려 진짜 실패가 사라졌고 불안정성이 줄었거나 문서화되었는지 확인합니다.
npm test -- --testPathPattern=<failing-suite>
가드레일 (점수 조작 방지 규칙)
종료 조건을 "가짜로" 통과시키지 못하게 막는 규칙입니다. 반드시 지키세요.
- 체크 명령이나 종료 기준을 고쳐서 억지로 성공시키지 않는다.
- 체크를 건너뛰거나 비활성화·우회해서 종료 조건을 통과시키지 않는다.
- 여러 번 반복해도 막히면, 지표를 조작하지 말고 멈추고 블로커를 보고한다.
- 스위트를 통과시키려고 테스트를 약화·삭제·skip 하지 않는다.
- 진짜 단언(assertion)을 항상 통과하는 껍데기 테스트로 바꾸지 않는다.
- green으로 만들려고 테스트를 땜질하기보다 프로덕션 코드를 고치는 쪽을 택한다.
Claude Code에서 실행하기
이 루프는 수동(manual) 트리거입니다. 가장 간단합니다 — 아래 kickoff 프롬프트를 그대로 붙여넣으면 에이전트가 스스로 반복합니다.
"Flaky 테스트 트리아지(Flaky Test Triage)" 루프를 시작합니다.
목표: 실패하는 테스트를 flaky vs real로 분류하고, 진짜 회귀만 고친다
최대 반복: 5
매 반복 사이 실행: npm test -- --testPathPattern=<failing-suite>
종료 조건: 모든 실패가 분류되고, 진짜 회귀는 고쳐졌거나 명시적으로 보류될 때
1단계: 실패하는 스위트를 여러 번 실행한다. 각 실패를 분류하고, 진짜 실패는 고치고, flaky 동작은 문서화한다.
이 루프를 스스로 페이싱(self-pace)하라. 매 반복 후 체크 명령을 실행하고 출력을 읽어, 종료
조건이 충족되지 않았을 때만 계속한다. 종료 조건이 통과하거나 최대 반복에 도달하면 멈춘다.
매 회차마다 한 줄 상태 업데이트를 남긴다.
팁: <failing-suite>는 의심스러운 테스트 파일이나 패턴으로 바꾸세요. npm test -- --testPathPattern=은 Jest 예시입니다. 프로젝트에 맞게 pytest <경로> --count=5(pytest-repeat), go test -run <패턴> -count=5, cargo test <패턴> 등으로 바꾸면 됩니다.
팁 / 변형
- 반복 횟수 늘리기: 한두 번 더 돌려선 패턴이 안 잡히는 미묘한 flaky는
--count나 반복 실행 횟수를 10회 이상으로 올려 신호를 키우세요.
- 순서 의존 의심: 단독으로는 통과하는데 전체에서 깨진다면 테스트 격리·공유 상태를 의심하고, 실행 순서를 무작위화(
jest --randomize, pytest -p no:randomly 토글 등)해 재현해 보세요.
- 막힐 때: 5회 안에 분류가 안 끝나거나 같은 실패가 계속 형태를 바꾸면, 가드레일대로 멈추고 의심되는 원인(타이밍/순서/환경)과 함께 사람에게 보고하게 하세요.
- 연관 루프: 전체 스위트를 green까지 고치는 건
looping:test-until-green, 버그 하나를 재현 스크립트로 파고드는 건 looping:investigation-script-loop, 실패마다 회고 메모를 남기며 재시도하는 건 looping:reflexion-debug-loop.
원본 영어 kickoff (loops.elorm.xyz 원문)
Start the "Flaky Test Triage" loop.
Goal: classify failing tests as flaky vs real and fix only real regressions
Max iterations: 5
Between iterations run: npm test -- --testPathPattern=<failing-suite>
Exit when: every failure is classified and real regressions are fixed or explicitly deferred
Step 1: Run the failing suite multiple times. Classify each failure, fix real ones, and document flaky behavior.
Self-pace this loop. After each iteration, run the check command, read the output, and only continue if the exit condition is not met. Stop when the exit condition passes or max iterations is reached. Give a short status update each pass.
출처: https://loops.elorm.xyz/loops/flaky-test-triage