Bun은 어떻게 Claude를 '최고 기여자'로 만들었나 — 32분 라이브 코딩 세션이 보여준 AI 엔지니어링의 실측 데이터
개요
- 주제: Anthropic
Code w/ Claude세션 「Live coding with Bun and Claude Code」(Boris Cherny · Head of Claude Code / Jarred Sumner · Creator of Bun)에서 시연된, AI 에이전트 주도 오픈소스 유지보수 파이프라인 - 핵심 관점: AI 코딩의 생산성 문제는 "모델이 코드를 잘 쓰는가"가 아니라 "에이전트가 스스로 검증하고, 스스로 리뷰받고, 스스로 고치는 루프를 리포지토리에 설치했는가"의 문제다
- 핵심 키워드: Robo Bun · 적대적 코드 리뷰(Adversarial Code Review) · 복합 공학(Compound Engineering) · CLAUDE.md · Hill Climbing · Auto Mode

핵심 메시지 3가지
1) 봇이 인간 기여자를 추월했다
oven-sh/bun 저장소의 main 브랜치 기여자 통계에서 robobun 435커밋 vs Jarred-Sumner 247커밋(4:00 시점), 이후 집계에서는 robobun 626 · claude 380 · Jarred-Sumner 377로 나타납니다. 프로젝트 창립자 본인의 기여량을 AI 봇이 넘어서는 장면이 데이터로 확인됩니다.
2) 병목은 '코드 작성'에서 '검증과 계획'으로 이동했다
"It really moves the challenge from just fixing and debugging the issue to — is this the right thing to merge?"
이슈 재현·수정·테스트 작성·lint 대응이 자동화된 결과, 사람이 남는 일은 "이걸 병합해도 되는가"라는 판단과 "무엇을 할 것인가"라는 계획 두 가지로 압축되었습니다.
3) 자동화의 전제조건은 모델 성능이 아니라 문서화된 지식이다
CLAUDE.md에 빌드 명령·테스트 작성 규칙·폴더 구조·의존성·과거 실패 이력을 기록하는 '복합 공학'이 선행되지 않으면, 에이전트는 "병합할 수 없는 PR"만 대량 생산합니다.
① 자동화 파이프라인 — Robo Bun의 자기 검증 루프
이슈가 열리는 순간부터 병합 후보가 될 때까지의 흐름은 다음 6단계로 고정되어 있습니다.
① GitHub 이슈 생성
↓
② Robo Bun이 사람이 보기 전에 자동 재현
↓
③ 재현 테스트 작성 → PR 자동 제출
↓
④ 하드 게이트: "과거 버전에서 실패 + 현재 디버그 브랜치에서 통과"
↓
⑤ 코드 리뷰 봇 2종이 상호 리뷰 (30+ 댓글 스레드)
↓
⑥ CI(Buildkite) 로그·에러를 에이전트가 직접 읽고 수정 → 인간 리뷰 대기
| 단계 | 의미 | 자동화 주체 |
|---|---|---|
| 재현(Reproduce) | 이슈 접수 즉시 버그 재현 코드 작성 | Robo Bun |
| 테스트 동봉 | 테스트 없는 PR은 제출 자체가 불가 | Robo Bun (하드 요구사항) |
| 검증 게이트 | 이전 버전 실패 / 현재 브랜치 통과 | 봇이 제출 전 강제 확인 |
| 리뷰 대응 | 댓글 스레드 자동 처리·자동 resolved | Code Rabbit ↔ Robo Bun |
| CI 루프 | bun run ci:errors / ci:logs / ci:status로 실패 원인 자가 수정 |
Claude Code 에이전트 |
Bun이 이 자동화에 특히 유리했던 이유는 시스템 코드 + CLI 도구라는 특성 때문입니다. 브라우저를 띄울 필요 없이 특정 아키텍처에서 테스트 케이스 하나로 재현·검증이 끝나므로, "재현 가능한지 스크린샷으로 확인"하는 단계 자체가 필요 없습니다.

② 적대적 코드 리뷰 — 두 봇을 붙여놓는 이유
리뷰 단계는 한 개의 봇이 아니라 성격이 다른 두 개의 봇을 상호작용시킵니다.
| 항목 | Code Rabbit | Claude Code Review |
|---|---|---|
| 강점 | 형식·스타일 위반, CLAUDE.md 준수 여부 | diff 밖에 있는 제어흐름 추적으로 찾는 미묘한 엣지케이스 |
| 잡는 유형 | 네이밍·레이블·규칙 위반 | "코드 전체를 30분 읽어야 발견 가능한" 논리 버그 |
| 상호작용 | 댓글 → Robo Bun 응답 → 30개 이상 스레드, 해결 시 자동 resolved | 동일 스레드에서 정밀 지적 |
| 신뢰도 | — | 약 10%만 오답(기존 리뷰 도구처럼 대부분을 무시할 필요 없음) |
실제 지적 사례(PR #30032): claude Bot이 Image.ErrorCode 유니온에 ERR_OUT_OF_MEMORY가 누락되어 tsc 경고가 발생하는 문제를 찾아 수정을 제안했습니다. diff만 봐서는 놓치는 타입 정의 구멍을 컨텍스트 기반으로 잡아낸 것입니다.
여기서 사라진 비용은 '리뷰'가 아니라 전환 비용(switching cost) 입니다. 과거에는 PR이 늦어지는 이유가 "브랜치 체크아웃 → lint 수정 → 로컬 실행 → 재푸시"의 반복이었습니다. 이 루프가 자동화된 것이 병합 리드타임 단축의 실체입니다.
③ 복합 공학(Compound Engineering) — CLAUDE.md가 만드는 신뢰
Jarred Sumner이 제시한 규칙은 단순합니다.
"매번 반복하는 걸 발견했다면, 그것은 아마 CLAUDE.md로 들어가야 한다."
| 문서화 항목 | 구체 규칙 | 효과 |
|---|---|---|
| 빌드 | 특수 명령으로 빌드+실행(인자 전달) | 오래된 디버그 빌드로 검증하는 사고 차단 |
| 테스트 위치 | test/regression/issue/${issueNumber}.test.ts는 실제 회귀에만 |
이슈 번호가 있어도 과거에 정상 동작하지 않았다면 회귀가 아님 → 기존 모듈 테스트 파일로 |
| 테스트 방식 | Jest 호환 러너, 단일 파일은 -e, 다중 파일은 tempDir + Bun.spawn |
에이전트가 매번 같은 형태로 작성 |
| 검증 코드 | bunExec 실행, stdout/stderr 처리, toMatchInlineSnapshot, exitCode 확인 |
스냅샷·종료코드까지 자동 검증 |
| 아키텍처 | src/js/bindings(JavaScriptCore 바인딩), src/runtime(HTTP 서버·FFI·암호화), Node 호환 계층, Web API(fetch/streams) |
코드베이스 구조를 에이전트가 정확히 인지 |
| CI 디버깅 | BuildKite CLI(bk), ci:errors / ci:logs / ci:find, scripts/find-build.ts 직접 수정 |
도구 정확도를 사람이 계속 갱신 |
| 관측성 | 에러 메시지를 정보량 낮은 조건보다 먼저 출력 | Claude가 실제 에러를 보도록 하는 미세 설계 |

이 문서화의 목적은 명확히 서술되어 있습니다. "사람이 리뷰하는 시점에 이미 높은 신뢰도로 병합 가능하다는 명확한 표시가 있는 상태"를 만드는 것. 그리고 이것이 있어야 비로소 에이전트를 대규모로 병렬 운영할 수 있습니다. Boris Cherny가 "수백 개 에이전트를 밤마다 돌린다"는 과거 비전에 대해, Sumner은 "이제야 거기에 도달했다"고 답합니다.
④ 성과 데이터 — 커밋 통계, 벤치마크, 그리고 3년 묵은 이슈
기여자 커밋 수 (oven-sh/bun, main 브랜치)
| 기여자 | 4:00 시점 | 15:57~16:20 시점 | 구분 |
|---|---|---|---|
| robobun | 435 | 626 | AI 봇 |
| claude | 162 | 380 | AI |
| Jarred-Sumner | 247 | 377 | 인간(창립자) |
| autofix-ci[bot] | 196 | — | CI 봇 |
산출 근거: 두 시점의 GitHub Insights 기여자 화면. 시점 차이가 커서 절대값 비교보다 "봇이 창립자를 추월했다"는 순위에 의미가 있습니다.
Bun.Image — Sharp 대비 성능(PR #30032, Claude 작성)
| 항목 | 수치 |
|---|---|
| 병합 커밋 수 | 85 |
| 총 테스트 | 204개 / 4개 스위트 |
| ├ image.test.ts | 약 80 (happy path) |
| ├ image-adversarial.test.ts | 약 58 (포맷 혼동) |
| ├ image-kernels.test.ts | 약 38 (알고리즘 고정) |
| └ image-vs-sharp.test.ts | 29 (libvips 교차 검증) |
| 1080p PNG 리사이즈 | 1.38배 빠름 |
| 4K JPEG 처리 | 1.27배 빠름 |
| 의존성 | libjpeg-turbo, libspng 등 |
| 후속 과제 | x64 libjpeg-turbo NASM SIMD, new Response(image) 인코딩, Integer pre-shrink |
이 PR은 "Sharp보다 빠르다"는 목표와 측정 수단만 주고 모델이 스스로 벤치마크를 돌리고 JavaScriptCore 코드를 분석해 Typed Array 클로닝을 최적화한 사례로, 발표에서는 Hill Climbing(언덕 오르기) 라고 명명되었습니다. 개발자가 이 작업에 쓴 집중도는 약 10%, 나머지는 병행 업무였습니다.
자율 실행의 실측 로그
| 항목 | 값 |
|---|---|
| 세션 내 PR 생성 | 약 25분 만에 3개 |
| 단일 프롬프트 실행 | 30분, 업보트 20+ 이슈 PR 생성 |
| 상태 로그 | 20m 16s · 80.0k tokens |
| CI 모니터링 | 286개 중 28개 완료 (28 passed / 33 running) |
| #30331 검증 | 17개 테스트 전부 통과 |
| 커밋 트레일러 | Co-authored-by: Claude Opus 4.7 (1M context) |
| claude 태그 PR 목록 | 69페이지 |
해결된 버그의 난이도 분포
| 이슈 | 성격 | 수정 지점 |
|---|---|---|
| #30320 / #30322 | Windows sideEffects glob → tree-shaking 파손 |
normalizePathForGlob, C:\proj\... 경로 불일치 |
| #25422 / #30328 | instanceof File 실패 |
JSDOMFile.cpp의 customHasInstance가 프로토타입 체인 순회 생략 → JSObject::defaultHasInstance 폴백 |
| #30331 | Bun.deflateSync가 windowBits 무시 |
gzipOrDeflateSync에서 파싱만 하고 압축기에 미전달 → node:zlib와 바이트 단위 일치 |
| #30330 | WHATWG Console 들여쓰기 | Zig ConsoleObject.zig에서 그룹 중첩 수준 반영 |
| #3521 | expect.any/toMatchObject가 수신 객체 변형(mutate) |
2023년 7월 보고, 참여자 10명, 2023년 11월에도 재현 신고 → 이번에 해결 |
| #30314 | bunfig.toml CA 스토어 선택 |
CLI flag > 환경변수 > bunfig.toml 우선순위 |
| #30319 / #30316 / #30315 / #30312 / #30310·#30309 | http2 클라이언트 스톨, Blob 중첩 배열 보존, ARM CPU 모델 디코더, 스코프 패키지 URL 인코딩, Bun.Terminal/Bun.Transpiler 크래시·use-after-free |
시스템 레벨·런타임 버그 다수 |
특히 #3521은 3년 가까이 열려 있던 이슈로, "사람이 손대기 귀찮지만 방치되던" 백로그가 AI 루프에서 처음으로 소진된 사례입니다.

관점 포인트
- 비공개 제품에서도 같은 패턴이 성립한다: 오픈소스는 '이슈'가 입력이지만, 일반 기업은 고객지원 티켓이 입력이다. 티켓 → 재현 → PR → 리뷰 봇 루프가 개발자 시간 절감의 본질이다.
- 병합 기준은 오히려 더 엄격해진다: AI 생성 PR은 인간 동료의 작업과 달리 "안 병합해도 되는 심리적 부담"이 없어, 기준을 낮출 이유가 없다.
- 완전 자동화(Closed Loop)의 두 조건: ① 변경 사항 검증 시간 단축, ② 롤백 용이성. 이 둘이 갖춰진 단순 이슈는 CI 통과 후 즉시 병합해야 한다는 입장.
- 권한 승인 대기 = 숨은 비용:
dangerously skip permissions대신 Auto Mode를 권장. 중단 없이 수 시간 백그라운드 실행이 가능해진다. No Flicker Mode(가상화 스크롤링)는 메모리/CPU 사용량을 일정하게 유지. - 리뷰 봇의 '연기'를 경계하라: 댓글을 다는 것(performative)이 아니라 수정하는 것까지 루프에 들어가야 자동화가 성립한다.
- 청중의 절반은 아직 수동 터미널 단계: 컨퍼런스 현장 설문에서 다수가 터미널 창·데스크톱 탭에 이슈를 붙여넣는 방식에 머물러 있었고, Robo Bun형 루프는 "다음 추상화 단계"로 제시됐다.
- 아직 자동화되지 않은 영역: 기능 요청(Feature Request)은 완전 자동화 대상이 아니며, Discord/Slack 멘션으로 구현을 시도하는 단계다.
최종 핵심 정리
확인해야 할 핵심 질문
- 우리 리포지토리의 CLAUDE.md(또는 에이전트용 지식 파일)에는 빌드 명령·테스트 위치 규칙·폴더 구조·과거 실패 이력이 실제로 적혀 있는가?
- 에이전트가 제출한 PR에 "이전 버전 실패 + 현재 통과"라는 하드 게이트가 있는가? 없다면 자동화는 품질을 보증하지 못한다.
- 리뷰는 서로 다른 강점을 가진 2개 이상의 봇이 상호 스레드를 주고받는 구조인가? (형식 vs 컨텍스트 기반 논리)
- 에이전트가 CI 실패와 빌드 로그를 직접 읽고 자가 수정하는가? 사람이 보는 시점에 이미 병합 신뢰도가 표시되는가?
- 지금 팀의 진짜 병목은 코드 작성인가, 아니면 검증 시간과 계획 수립인가?
- 검증 시간이 짧고 롤백이 쉬운가? 그 두 조건이 충족된 이슈만 즉시 병합 대상이다.
한 줄 요약: AI 코딩의 생산성은 모델이 아니라 '재현 → 테스트 → 적대적 리뷰 → 자가 CI 수정'의 루프를 리포지토리에 문서로 설치했을 때 나오며, Bun은 그 결과로 봇을 창립자보다 많은 커밋을 올린 최고 기여자로 만들었다.
댓글 0
아직 댓글이 없습니다 — 첫 댓글을 남겨보세요.