바이브코딩 · 위임 전략

비동기 코딩 에이전트 실전: 던질 일과 붙잡을 일

이슈를 할당하고 자리를 비우는 건 쉽다. 어려운 건 돌아왔을 때다. 던져도 되는 일과 옆에 붙어 있어야 하는 일을 가르는 기준을 정리했다.

개발자가 책상에서 일하는 동안 작은 로봇 에이전트들이 클라우드 작업 공간에서 각자 태스크를 처리하는 아이소메트릭 일러스트

퇴근 10분 전, 이슈 세 개를 에이전트에게 할당했다. 다음 날 아침 PR이 세 개 와 있다. 하나는 읽자마자 머지했다. 하나는 코멘트를 두 번 주고받고 나서야 들어갔다. 마지막 하나는 닫았다. 이슈에 쓴 "로그인 오류 수정"이 무슨 오류인지 에이전트도, 하루 지난 나도 정확히 몰랐으니까.

비동기 코딩 에이전트 워크플로는 이 세 가지 결과의 비율을 바꾸는 일이다. GitHub Copilot 코딩 에이전트, Cursor 클라우드 에이전트, OpenAI Codex 클라우드 모두 "맡기고 딴 일 하기"를 내세운다. 그런데 무엇을 맡기느냐에 따라 아침의 PR은 선물이 되기도, 숙제가 되기도 한다.

던지고 나면 실제로 벌어지는 일

Copilot을 예로 들면 흐름은 단순하다. 이슈의 담당자(Assignees)에 Copilot을 지정하면 👀 반응이 붙고, copilot/ 브랜치와 초안(draft) PR이 생긴다. 작업은 GitHub Actions 기반 환경에서 돌고, 끝나면 리뷰 요청 알림이 온다.

여기까진 홍보 문구와 같다. 실전에서 발목을 잡는 건 Microsoft Learn 공식 교육 문서에 조용히 적혀 있는 세부 사항이다.

규칙실전에서 의미하는 것
할당 시점의 제목·본문·기존 댓글만 읽는다할당 뒤 이슈에 단 댓글은 에이전트가 못 본다. 보충할 내용은 PR 쪽에 @copilot으로 남겨야 한다. 즉 할당하는 순간의 이슈가 지시서의 전부다.
PR은 항상 초안, 워크플로는 자동 실행 안 됨"Approve and run workflows"를 눌러야 CI가 돈다. 아침에 와 보니 테스트가 한 번도 안 돌았을 수 있다.
요청한 사람은 그 PR을 승인할 수 없다혼자 쓰는 저장소가 아니라면 리뷰어가 따로 필요하다. 맡긴 사람이 셀프 승인하는 구조를 막아 둔 것이다.
세션은 1시간이 지나면 타임아웃반나절짜리 작업을 한 이슈에 몰아넣으면 중간에 끊긴다. 쪼개서 던지는 게 기본이다.

Cursor 쪽도 결이 같다. 에이전트가 클라우드 VM에서 저장소를 복제해 브랜치에서 작업하고 PR을 연다. Cursor는 2026년 2월 발표에서 사내에서 머지되는 PR의 30% 이상을 이런 자율 에이전트가 만든다고 밝혔다. 도구를 만드는 회사가 직접 그 정도 비율로 쓰고 있다는 얘기다.

머지는 되는데, 끝난 건 아니다

숫자만 보면 낙관할 만하다. 2025년 Claude Code로 만든 PR 567건(오픈소스 프로젝트 157곳)을 분석한 와타나베 등의 연구에서 83.8%가 결국 머지됐다. 그런데 머지된 것 중 수정 없이 그대로 들어간 건 54.9%였다. 나머지 45.1%는 사람이 손을 더 댔다.

머지 이후도 있다. 2026년 9월 공개된 프리프린트는 별 500개 이상 저장소에서 머지된 에이전트 PR 6,774건과 같은 시기 사람 PR 5,044건을 비교했다. 에이전트 PR에 후속 수정이 붙을 오즈(odds)는 사람 PR의 1.62배였다. 흥미로운 건 그 수정을 누가 했느냐다. 확인된 수정의 69.6%는 원래 PR을 만든 바로 그 에이전트가 했다.

에이전트를 여러 개 동시에 돌릴 때는 다른 문제가 생긴다. 2026년 7월의 또 다른 프리프린트가 같은 저장소에서 동시에 열린 에이전트 PR 747쌍의 병합을 재현해 봤더니, 같은 에이전트끼리는 19.8%, 서로 다른 에이전트끼리는 41.7%가 텍스트 충돌을 냈다.

관점을 바꾸면

비동기 위임은 일을 없애 주지 않는다. 주의(attention)를 쓰는 시점을 뒤로 옮길 뿐이다. 작성 시간은 에이전트가 가져가지만 판단 시간은 고스란히 아침의 리뷰로 넘어온다. 그래서 질문은 "맡길 수 있나"가 아니라 "돌아왔을 때 10분 안에 판단할 수 있나"가 된다.

물론 반대쪽 주장도 일리가 있다. 사람이 퇴근한 사이 초안이 생긴다는 것 자체가 이득이고, 후속 수정도 대부분 에이전트가 하니 사람 부담은 생각보다 작다는 것이다. 두 주장 다 맞다. 차이는 어떤 작업을 던졌느냐에서 갈린다.

던져도 되는 일을 고르는 기준 4가지

이슈를 할당하기 직전, 아래 네 질문에 답해 본다. 하나라도 "아니오"면 그 작업은 옆에 붙어서 동기로 하는 편이 낫다.

질문"예"의 신호"아니오"의 신호
범위가 문장 하나로 닫히나"/api/orders 응답에 createdAt 필드 추가""주문 쪽 좀 정리", "로그인 오류 수정"
맞았는지 기계가 판정하나실패하는 테스트·린트·타입 검사가 이미 있다"화면이 자연스러워 보이면 OK"
틀려도 PR 닫으면 끝인가새 파일·문서·테스트 추가, 의존성 버전 올리기DB 마이그레이션, 결제·권한 로직, 공용 설정
아침에 10분 안에 리뷰되나diff가 몇백 줄 이내로 예상된다여러 모듈을 가로지르는 리팩터링

넷 중 건너뛰기 가장 쉬운 건 두 번째 질문이다. 테스트가 없는 작업을 던지면 에이전트는 "돌아가 보이는 코드"를 가져오고, 그게 맞는지는 결국 사람이 처음부터 확인해야 한다. 그럴 바엔 먼저 실패하는 테스트를 하나 써 두고 "이 테스트를 통과시켜라"로 던지는 게 낫다. 테스트 하나를 먼저 쓰는 수고가, 아침에 코드 전체를 처음부터 의심하는 수고보다 작다.

세 번째는 비용의 비대칭이다. 문서 PR이 틀리면 닫으면 된다. 마이그레이션이 틀리면 롤백 계획부터 세워야 한다. 와타나베 연구에서도 에이전트에게 주로 맡겨진 일은 리팩터링·문서·테스트였다. 사람들이 이미 본능적으로 이 선을 지키고 있다는 뜻이다.

지시서 쓰는 법, 그리고 망했을 때

할당하는 순간의 이슈가 지시서의 전부라면, 이슈를 지시서답게 쓰면 된다. 매번 이 틀을 쓴다.

## 목표 (한 문장)
/api/orders 응답에 createdAt(ISO 8601) 필드를 추가한다.

## 완료 조건
- tests/orders.spec.ts 의 "includes createdAt" 테스트 통과
- 기존 테스트 전부 통과, 린트 경고 0

## 건드리지 말 것
- db/migrations/, src/auth/

## 참고
- 비슷한 구현: src/api/invoices.ts 의 toResponse()

"건드리지 말 것" 칸이 생각보다 효과가 크다. 에이전트는 친절해서 근처의 이상한 코드까지 고쳐 주는데, 그 친절이 diff를 부풀리고 다른 에이전트의 PR과 충돌을 만든다. 저장소 공통 규칙은 .github/copilot-instructions.md 같은 지침 파일에 한 번 적어 두면 이슈마다 반복하지 않아도 된다.

망한 PR을 다루는 순서

  1. 코멘트로 고치기는 두 번까지. PR에 @copilot으로 수정 요청을 두 번 했는데도 방향이 틀렸다면, 문제는 코드가 아니라 지시서다.
  2. PR을 닫고 이슈를 다시 쓴다. 무엇이 오해됐는지 "완료 조건"과 "건드리지 말 것"에 반영한 뒤 다시 할당한다. 고쳐 쓰는 것보다 새로 던지는 게 대개 싸다.
  3. 동시에 던질 땐 파일이 겹치지 않게. 같은 파일을 만지는 이슈 두 개를 같은 밤에 던지면, 아침에 받는 건 충돌 두 개다.

맡긴 사람이 리뷰까지 끝내야 위임이 끝난다

머지 버튼을 누르는 순간 그 코드는 당신 이름으로 들어간다. 에이전트가 후속 수정을 대부분 해 준다는 데이터는, 첫 리뷰를 건너뛰어도 된다는 뜻이 아니다.

커피를 마시는 동안 할 일

비동기 에이전트를 잘 쓰는 사람의 하루는 의외로 손이 바쁘다. 작업을 쪼개고, 실패하는 테스트를 먼저 쓰고, "건드리지 말 것"을 적고, 아침엔 diff부터 연다. 코드를 덜 치는 대신 지시와 판단에 시간을 쓴다.

오늘 퇴근 전에 던질 이슈 하나를 골라 위의 네 질문을 붙여 보자. 네 번 다 "예"라면 정말로 커피를 마시러 가도 된다. 하나라도 걸린다면, 그 일은 아직 옆에서 같이 하는 게 맞다.

참고: GitHub Docs — Copilot에게 이슈 맡기기 · 프리프린트(arXiv 2609.26847, 2607.04697)는 동료 심사 전 결과이므로 경향으로 읽을 것.

아이디어를 현실로, 웹부터 AI 자동화까지 올인원 개발 파트너

HTTPS://JUNAI.AI

© 2026 주나이테크(주) @JUNAITECH