우리 최대 monorepo의 PR 58%가 사람 리뷰 없이 병합된다
Vercel은 저위험 PR 671건을 사람 리뷰 없이 병합해 병합 시간을 62% 줄였다.
Vercel의 가장 오래되고 큰 Next.js monorepo는 마케팅 사이트, docs, 회원가입 플로우, 대시보드, 내부 도구를 한데 담고 있고, 주당 400건이 넘는 PR이 들어온다. 이전에는 모든 PR이 사람 승인을 거쳐야 했지만, 이제 Vercel Agent가 diff, title, description을 바탕으로 위험도를 판정해 **58%**를 사람 리뷰 없이 병합한다.
분류기는 PR을 HIGH와 LOW 두 단계로 나눈다. authentication, payments, data integrity, security, infrastructure 변경은 HIGH로 분류해 항상 사람 리뷰를 요구하고, UI, styling, tests, documentation, refactors, 꺼진 feature flag 변경은 LOW 후보로 자동 승인한다. 판정은 evidenceQuotes를 먼저 추출하고 riskLevel을 마지막에 두는 구조화 JSON으로 강제해, 제목이 아니라 실제 diff에 근거하도록 설계했다. 데이터 무결성 PR의 93%, 보안 PR의 **92%**는 HIGH로 잡혔고, styling PR의 0.2%, docs PR의 **0.4%**만 HIGH로 오분류됐다.
롤아웃은 3단계였다. 먼저 조용히 분류만 하고, 다음엔 라벨과 근거를 노출했으며, 마지막엔 LOW-risk PR을 branch protection을 만족하는 auto-approve 대상으로 전환했다. 중단 조건은 revert율이 기준치 **1.7%의 3배(5.1%)**를 넘거나, rollback이 주 7.2건을 넘거나, 팀 분위기가 악화되는 경우였다.
결과는 안전했다. 671건의 LOW-risk PR이 리뷰를 건너뛰었지만 revert는 0건이었고, 비교군의 revert율은 **513건 중 2건(0.39%)**이었다. 배포 rollback은 주 2.8건에서 1.9건으로 줄었고, 자동 승인된 PR이 원인이 된 rollback은 없었다. 병합 시간은 사람 리뷰가 있는 PR 기준 2.3시간에서, 리뷰를 건너뛴 PR 기준 0.5시간으로 줄었고, 전체 평균 merge time도 29시간에서 10.9시간으로 62% 감소했다.
사람 리뷰는 사라진 게 아니라 더 중요한 곳으로 이동했다. HIGH-risk 대형 PR의 time-to-first-review는 24.7시간에서 9.0시간으로 단축됐고, reviewer workload는 주 13건에서 5건 남짓으로 줄었다. 여전히 LOW-risk PR의 **43%**는 자발적으로 리뷰를 받았고, 그중 **70%**는 코멘트가 없었다.
보안적으로는 LLM에 도구를 주지 않고 구조화 JSON만 반환하게 했으며, 실패 시 human review로 돌아가는 fail-open 구조를 택했다. 입력에서는 invisible Unicode를 제거하고, 출력은 sanitize했으며, untrusted author는 auto-approval에서 제외했다. 매 배포마다 prompt injection 시나리오 3개를 돌려 100% accuracy gate를 통과해야 했다. 핵심 메시지는 분명하다. mandatory review가 이미 상당수에서 실질적 가치를 내지 못했다면, 사람의 판단은 필요한 HIGH-risk PR에 집중해야 한다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.