| name | ship-pr-until-green |
| description | 브랜치에서 변경을 구현하고 → 로컬 테스트 → 커밋·push → PR 열기 → CI 대기 순으로, 모든 체크가 통과해 PR이 머지 가능해질 때까지 자동으로 반복하는 닫힌 루프입니다. 사용자가 "PR 초록불 될 때까지 밀어줘", "구현하고 PR까지 올려서 CI green 만들어줘", "이 변경 PR 머지 가능하게 끝까지 가줘", "PR 열고 CI 통과시킬 때까지 반복", "ship this PR until green", "open a PR and fix CI until it passes", "implement, push, and get the PR merge-ready"처럼 하나의 변경을 PR 머지 직전까지 완주시키고 싶을 때 사용하세요. (구분: 이미 실패한 CI 한 건만 고치는 건 looping:fix-ci-until-green, 원격 CI를 주기적으로 폴링·감시하는 건 looping:ci-failure-watcher, 여러 PR을 정해진 간격마다 돌보는 건 looping:pr-babysitter, PR 열기 전 자체 리뷰만 도는 건 looping:pr-self-review) |
PR 초록불까지 출시 (Ship PR Until Green)
브랜치에서 구현하고, 테스트를 돌리고, push하고, PR을 열고, CI를 기다려 — 체크가 전부 통과하고 머지 가능해질 때까지 반복합니다.
| 항목 | 값 |
|---|
| 카테고리 | CI |
| 트리거 | 수동(manual) — 사람이 직접 시작 |
| 종료 조건(Exit) | PR이 열려 있고 모든 PR 체크가 success(머지 준비 완료)일 때 |
| 반복 한도(Max iterations) | 10 |
| 매 반복 체크 명령 | gh pr checks |
| 가드레일 | 강화됨(Hardened) |
| 지원 에이전트 | Claude Code · Cursor · Codex |
이 루프는 언제 쓰나
"코드만 짜고 끝"이 아니라 머지 가능한 PR까지 한 번에 끌고 가야 할 때 씁니다. 구현 → 로컬 테스트 → 커밋·push → PR 열기 → 원격 CI 대기 → 실패 시 수정의 전 과정을, 사람이 매 단계 끼어들지 않아도 에이전트가 스스로 반복하며 green에 수렴시킵니다.
특히 로컬은 통과하는데 CI에서만 깨지는(환경 차이, 캐시, 누락된 의존성) 경우에 유용합니다. 에이전트가 CI 로그를 읽고 → 로컬에서 한 번 고치고 → push한 뒤 → 다시 체크가 돌기를 기다리는 한 사이클을, 모든 체크가 success가 될 때까지 자동으로 돕니다.
루프 흐름
수동 시작 → 구현·테스트 → 커밋·push → PR 열기/업데이트 → CI 수정 →〔피드백 게이트〕
PR 체크 전부 통과 & 머지 준비?
├─ 아니오 → 다시 구현·수정으로 (최대 10회)
└─ 예 → 종료
매 반복(pass)마다 하는 일
- 구현·테스트 — 범위가 정해진 변경을 만들고 로컬 테스트를 돌립니다.
npm test
- 커밋·push — 명확한 메시지로 커밋하고 브랜치를 push합니다.
- PR 열기 또는 업데이트 — 요약과 테스트 플랜을 담아 PR을 열거나, 이미 있으면 업데이트합니다.
gh pr view --json statusCheckRollup,url
- CI 수정 — CI가 실패하면 로그를 읽고, 로컬에서 한 번 고치고, push한 뒤 다시 체크를 기다립니다.
가드레일 (점수 조작 방지 규칙)
종료 조건을 "가짜로" 통과시키지 못하게 막는 규칙입니다. 반드시 지키세요.
- 체크 명령이나 종료 기준을 고쳐서 억지로 성공시키지 않는다.
- 체크를 건너뛰거나 비활성화·우회해서 종료 조건을 통과시키지 않는다.
- 여러 번 반복해도 막히면, 지표를 조작하지 말고 멈추고 블로커를 보고한다.
Claude Code에서 실행하기
가장 간단합니다. 아래 kickoff 프롬프트를 그대로 붙여넣으면 에이전트가 스스로 반복합니다.
"PR 초록불까지 출시(Ship PR Until Green)" 루프를 시작합니다.
목표: PR이 열려 있고 모든 CI 체크가 통과
최대 반복: 10
매 반복 사이 실행: gh pr checks
종료 조건: 모든 PR 체크가 success일 때
1단계: 변경을 구현하고, 로컬에서 테스트하고, push하고, PR을 열고, green이 될 때까지 CI를 고친다.
이 루프를 스스로 페이싱(self-pace)하라. 매 반복 후 체크 명령을 실행하고 출력을 읽어, 종료
조건이 충족되지 않았을 때만 계속한다. 종료 조건이 통과하거나 최대 반복에 도달하면 멈춘다.
매 회차마다 한 줄 상태 업데이트를 남긴다.
전제: gh CLI가 인증되어 있어야 하고(gh auth status로 확인), 작업 브랜치가 원격에 push될 수 있어야 합니다. npm test는 예시이니 프로젝트에 맞게 pytest, go test ./..., cargo test, pnpm test 등으로 바꾸세요.
팁 / 변형
- 체크 명령 교체: 로컬 단계의
npm test는 생태계에 맞게 바꾸고, 원격 게이트인 gh pr checks는 gh pr view --json statusCheckRollup,url이나 gh run watch로 보강해 더 자세한 상태를 읽게 할 수 있습니다.
- 막힐 때 대처: 같은 CI 실패가 2회 반복되면 가드레일대로 멈추고, 원인 가설과 로그 요약을 사람에게 보고하게 하세요. 머지 충돌처럼 제품 판단이 필요한 건 직접 손대지 않고 에스컬레이션합니다.
- CI가 느릴 때: 체크가 끝나길 기다리느라 반복을 낭비하지 않도록, push 후
gh run watch로 결과를 한 번에 기다린 뒤 다음 패스로 넘어가게 하세요.
- 연관 루프: 이미 실패한 CI 한 건만 집중 수정은
looping:fix-ci-until-green, PR 올리기 전 자체 리뷰는 looping:pr-self-review, 머지 후 여러 PR 상시 관리는 looping:pr-babysitter.
원본 영어 kickoff (loops.elorm.xyz 원문)
Start the "Ship PR Until Green" loop.
Goal: PR is open with all CI checks passing
Max iterations: 10
Between iterations run: gh pr checks
Exit when: all PR checks are success
Step 1: Implement the change, test locally, push, open PR, and fix CI until green.
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/ship-pr-until-green