인프라로서의 Claude Code
Andrej Karpathy는 LLM 에이전트 주변에 형성되는 것을 지칭하는 용어를 만들었습니다: 발톱(claws). 에이전트가 컨텍스트 윈도우 바깥 세계를 움켜쥘 수 있게 해주는 훅, 스크립트, 오케스트레이션을 의미합니다.1 대부분의 사람들은 Claude Code를 파일 접근이 가능한 채팅 상자 정도로 취급합니다. 프롬프트를 입력하고, 파일이 수정되는 것을 지켜보고, 다음으로 넘어갑니다. 이런 관점은 이 도구의 본질을 놓치고 있습니다.
Claude Code는 IDE 기능이 아닙니다. 인프라입니다. 그리고 이것을 전자로 취급하느냐 후자로 취급하느냐의 차이가 AI 지원 개발이 10% 생산성 향상에 머무를지, 근본적으로 다른 무언가로 도약할지를 결정합니다.
요약
Claude Code는 17개의 라이프사이클 이벤트를 노출하며, 각 이벤트는 모든 도구 호출 전, 중, 후에 실행되는 셸 스크립트로 연결할 수 있습니다.2 훅을 디스패처로 쌓고, 디스패처를 스킬로, 스킬을 에이전트로, 에이전트를 워크플로우로 쌓으면, 모델이 건너뛸 수 없는 제약 조건을 강제하는 프로그래밍 가능한 계층이 여러분과 모델 사이에 생깁니다. 저는 두 달에 걸쳐 84개의 훅, 48개의 스킬, 19개의 에이전트, 약 15,000줄의 오케스트레이션을 구축했습니다. 프레임워크 없음. 외부 의존성 없음. 전부 bash와 JSON입니다. 그 결과물은 제가 자는 동안 코드를 작성하고, 리뷰하고, 배포하는 자율 개발 시스템입니다. 이 글에서는 아키텍처, IDE 관점이 왜 사람들을 가로막는지, 그리고 Remote Control이 이 인프라를 어디서든 접근 가능하게 만든 지금 무엇이 변했는지를 설명합니다.
IDE 관점은 틀렸습니다
기본적인 멘탈 모델: Claude Code는 더 똑똑한 자동완성입니다. 터미널에 앉아서 작업을 지시하고, 출력을 감독합니다. 이 모델은 여러분이 직접 감독할 수 있는 범위만큼만 생산성을 제한합니다.
인프라 멘탈 모델: Claude Code는 LLM 커널을 가진 프로그래밍 가능한 런타임입니다. 모델이 수행하는 모든 동작은 여러분이 제어하는 훅을 통과합니다. 프롬프트가 아닌 정책을 정의합니다. 모델은 웹 서버가 nginx 규칙 안에서 작동하는 것과 같은 방식으로 여러분의 인프라 안에서 작동합니다. nginx에 앉아서 요청을 타이핑하는 사람은 없습니다. 설정하고, 배포하고, 모니터링합니다.
이 구분이 중요한 이유는 인프라는 복리로 쌓이기 때문입니다. bash 명령에서 자격 증명을 차단하는 훅은 모든 세션, 모든 에이전트, 모든 자율 실행을 보호합니다. 블로그 평가 기준을 인코딩한 스킬은 여러분이 호출하든 에이전트가 호출하든 일관되게 적용됩니다. 보안 코드 리뷰 에이전트는 여러분이 보고 있든 아니든 동일한 검사를 수행합니다.
Simon Willison은 현재 상황을 하나의 관찰로 정리합니다: 코드 작성이 이제 저렴해졌다.3 맞습니다. 하지만 아무도 듣고 싶어하지 않는 결론은 검증이 이제 비용이 큰 부분이라는 것입니다. 검증 인프라 없는 저렴한 코드는 버그를 대량으로 생산합니다. 수익을 내는 투자는 더 나은 프롬프트가 아닙니다. 모델이 놓치는 것을 잡아내는 모델 주변의 시스템입니다.
인프라 계층
Claude Code의 훅 시스템은 17개의 라이프사이클 이벤트에서 셸 명령을 실행합니다.2 PreToolUse는 도구 실행 전에 발생하며 차단할 수 있습니다. PostToolUse는 실행 후에 발생하며 피드백을 제공할 수 있습니다. UserPromptSubmit는 사용자가 입력할 때 발생하며 컨텍스트를 주입할 수 있습니다. Stop은 모델이 완료하려 할 때 발생하며 계속 작업하도록 강제할 수 있습니다. 각 이벤트는 세션 ID, 도구 이름, 도구 입력, 현재 작업 디렉토리 등 전체 컨텍스트가 포함된 JSON를 stdin으로 수신합니다.
훅 시스템은 플러그인 시스템이 아닙니다. 이벤트 기반 아키텍처입니다. 차이점: 플러그인은 도구의 기능을 확장합니다. 이벤트는 도구가 수행하는 모든 동작을 가로채고, 수정하고, 제어할 수 있게 합니다. 여러분이 미들웨어가 됩니다.
훅: 결정론적 계층
훅은 셸 스크립트입니다. 환각되거나, 달콤한 말로 우회되거나, 프롬프트 인젝션으로 회피될 수 없습니다. 모델이 rm -rf /를 실행하려 합니까? 10줄짜리 bash 스크립트가 명령을 차단 목록과 대조하고 셸이 보기도 전에 거부합니다. 모델이 .env를 읽으려 합니까? 파일 경로에 대한 정규식이 Read 도구 호출을 가로챕니다. 이 중 어떤 것도 모델의 협조가 필요하지 않습니다. 모델이 원하든 원하지 않든 훅은 실행됩니다.
저는 17개 이벤트 유형에 걸쳐 84개의 훅을 실행합니다. 그 비율이 이야기를 들려줍니다: 35개는 판단을 강제하고(게이트, 가드, 검증기) 49개는 자동화를 처리합니다(인젝터, 로거, 트래커). 이 비율은 처음에 1:6이었습니다. 자율 실행에서 문제가 발생한 두 달간 4:5로 바뀌었습니다. 모든 판단 훅은 그것 없이 무언가가 실패했기 때문에 존재합니다. 에이전트가 TODO 주석이 포함된 코드를 커밋했습니다. 에이전트가 파괴적인 git 명령을 실행했습니다. 에이전트가 자격 증명 경로를 로그 파일에 유출했습니다. 각 실패마다 게이트가 추가되었습니다.
가장 큰 교훈: 독립적인 훅보다 디스패처. UserPromptSubmit에서 7개의 훅이 각각 독립적으로 stdin을 읽고, 그 중 2개가 같은 JSON 상태 파일에 쓰고 있었습니다. 동시 쓰기가 JSON를 잘라냈습니다. 그 파일을 파싱하는 모든 다운스트림 훅이 깨졌습니다. 이벤트당 하나의 디스패처가 캐시된 stdin에서 훅을 순차적으로 실행하도록 변경하여 해결했습니다. 보이지 않는 오버헤드, 프롬프트당 200ms.
스킬: 지식 계층
스킬은 요청 시 또는 훅을 통해 활성화되는 마크다운 지시 세트입니다.4 각각은 호출 시 모델이 참조하는 도메인 전문성을 인코딩합니다. 제 blog-evaluator 스킬은 구체적인 점수 기준, 카테고리 최소 점수, 상호 의존성을 갖춘 6개 카테고리 가중치 평가 기준을 정의합니다. 제 jiro 스킬은 각 기준에 대한 구체적인 증거를 요구하는 에비던스 게이트가 포함된 7단계 품질 루프를 인코딩합니다.
스킬은 훅과 결합됩니다. 스킬은 프론트매터에 자체 훅을 정의할 수 있으며, 이는 해당 스킬이 실행되는 동안에만 활성화됩니다. 철학 스킬은 SessionStart 훅을 통해 자동 활성화되어, 명시적 호출 없이 모든 세션에 품질 제약 조건을 주입합니다.
48개의 스킬 범위: 코드 품질(jiro, testing-philosophy, debugging-philosophy), 콘텐츠(blog-writer-core, blog-evaluator, citation-verifier), 아키텍처(fastapi, swiftui, database, htmx-alpine), 운영(deploy, cache, analytics, security), 메타 오케스트레이션(deliberation, scan-intel, ralph). Claude Code 자체의 선호도에 대한 연구에 따르면 특정 프레임워크와 패턴에 끌리는 경향이 있습니다.9 스킬을 사용하면 이러한 기본값을 여러분의 것으로 재정의할 수 있습니다.
에이전트: 위임 계층
에이전트는 격리된 컨텍스트 윈도우를 가진 특수 서브에이전트입니다.5 각각은 집중된 작업과 새로운 컨텍스트를 받습니다. 제 코드 리뷰 시스템은 정확성, 보안, 관례의 세 에이전트를 병렬로 생성합니다. 각각 독립적으로 리뷰합니다. 리뷰어 간의 불일치는 단일 리뷰어가 놓칠 수 있는 바로 그 이슈를 드러냅니다.
핵심 제약: 재귀 가드. 모든 Task 도구 호출 전에 셸 스크립트가 실행되어 공유 상태 파일의 생성 깊이 카운터를 확인하고, 깊이가 임계값을 초과하면 호출을 차단합니다. 이것이 없으면 에이전트가 에이전트에게 위임하고 그 에이전트가 또 에이전트에게 위임하며, 각각 컨텍스트를 잃고 토큰을 소모합니다. 기본 제한은 3단계입니다. 실제로 유용한 작업은 깊이 1(메인 에이전트 플러스 서브에이전트 하나)에서 이루어집니다. 2보다 깊은 경우는 대개 작업 분해가 잘못되었다는 의미입니다.
19개 에이전트 범위: 개발(ios-developer, backend-architect), 리뷰(code-reviewer, security-reviewer, conventions-reviewer, yagni-reviewer), 탐색(project-scout, code-explorer, code-architect), 검증(test-runner, correctness-reviewer).
Remote Control이 판도를 바꿉니다
2026년 2월 25일, Anthropic는 Remote Control을 출시했습니다: 어떤 브라우저나 Claude 모바일 앱에서든 로컬 Claude Code 세션에 연결하는 기능입니다.6 이 기능은 Hacker News에서 531포인트와 313개의 댓글을 받았으며, 대부분 버그에 대한 불만이었습니다. 불만은 타당합니다. 그럼에도 이 기능은 혁신적입니다.
이유는 다음과 같습니다. Remote Control 이전에는 제가 설명한 인프라에 두 가지 모드만 있었습니다: 감독(터미널을 지켜봄) 또는 비감독(자리를 비우고 잘 되기를 바람). 둘 다 이상적이지 않습니다. 감독은 처리량을 제 집중 시간으로 제한합니다. 비감독은 모델이 아무도 잡지 못하는 잘못된 결정을 내릴 위험이 있습니다.
Remote Control은 세 번째 모드를 만듭니다: 비동기 거버넌스. 저는 여러 스토리의 PRD를 밤새 처리하는 자율 루프를 실행합니다. 외부 동작(git push, API 호출, 기기를 벗어나는 모든 것)에 대한 승인 프롬프트가 제 폰으로 전달됩니다. 어디서든 승인, 거부, 리디렉션할 수 있습니다. 거버넌스 계층은 동일하게 유지됩니다. “에이전트가 승인이 필요함”에서 “사람이 승인을 제공함” 사이의 지연 시간이 “노트북을 확인할 때까지”에서 “폰에서 10초”로 줄어듭니다.
승인 플로우는 훅의 영향 범위 분류와 복합적으로 작용합니다. 로컬 작업(파일 쓰기, 테스트 실행)은 자동 승인됩니다. 공유 작업(git 커밋)은 경고를 표시합니다. 외부 작업(푸시, API 호출, 배포)은 사람의 검토로 넘깁니다. Remote Control은 이 “넘기기” 경로를 블로킹 대기에서 비동기 알림으로 전환합니다. 에이전트는 이전 작업의 검토를 기다리는 동안 다음 스토리 작업을 계속합니다.
Agent Multiplexer 같은 도구는 이미 tmux를 통해 Claude Code 세션을 관리합니다.10 Emdash 같은 오픈소스 대안은 완전한 에이전틱 개발 환경을 제공합니다.11 SSH와 tmux를 대안으로 제안하는 사람들의 말은 터미널 접근에 대해서는 맞습니다. 하지만 이들 중 어떤 것도 승인 라우팅을 제공하지 않습니다. 비감독 운영을 단순히 가능하게 만드는 것이 아니라 안전하게 만드는 것은 바로 그 라우팅입니다.
비용은 아키텍처입니다
“CLI를 통해 MCP 비용 절감하기” 글(HN 304포인트)은 하나의 패턴을 문서화했습니다: MCP 서버 연결 유지 오버헤드를 피하기 위해 MCP 도구 호출을 CLI 호출로 감싸는 것입니다.7 더 넓은 통찰은 비용이 운영상의 사후 고려 사항이 아니라 아키텍처적 결정이라는 것입니다.
제 인프라는 세 가지 수준에서 비용을 처리합니다:
토큰 수준. 시스템 프롬프트 압축. 저는 CLAUDE.md 파일과 8개의 규칙 파일에 걸쳐 약 3,500 토큰의 시스템 프롬프트를 사용합니다. 수익률이 높은 삭감: 튜토리얼 코드 예제 제거(모델은 API를 이미 알고 있음), 파일 간 중복 규칙 통합, 설명을 제약 조건으로 대체. “민감한 경로와 일치하는 도구 호출 거부”는 자격 증명을 읽으면 안 되는 이유에 대한 15줄 설명과 같은 역할을 합니다. 원시 압축보다 의미 밀도.8
에이전트 수준. 긴 대화보다 새로운 스폰. 자율 실행의 각 스토리는 깨끗한 컨텍스트 윈도우를 가진 새 에이전트를 받습니다. 스폰 시점에 에이전트는 브리핑을 받습니다: 현재 git 상태, 이전 에이전트들이 완수한 것, 해야 할 일. 메모리가 아닌 브리핑. 모델은 명확한 브리핑을 30단계의 누적된 컨텍스트를 탐색하는 것보다 더 잘 실행합니다. 각 에이전트가 새로 시작하므로 컨텍스트가 비대해지지 않습니다. Geoffrey Huntley는 “The Ralph Loop”에서 유사한 패턴을 문서화하며, Sonnet으로 시간당 $10.42에 자율 개발을 실행했습니다.13 OpenSwarm 같은 멀티에이전트 오케스트레이터는 모델 에스컬레이션을 통한 작업자-리뷰어 파이프라인을 공식화합니다.14
아키텍처 수준. 작업이 상태 비저장인 경우 MCP보다 CLI 우선. 일회성 평가를 위한 claude --print 호출은 비용이 적고 연결 오버헤드가 없습니다. MCP 서버는 도구에 영속 상태나 스트리밍이 필요한 경우에 적합합니다. Context Mode는 반대 방향을 보여주었습니다: BM25 랭킹을 사용한 FTS5 인덱싱으로 315 KB의 MCP 출력을 5.4 KB로 압축했습니다.12 두 접근 방식 모두 서로 다른 방향에서 토큰 소비를 줄입니다. 제 스킬 호출 대부분은 일회성입니다. 프롬프트 캐싱 분석 결과 Claude Code CLI는 4,096 토큰 이상의 시스템 프롬프트를 기본으로 캐시합니다. 별도 설정이 필요 없습니다.
사례 연구: 84개의 훅이 실제로 어떻게 작동하는가
지난주 자율 실행에서 5개의 스토리가 포함된 PRD를 처리한 구체적인 세션 추적:
-
SessionStart실행. 디스패처가 주입: 현재 날짜, 프로젝트 감지, 철학적 제약 조건, 시스템 성능 확인, 비용 추적 초기화. 5개의 훅, 총 180ms. -
에이전트가 PRD를 읽고 첫 번째 스토리를 계획. 내부 프롬프트에서
UserPromptSubmit실행. 디스패처가 주입: 활성 프로젝트 컨텍스트, 세션 드리프트 베이스라인(이후 유사도 비교를 위한 첫 프롬프트의 Model2Vec 임베딩). 120ms. -
에이전트가
Bash를 호출하여 테스트 실행.PreToolUse:Bash실행. 디스패처 실행: 자격 증명 확인(명령에.env경로 없음), 샌드박스 검증(명령이 차단 목록에 없음), 프로젝트 감지. 90ms. 테스트 실행.PostToolUse:Bash실행: 활동 하트비트 기록, 베이스라인 대비 드리프트 확인(코사인 유사도 0.63, 0.30 임계값보다 충분히 높음). -
에이전트가
Write를 호출하여 파일 생성.PreToolUse:Write실행: 파일 범위 확인(이 경로가 프로젝트 디렉토리 내에 있는가?).PostToolUse:Write실행: 작성된 파일 린트 검사, 커밋 추적, 활동 하트비트. -
에이전트가 스토리를 완료.
Stop실행. 품질 게이트 훅이 확인: 에이전트가 각 기준에 대한 증거를 인용했는가? 모호한 표현(“should”, “probably”)을 사용했는가? diff에 TODO 주석이 있는가? 어떤 검사라도 실패하면 훅이exit 2를 반환하고 에이전트는 작업을 계속합니다. -
독립 검증: 새로운 에이전트가 이전 에이전트의 자체 보고를 신뢰하지 않고 테스트 스위트를 실행합니다.
-
세 개의 코드 리뷰 에이전트가 병렬로 생성됩니다. 각각 diff를 독립적으로 리뷰합니다. 결과가 병합됩니다. 어떤 리뷰어라도 CRITICAL 이슈를 지적하면 해당 스토리는 대기열로 돌아갑니다.
-
스토리 통과. 다음 스토리 로드. 5개 스토리 전체에 대해 이 사이클이 반복됩니다.
5개 스토리에 걸쳐 실행된 총 훅: 약 340회. 훅에 소요된 총 시간: 약 12초. 한 번의 야간 실행에서 3건의 자격 증명 유출, 1건의 파괴적 명령, 2건의 불완전한 구현을 방지한 보이지 않는 오버헤드입니다.
핵심 요점
Claude Code는 도구가 아니라 런타임입니다. 17개의 라이프사이클 이벤트가 프로그래밍 가능하게 만듭니다. 훅, 스킬, 에이전트가 명령어 세트입니다. 모델이 실행 엔진입니다. 여러분이 시스템 아키텍트입니다.
거버넌스는 자동화와 함께 확장됩니다. 제약 조건을 추가하는 모든 훅은 비감독 운영의 위험을 줄입니다. 판단 훅 대 자동화 훅의 비율이 안전 마진입니다. 제 비율은 4:5이며 계속 높아지고 있습니다.
인프라는 복리로 쌓이지만, 프롬프트는 그렇지 않습니다. 좋은 프롬프트는 하나의 상호작용을 개선합니다. 좋은 훅은 모든 상호작용을 개선합니다. 좋은 스킬은 그것을 호출하는 모든 에이전트를 개선합니다. 좋은 에이전트는 그것에 위임하는 모든 워크플로우를 개선합니다. 곱셈 효과를 내는 계층에 투자하세요.
Remote Control은 인프라를 이동 가능하게 만듭니다. 승인 라우팅은 “비감독”을 “비동기 감독”으로 전환합니다. 이 차이가 모델이 좋은 결정을 내리기를 바라는 것과 그렇게 하는지 확인하는 것의 차이입니다.
비용은 최적화가 아니라 아키텍처입니다. 새로운 에이전트 스폰, CLI 우선 호출, 시스템 프롬프트 압축, 프롬프트 캐싱은 복리로 쌓이는 구조적 결정입니다. 사후에 최적화하는 것은 처음부터 설계하는 것보다 비용이 더 듭니다.
프레임워크가 필요 없습니다. 84개의 훅, 48개의 스킬, 19개의 에이전트, 약 15,000줄의 오케스트레이션. 디렉토리 안의 bash 스크립트들. JSON 상태 파일들. 런타임 의존성 없음. 훅 하나만 채택할 수도 있고 전체 스택을 채택할 수도 있습니다. 인프라는 누군가의 프레임워크를 구현하는 것이 아니라 실제 문제를 해결하면서 유기적으로 성장합니다.
이 글은 AI 엔지니어링 시리즈의 일부입니다. 이전 글: 왜 내 AI 에이전트에는 품질 철학이 있는가. 함께 읽기: 열 개의 두뇌로 사고하기와 블라인드 저지.
-
Andrej Karpathy가 LLM 에이전트 위의 새로운 계층으로서의 “발톱(claws)”에 대해. HN 토론 (406포인트, 917개 댓글). ↩
-
Claude Code 훅 레퍼런스. Anthropic 문서. JSON 입출력, 매처 패턴, 세 가지 훅 유형(command, prompt, agent)을 갖춘 17개 라이프사이클 이벤트. ↩↩
-
Simon Willison, “코드 작성이 이제 저렴해졌다.” Agentic Engineering Patterns. HN 토론. ↩
-
Claude Code 스킬 레퍼런스. Anthropic 문서. 프론트매터 메타데이터, 허용 도구, 훅 정의를 갖춘 마크다운 지시 세트. ↩
-
Claude Code 서브에이전트 레퍼런스. Anthropic 문서. 격리된 컨텍스트, 워크트리 지원, 모델 선택을 갖춘 특수 서브에이전트. ↩
-
Claude Code Remote Control. Anthropic 문서. 어떤 기기에서든 로컬 세션 계속. HN 토론 (531포인트, 313개 댓글). ↩
-
“CLI를 통해 MCP 비용 절감하기.” thellimist의 블로그 글. HN 토론 (304포인트, 115개 댓글). ↩
-
“Claude.md 압축하기: 시스템 프롬프트 비대함 60-70% 줄이기.” jchilcher의 블로그 글. HN 토론 (24포인트, 9개 댓글). ↩
-
“Claude Code가 선택하는 것.” amplifying.ai의 연구. Claude Code의 도구 및 프레임워크 선호도 분석. HN 토론 (39포인트, 19개 댓글). ↩
-
Agent Multiplexer (amux). GitHub. tmux를 통한 Claude Code 세션 관리. HN 토론 (13포인트). ↩
-
Context Mode: 315 KB의 MCP 출력이 5.4 KB로. GitHub. BM25 랭킹을 사용한 FTS5 인덱싱. HN 토론 (77포인트, 23개 댓글). ↩
-
Geoffrey Huntley, “The Ralph Loop.” ghuntley.com/loop. Sonnet으로 시간당 $10.42에 자율 개발 실행. ↩
-
OpenSwarm: 멀티에이전트 Claude CLI 오케스트레이터. GitHub. 모델 에스컬레이션을 통한 작업자-리뷰어 파이프라인. HN 토론 (34포인트, 18개 댓글). ↩