Boris Cherny의 게시물, 첨부된 Slack 이미지, 그리고 사전 조사 문서를 공개 문서와 대조해 검증하고 다시 정리한 문서입니다.
지난 몇 주 동안 조금 이상한 실험을 해보고 있습니다. Claude에게 우리 앱들의 일상적인 유지보수를 맡겨 보는 것입니다. 이것이 정말 가능할지도 모른다는 초기 징후가 보이고 있습니다.
구성은 간단합니다. proj-claude-maintains-apps라는 Slack 채널이 있습니다. 이곳에서 Claude Tag가 iOS, Android, Desktop, Web, CLI, Agent SDK 전반에 걸쳐 여러 일일 루틴을 실행합니다.
결과는 놀랄 만큼 긍정적이었습니다. 지난 몇 주 동안 이 루틴들이 여러 저장소에 총 388개의 PR을 열었고, 그중 180개를 Claude Code Review와 사람의 리뷰를 거친 뒤 병합했습니다. 이제는 이런 기계적인 변경을 더 쉽게 병합할 수 있도록 절차를 간소화하는 방법을 고민하고 있습니다.
Claude는 대체로 첫 시도에 PR을 제대로 만듭니다. 그렇지 않을 때는 다음 날 더 잘하도록 Claude에게 해당 루틴을 조정하라고 합니다. 때로는 제대로 조정하는 데 며칠이 걸립니다.
비슷한 워크플로를 시도하려면 Claude Code나 Tag에 요청하거나, claude.ai/code/routines에서 직접 루틴을 만들 수 있습니다. 아래에는 제가 실제로 사용한 프롬프트 몇 가지를 첨부했습니다.
비슷한 워크플로를 실험해 본 사람이 있나요?
네 루틴 모두 “찾는다”에서 끝나지 않고 수정 PR까지 갑니다. 특히 Dead-code remover는 하루를 기다립니다 — 정적 분석의 판단을 런타임 관측으로 한 번 더 검증하는 구조입니다.
회색 208개는 “실패한 PR”이 아닙니다. 리뷰 대기, 방금 열린 PR, 중복, 보류가 모두 여기 섞여 있습니다. 이유는 수치 해석에서 다룹니다.
이 실험의 핵심은 “AI가 코드를 많이 쓴다”가 아닙니다. 그동안 경제성이 낮아 방치되던 유지보수 작업을, 매일 자동으로 찾아내 리뷰 가능한 작은 PR로 포장하는 비용이 급격히 낮아졌다는 점입니다. 최종 병합 권한은 여전히 사람에게 있습니다.
하루 한 바퀴. 오른쪽 끝에서 되돌아오는 굵은 선이 이 실험의 핵심입니다 — 되돌아가는 지점이 PR이 아니라 루틴입니다.
claude/ 브랜치에 작은 수정과 PR을 만든다/verify 결과, 진리표를 PR에 첨부한다↳ 6단계가 다시 1단계로 이어지는 것이 이 시스템의 진짜 제품입니다.
원 분석의 큰 틀은 정확합니다. 다만 제품 상태와 요금, 이미지 판독에서 보정할 항목 6가지가 나왔습니다.
| 항목 | 판정 | 확인 내용 |
|---|---|---|
| 게시물 실재 여부와 수치 | 확인 | 2026년 8월 X 게시물로 확인. 388 PR / 180 병합, Slack 채널명, 루틴 이름 모두 원문과 일치. 2차 보도도 동일한 수치를 전합니다. |
| Routines의 상태 | 보정 | research preview가 맞습니다. 다만 공식 문서는 Pro·Max·Team·Enterprise에서 이미 사용 가능하다고 명시합니다. 2026년 4월 14일 공개되었습니다. |
| Claude Tag의 제공 범위 | 확인 | Team·Enterprise 대상 베타. 다만 “조직 공용 정체성”은 더 정확히는 채널 단위 정체성입니다. 공개 채널은 워크스페이스 공용, 비공개 채널은 채널 전용 정체성을 갖습니다(agent identity). |
| Code Review는 승인·차단을 하지 않는다 | 확인 | 문서가 명시합니다. 심각도만 표시하고 기존 리뷰 절차를 바꾸지 않습니다. Team·Enterprise 한정, ZDR 조직 제외. |
| “비용 데이터가 전혀 없다” | 보정 | 리뷰 비용은 공개되어 있습니다. Code Review는 리뷰 1건당 평균 $15–25로 과금됩니다(출처). 이것만으로 하한 추정이 가능합니다. 아래 참조. |
| 루틴 목록은 11종 | 보정 | 이미지의 표는 아래가 잘려 있습니다. Abstraction police 밑에 행이 하나 더 시작됩니다. 게시물의 “a bunch more”와 합치면 최소 11종, 실제로는 더 많음이 정확한 표현입니다. |
| Shipped-feature inliner 설명 | 보정 | 이미지 원문은 “완전히 출시된 기능의 플래그를 제거한다”까지만 말합니다. “해당 경로를 기본 코드에 편입한다”는 이름(inliner)에서 추론한 내용이므로 추론으로 표시해야 합니다. |
| Slack 스크린샷의 연도 | 해소 | 화면에 연도는 없지만 2026년 7월 19일로 특정됩니다. Routines는 2026년 4월, Claude Tag는 2026년 6월에야 존재했기 때문입니다. |
| “작업 명의는 연결된 사용자 계정” | 보정 | 개인 계정 루틴은 그렇습니다(문서 명시). 그러나 Claude Tag 경로에서는 Claude 자신의 정체성(Slack 앱, Claude GitHub App, 관리자가 만든 서비스 계정)으로 동작합니다. 어느 경로냐에 따라 감사 로그의 주체가 달라집니다. |
| Claude Tag가 루틴을 “실행한다”는 구조 | 미확인 | 공개 문서상 루틴은 개인 claude.ai 계정에 귀속되며 팀과 공유되지 않습니다. Tag 정체성이 루틴을 보유하는 형태는 공개 문서로 확인되지 않습니다. 사내 버전일 가능성이 있습니다. |
사전 문서의 번역은 정확합니다. 특히 fuzz를 “무작위 바이트 주입”이 아니라 실제 앱을 조작하며 충돌 경로를 찾는 탐색적 E2E 퍼징으로 옮긴 판단, truth table을 논리학 표가 아니라 조건 조합 × 기대 동작 표로 해석한 판단은 맥락에 맞습니다.
게시물은 간단해 보이지만, 실제로는 서로 다른 네 개의 제품이 한 줄로 엮여 있습니다. 하나라도 빠지면 같은 워크플로가 재현되지 않습니다.
| 층 | 역할 | 공개된 조건 |
|---|---|---|
| Claude Tag | Slack 채널이 작업 지시와 보고의 창구가 된다 | Team·Enterprise 베타. Primary Owner/Owner만 설정 가능. Enterprise는 역할 기반 접근 제어 추가 |
| Routines | 프롬프트 + 저장소 + 환경 + 커넥터를 저장해 무인 실행 | 일정·API·GitHub 이벤트 트리거. 노트북이 꺼져 있어도 클라우드에서 실행. research preview |
| Code Review | 여러 에이전트가 전체 코드베이스 맥락에서 PR을 검사 | 승인·차단 없음. Team·Enterprise, ZDR 조직 제외. 사용량 크레딧으로 별도 과금 |
| 사람 | 제품 의도와 위험을 판단하고 병합을 결정 | 대체되지 않는 층 |
루틴 하나하나는 서로를 모릅니다. 그런데도 전체가 한 시스템처럼 움직이는 이유는 세 가지를 공유하기 때문입니다. 같은 완료 규격(재현 절차·/verify·진리표), 같은 리뷰 큐, 같은 피드백 채널(Slack 스레드 → 루틴 조정). 오케스트레이션은 소프트웨어가 아니라 이 세 가지 약속입니다.
진리표는 두 번 등장합니다. 실행 전에는 루틴 프롬프트 안의 완료 조건으로, 실행 후에는 PR에 첨부되어 리뷰어가 읽는 증빙으로. 이 이중 역할이 없으면 왼쪽의 독립된 루틴들과 오른쪽의 단일 리뷰 큐가 연결되지 않습니다.
루틴 실행은 실행 중 승인 프롬프트가 없는 완전 자율 세션입니다. 저장소는 매 실행마다 기본 브랜치에서 새로 복제되고, 변경은 claude/ 접두사 브랜치로만 자유롭게 푸시됩니다. 보호된 브랜치, 타인의 PR이 열린 브랜치, 타인이 작성한 커밋이 있는 브랜치로의 푸시는 거부됩니다. 이 두 가지가 “실패가 PR에서 멈춘다”를 보증하는 실제 장치입니다.
iOS, Android, Desktop 앱의 E2E 충돌 퍼징을 위한 새로운 일일 루틴을 시작하자. 플랫폼별로 각각 루틴을 만들어라. 워크플로를 사용해 실제 앱을 실행해야 하며, mock은 사용하지 않는다. 앱을 퍼징해 충돌을 유발한 다음, 그 충돌의 수정 PR을 올려라. 각 PR은 반드시 /verify를 실행하고, PR에 재현 절차와 진리표를 게시해야 한다. 이 채널에는 새로운 최상위 Fuzzer 스레드를 만들고 그곳에 진행 상황을 업데이트하라.
또한 business-logic-bugfixer-daily, business-logic-simplifier-daily, dup-unifier도 만들어라. 방식은 같다. 앱마다 별도의 루틴을 만들고, 업데이트를 올릴 최상위 스레드를 두며, 항상 진리표를 사용해 E2E로 검증한다. 이 모든 작업에서는 논리를 형식적으로 모델링하는 것도 잊지 마라. 그래야 논리의 빈틈과 중복을 발견하고 모든 경계 사례가 충분히 테스트되었는지 확인할 수 있다.
불안정한(flaky) 테스트의 근본 원인을 찾아 수정하고, 쓸모없는 테스트를 삭제하는 작업에도 같은 방식을 적용하라.
오후 12:43죽은 코드 제거용 루틴도 하나 만들어라.
2026년 7월 19일 오후 12:30과 12:43, 두 개의 메시지로 iOS·Android·Desktop의 E2E 충돌 퍼징, 비즈니스 로직 버그 수정과 단순화, 중복 통합, 불안정 테스트 근본 원인 수정, 무용 테스트 삭제, 죽은 코드 제거 루틴이 한꺼번에 만들어집니다. 여기서 중요한 것은 무엇을 시켰는지가 아니라, 무엇을 해야 끝난 것으로 인정하는지를 못 박았다는 점입니다.
| 지시된 장치 | 의미 | 막으려는 실패 |
|---|---|---|
| 실제 앱 실행, mock 금지 | 테스트 대역이 아닌 실제 실행 환경에서 재현 | mock에서는 통과하지만 제품에서 실패하는 수정 |
| 앱마다 독립 루틴 | 플랫폼별 빌드·런타임·UI 차이를 분리 | 한 플랫폼의 가정을 다른 플랫폼에 잘못 적용 |
/verify 필수 | 팀 내부 표준 검증 절차를 모든 PR에 강제 | 에이전트가 임의로 검증 범위를 축소 |
| 재현 절차 첨부 | 변경 전 실패를 다시 만들어 낼 수 있게 함 | 실제 버그인지 확인할 수 없는 PR |
| 진리표 첨부 | 입력 조건 조합과 기대 결과를 명시 | 조건 분기와 경계 사례 누락 |
| 논리의 형식적 모델링 | 자연어 추측이 아닌 상태·규칙·불변조건으로 분석 | 복잡한 비즈니스 규칙의 오독 |
| 최상위 Slack 스레드 보고 | 루틴별 실행 기록과 피드백을 한곳에 축적 | 자동화가 보이지 않는 곳에서 조용히 실패 |
| 로그인 | 네트워크 | 캐시 | 기대 결과 |
|---|---|---|---|
| 예 | 정상 | 있음 | 서버 응답 표시, 캐시 갱신 |
| 예 | 끊김 | 있음 | 캐시 표시, 오프라인 안내 |
| 예 | 끊김 | 없음 | 복구 가능한 오류 화면 |
| 아니요 | 무관 | 무관 | 로그인 화면으로 이동 |
이 표가 하는 일은 단 하나입니다. 정상 경로 하나가 통과했다는 이유로 에이전트가 작업을 끝났다고 선언하지 못하게 만드는 것. 자율 실행 세션에는 중간 승인이 없으므로, 완료 조건은 프롬프트 안에 미리 들어가 있어야 합니다.
루틴 실행 목록의 초록색 상태는 세션이 오류 없이 끝났다는 뜻일 뿐, 작업이 성공했다는 뜻이 아닙니다. 차단된 네트워크 요청, 없는 커넥터 도구, 과제 실패는 모두 상태 표시가 아니라 실행 기록 안에만 나타납니다. 진리표와 스레드 보고를 요구한 이유가 여기에 있습니다.
| 루틴 | 하는 일 | 범주 |
|---|---|---|
| Crash fuzzer | 실제 앱에서 충돌을 찾아 근본 원인 수정 PR을 연다 | 실행 중 결함 |
| Logic bugfixer | 까다로운 논리를 모델링해 버그를 찾아 수정한다 | 실행 중 결함 |
| Flaky-test fixer | 간헐적으로 실패하는 CI 테스트의 근본 원인을 찾는다 | 실행 중 결함 |
| Logic simplifier | 복잡하게 얽힌 비즈니스 로직을 단순화한다 | 복잡성 축소 |
| Dup unifier | 중복된 구현들을 하나로 합친다 | 복잡성 축소 |
| Dead-code removal | 도달할 수 없음이 입증된 코드를 삭제한다 | 청소 |
| Useless-test pruner | 실패할 수 없는 테스트를 삭제한다 | 청소 |
| Ant-only shipper | 사용량에 따라 잊힌 내부 전용 기능을 출시하거나 삭제한다 | 수명주기 정리 |
| Shipped-feature inliner | 완전히 출시된 기능의 플래그를 제거한다 | 수명주기 정리 |
| Abstraction improver | 과도하게 설계된 추상화를 평탄화한다 | 아키텍처 |
| Abstraction police | 계층 구조 위반을 수정한다 | 아키텍처 |
Improver와 Police는 반대 방향의 교정입니다. 전자는 추상화가 너무 많은 문제를, 후자는 있는 추상화가 지켜지지 않는 문제를 다룹니다. 하나는 계층을 줄이고, 하나는 건너뛴 계층을 되돌립니다. 이름이 비슷해서 하나로 합치면 두 방향이 서로를 되돌리는 PR을 만들게 됩니다.
Ant-only는 Anthropic 내부 전용 기능을 가리키는 사내 표현으로 보입니다. 이미지가 “forgotten internal-only features”라고 명시하므로 그 범위 안에서만 해석했습니다.
| 지표 | 값 | 성격 |
|---|---|---|
| 생성된 PR | 388 | 자기보고, 확정 |
| 병합된 PR | 180 | 자기보고, 확정 |
| 관측 시점 병합 비율 | 46.4% | 계산값 |
| 병합 확인 안 된 PR | 208 | 상태 불명 |
| 일평균 생성(3주 가정) | ≈18.5 | 추정 |
| Code Review 비용(전량 리뷰 가정) | $5.8k–9.7k | 추정 |
사전 분석은 “비용 정보가 없다”고 했지만, 리뷰 쪽은 공개 단가가 있습니다. Code Review는 PR 크기와 복잡도에 따라 건당 평균 $15–25입니다. 388건 모두 리뷰가 돌았다고 가정하면 리뷰 비용만 대략 $5,800–9,700입니다. 여기에 388건의 루틴 실행 토큰, 시뮬레이터·CI 시간, 그리고 가장 비싼 항목인 사람의 리뷰 시간이 더해집니다. 자동화의 ROI는 PR 개수가 아니라 절약된 순공수 − (검토 + 운영 + 실패) 비용입니다.
지시문이 “앱마다 별도의 루틴”을 요구하므로 실행 횟수는 플랫폼 수와 루틴 수의 곱으로 늘어납니다.
공개된 한도로 계산하면 이 실험은 개인 계정 한 개로는 재현되지 않습니다. 플랫폼 6종 × 루틴 11종이면 하루 최대 66회 실행이 필요한데, 공개 시점 기준 하루 루틴 실행 한도는 Pro 5회, Max 15회, Team·Enterprise 25회였습니다. 사용량 크레딧을 통한 초과 실행, 여러 계정, 또는 사내 버전을 전제해야 성립합니다. 같은 워크플로를 복제하려면 이 비용 구조를 먼저 확인해야 합니다.
현재 증거가 지지하는 결론은 여기까지입니다. 테스트와 리뷰 기반이 잘 갖춰진 대규모 코드베이스에서, 에이전트가 반복적인 유지보수 후보를 지속적으로 발굴하고 그중 상당수를 사람이 병합할 수 있는 PR로 만드는 일이 실용 단계에 접근했다는 것. “앱 유지보수가 자율화되었다”거나 “사람 개발자가 불필요해졌다”는 결론은 이 자료로 뒷받침되지 않습니다.
신규 기능은 “무엇을 만들 것인가”부터 모호합니다. 반면 죽은 코드 제거, 플래그 정리, 충돌 재현은 성공 조건을 테스트와 diff로 표현할 수 있습니다. 정답이 있는 문제부터 넘긴 것입니다.
운영 환경 배포가 아니라 격리된 브랜치의 제안입니다. 잘못된 결과의 처리 비용이 “닫기” 한 번입니다.
잘못된 PR이 나오면 그 PR을 손보는 대신 생성 루틴을 고칩니다. 한 번의 개선이 이후 모든 실행에 재사용됩니다. 실질적으로는 에이전트용 SOP와 완료 규격을 계속 개발하는 일입니다. 게시물도 “며칠씩 걸리기도 한다”고 인정합니다.
중복 제거, 불안정 테스트 조사, 오래된 플래그 삭제는 중요하지만 긴급하지 않아 밀립니다. 에이전트의 가치는 인간을 넘는 창의성보다 빠짐없는 성실성에 가깝습니다.
확실한 죽은 코드는 삭제하지만, 의심만 되는 코드에는 먼저 로깅을 넣고 다음 날 판단합니다. 정적 분석 → 런타임 관측 → 삭제로 이어지는 다단계 검증입니다. 이 실험에서 가장 이식할 가치가 큰 패턴입니다.
Renovate는 오래전부터 저장소를 검사해 의존성 업데이트 PR을 만들고, 필수 테스트가 통과하면 제한적으로 자동 병합까지 합니다. 다만 대상이 구조화된 영역에 한정됩니다. 무엇이 최신 버전인지는 기계가 판정할 수 있습니다.
GitHub Copilot cloud agent는 이슈를 배정받아 저장소를 조사하고 브랜치와 PR을 만들며, 일정이나 이벤트로 자동 실행하는 automation도 제공합니다. 업계 전체가 “사람이 과제를 지정하고, 에이전트가 격리된 변경 묶음으로 납품하며, 사람이 승인한다”는 형태로 수렴하고 있습니다.
이 실험이 다른 지점은 두 가지입니다. 첫째, 대상이 의미상 중복이나 충돌 원인처럼 판정 기준이 열린 문제라는 것. 둘째, 사람이 과제를 지정하지 않고 후보 발굴 자체를 상시 프로그램으로 만들었다는 것입니다.
생성 비용은 떨어져도 사람의 검토 시간은 자동으로 줄지 않습니다. 388개는 성과인 동시에 새로운 운영 부하입니다. 낮은 가치의 PR이 쌓이면 중요한 변경이 묻히고, 리뷰어가 자동 생성물을 습관적으로 승인하는 자동화 편향이 생깁니다. 게시물이 “병합을 간소화할 방법을 고민 중”이라고 쓴 것은 병목이 이미 생성에서 승인으로 옮겨갔다는 신호입니다.
같은 모델 계열이 코드를 쓰고 리뷰하면 같은 잘못된 가정을 공유할 수 있습니다. Code Review는 여러 에이전트를 병렬로 돌리고 검증 단계로 오탐을 걸러 이 문제를 부분적으로 완화하지만, 독립적인 정적 분석·보안 검사·사람의 도메인 판단을 대체하지는 않습니다.
리플렉션, 동적 import, 플러그인, 드문 기능 플래그, 외부 진입점은 정적 분석에서 도달 불가능하게 보입니다. 런타임 로깅도 관측 기간에 실행되지 않았다는 사실만 보여 줄 뿐, 영원히 필요 없음을 증명하지 못합니다. 분기·연말 배치, 재해 복구 경로가 대표적인 함정입니다.
“실패할 수 없는 테스트”는 무가치할 수도 있지만, API 사용 예시나 타입 보장, 과거 회귀 방지, 문서 역할을 할 수도 있습니다. 삭제 전에 그 테스트가 왜 생겼는지를 확인해야 합니다.
비슷한 구현이 의도적으로 분리돼 있을 수 있고, 새는 것처럼 보이는 추상화가 성능이나 호환성 때문에 필요할 수 있습니다. Dup unifier와 추상화 계열은 도메인 지식 없이 가장 쉽게 과잉 수정하는 영역입니다.
루틴은 실행 중 대화형 승인 없이 셸 명령과 포함된 커넥터의 쓰기 도구까지 사용할 수 있습니다. 공식 문서는 저장소·환경 변수·네트워크 접근·커넥터를 필요한 최소 범위로 줄이라고 안내하며, 환경 변수는 그 환경을 쓰는 모든 사람에게 보인다고 경고합니다. 기본 환경은 허용 목록 외 도메인을 차단합니다. API 트리거로 들어온 텍스트는 신뢰할 수 없는 데이터로 표시되어 전달되지만, 실행 중 가져온 이슈·로그·문서의 내용은 여전히 인젝션 경로입니다.
| 위험도 | 예 | 권장 처리 |
|---|---|---|
| 낮음 | 완전히 출시된 플래그 제거, 생성 코드 갱신 | 충분한 관찰 기간 후 제한적 자동 병합 검토 |
| 중간 | 확실한 중복 제거, 테스트 정리 | AI 리뷰 + 담당자 승인 |
| 높음 | 결제·권한·데이터 모델, 추상화 경계 변경 | 설계 검토와 복수 승인 |
이 사례를 “Claude가 개발자를 대신해 앱을 관리한다”로 요약하면 과장입니다. 더 정확한 표현은 이렇습니다.
Claude가 유지보수 후보 발굴자, 1차 조사자, 수정 PR 작성자 역할을 상시 수행하고, 자동 검증과 사람의 판단이 이를 통제하는 새로운 유지보수 운영 모델을 시험하고 있다.
그리고 이것이 성립하려면 에이전트보다 주변 시스템이 먼저 준비되어야 합니다. 실제 앱을 자동 실행할 수 있어야 하고, 실패를 안정적으로 재현할 수 있어야 하며, 완료 조건을 /verify·진리표·불변조건으로 표현할 수 있어야 하고, 변경이 작은 PR과 격리 브랜치에 머물러야 하며, 잘못된 결과가 다음 루틴 개선으로 이어져야 합니다.
이 모델이 퍼지면 개발 조직의 병목은 좋은 완료 조건을 설계하는 능력, 검증 인프라, 리뷰 처리량, 권한 통제, 그리고 자동화의 경제성을 판단하는 능력으로 이동할 가능성이 큽니다. 388이라는 숫자보다, 그 숫자를 만든 루틴을 고치는 루프가 이 실험의 진짜 결과물입니다.