실행을 시작하는 것
이벤트 인박스, 타이머
2026-11-13 · claude.com
상시 가동 에이전트 만들기
claude.com · 2026-11-13
상시 가동 에이전트는 기한 없이 돌아가면서, 여러 세션에 걸쳐 언제 어떻게 행동할지 스스로 정한다. 이 가이드는 상시 가동 에이전트의 핵심 기본 구성 요소와 그 요소들이 맞물리는 방식을 살펴본다.
읽기 전에
상시 가동 에이전트(always-on agent)는 실제로 '상시 가동'하지 않는다. 대부분의 시간을 토큰 하나 쓰지 않고 잠들어 있다가, 이벤트가 오면 깨어나 짧게 일한다. 이 한 번의 일을 실행(run)이라 부른다. 실행 안에서는 다른 에이전트와 같은 에이전트 루프가 돈다. 상시 가동처럼 보이게 만드는 것은 루프 바깥의 기본 구성 요소(primitive) 다섯 개, 곧 이벤트 인박스·타이머·메모리·권한·아웃박스다.
원문은 William Hu(Anthropic Applied AI)가 2026-11-13 Anthropic의 claude.com Resources에 올린 「Building always-on agents」다. 원문은 고객들이 이런 경험을 자기 제품에 넣는 방법을 묻기 시작했다는 데서 출발한다. 기존 에이전트를 더 능동적으로 바꾸려는 회사와 처음부터 만들려는 회사를 함께 든다.
끝없이 돌아가는 것처럼 보이는 에이전트를 만들려면, 평범한 에이전트 루프 바깥에 무엇을 두어야 하나?
원문은 다섯 요소가 세 가지를 정한다고 쓴다. 에이전트가 언제 깨어날지, 실행 사이에 무엇을 넘길지, 일의 결과가 어떻게 사용자에게 닿을지다. 깨우는 쪽은 이벤트 인박스와 타이머, 넘기는 쪽은 메모리, 내보내는 쪽은 아웃박스다. 권한은 사용자가 지켜보지 않는 실행이 혼자 해도 되는 일의 범위를 정한다. 원문은 권한을 위험이 가장 큰 자리로 꼽는다.
모든 실행은 인박스에 들어온 이벤트로 시작한다. 사용자 메시지, 웹훅, 만기된 타이머, 보류된 도구 호출에 대한 사용자의 답이 모두 이 입구로 들어온다. 실행 사이에 남는 것은 저장소에 쓴 것, 곧 인박스·타이머·아웃박스 테이블과 메모리, 세션 기록뿐이다.
원문 페이지가 표시하는 읽기 시간은 14분이다. 원문 본문은 영어 약 2,200단어에 그림 7장이다. 완독은 이 본문의 완역에 요약과 팩트체크를 더한 분량이다. 요약만 읽으면 Executive Summary와 팩트체크 두 블록이다.
Executive Summary
상시 가동 에이전트(always-on agent)는 대부분의 시간을 잠들어 있다가 이벤트가 올 때만 깨어나 일한다. 원문은 이 에이전트를 다른 에이전트와 같은 에이전트 루프 위에 세운다. 루프 바깥에는 기본 구성 요소(primitive) 다섯 개를 두른다. 이벤트 인박스, 타이머, 메모리, 권한, 아웃박스다. 깨어 있는 실행(run) 하나는 짧다. 실행이 끝없이 이어지는 주기가 사용자에게 에이전트가 늘 켜져 있다는 경험을 만든다.
원문은 Anthropic의 Applied AI 소속 William Hu가 2026-11-13 claude.com Resources › Articles(분류 Best practices, 제품 태그 Claude Platform)에 올린 「Building always-on agents」다. 감사의 말에는 Rodrigo Olivares와 Michael Segner가 기여자로 올라 있다. 글은 설계 지침이다. 메모리·컨텍스트·권한 대목마다 Anthropic 제품의 해당 기능을 예로 든다. 원문이 싣는 측정값은 모델 비용 비교 한 건이다. 구현 코드는 싣지 않는다.
원문 그림 7은 다섯 요소를 실행을 기준으로 세 무리로 나눈다.
실행을 시작하는 것
이벤트 인박스, 타이머
실행이 함께 쓰는 것
메모리, 권한
실행에서 나가는 것
아웃박스
신뢰도 B — 원문이 인용한 제품 기능과 비용 수치는 Anthropic 문서와 맞는다. 78% 절감의 원인, Claude Code defer의 적용 범위, 프롬프트 캐싱 절감의 조건은 원문보다 좁다. 판정 37건(의견 23건 별도)과 기호의 뜻은 팩트체크 블록에 있다.
원문은 상시 가동 에이전트를 상태를 지니고(stateful) 먼저 움직이는(proactive) 에이전트로 정의한다. 세션을 넘어 컨텍스트를 관리한다. 직접적인 감독 없이도 행동한다. 그 밑에서 도는 것은 다른 에이전트와 같은 핵심 루프다. 차이는 루프를 둘러싼 바깥 구조에 있다. 원문은 바깥 구조의 기본 구성 요소가 에이전트가 언제 깨어나는지, 실행 사이에 무엇이 이어지는지, 일의 결과가 어떻게 사용자에게 닿는지를 통제한다고 쓴다.
저자는 발행일(2026-11-13) 기준 몇 달 사이에 상시 가동 에이전트가 다시 늘었다고 쓴다. 그는 그 이유를 최근 모델의 발전에서 찾는다. 발전한 모델 덕분에 상시 가동 에이전트를 돌리기가 더 현실적이 됐다는 것이다. 근거로 드는 변화는 둘이다. 최신 모델이 사용자의 의도를 더 안정적으로 이해하고 언제 확인을 구할지 더 잘 안다는 것, 지능의 값이 내려가고 있다는 것이다.
원문은 비용 하락의 혜택을 장기 작업이 가장 크게 본다고 쓴다. 예로 든 수치는 장기 코딩 벤치마크 하나의 결과다. 원문은 이 벤치마크에서 Opus 5.5가 과제 하나를 해결하는 데 든 비용이 Opus 5보다 78% 적었다고 쓴다. 일반 작업 부하에서는 40% 적었다고 함께 적는다.
원문에 따르면 Anthropic의 고객들은 이런 경험을 자기 제품에 넣는 방법을 묻기 시작했다. 기존 에이전트를 더 먼저 움직이게 바꾸려는 회사가 있다. 처음부터 새로 만들려는 회사도 있다.
'상시 가동'은 사용자 경험을 묘사하는 말이다. 원문은 상시 가동 에이전트가 실제로 '상시 가동'하지 않는다고 쓴다. 에이전트가 깨어 일하는 한 구간을 원문은 실행이라 부른다. 실행은 이벤트를 받는 데서 시작한다. 에이전트는 맡은 일을 끝낸 뒤 무슨 일이 있었는지를 저장한다.
실행은 세션 안에서 돈다. 세션은 메시지와 도구 호출의 기록이다. 실행이 끝나면 에이전트는 다시 잠든다.

원문은 이벤트 출처가 에이전트를 직접 부르는 대신 이벤트를 인박스에 넣게 하라고 쓴다. 워커가 인박스에서 이벤트를 꺼낸다. 대부분의 AI 에이전트는 사용자가 메시지를 보낼 때만 돈다. 상시 가동 에이전트는 웹훅, 예약 작업, 백그라운드 작업 같은 여러 종류의 이벤트에 깨어난다.
출처마다 에이전트를 직접 부르게 하면 실패하는 경로가 생긴다. 원문이 드는 예는 둘이다. 동시에 도착한 이벤트 두 개가 서로 경쟁하는 실행을 띄울 수 있다. 크래시 한 번에 이벤트 하나가 통째로 사라질 수 있다.
가장 단순한 인박스는 세 부분으로 이루어진다.
인박스는 이벤트마다 상태를 기록한다. 출처가 붙인 고유 식별자로 중복 이벤트를 걸러 낼 수 있다. 원문은 관계형 데이터베이스가 인박스에 잘 맞는다고 쓴다. 이벤트 하나가 새 행 하나로 덧붙는다. 원문은 처음에는 사용자 한 명당 인박스 하나로 시작하라고 권한다. 병렬성이 더 필요하면 더 잘게 나눠도 된다.
새 이벤트가 오면 핸들러는 이벤트를 인박스에 쓴 뒤 워커를 깨운다. 워커는 대기 중인 이벤트를 읽어 실행을 시작한다. 사용자의 답장처럼 앞선 일을 잇는 이벤트는 기존 세션을 재개한다. 나머지 이벤트는 새 세션을 연다. 워커는 이벤트를 에이전트 루프에 넘긴 뒤 실행이 끝나기를 기다린다. 실행이 끝나면 해당 이벤트를 완료로 표시한다.
원문은 구현 세부가 까다로워질 수 있다고 보고 실무 지침 넷을 든다.
타이머는 인박스와 함께 상시 가동 에이전트가 먼저 움직이게 한다. 타이머는 후속 확인(follow-up)과 정기 일정(schedule)으로 나뉜다. 후속 확인은 에이전트가 스스로 정한 기한이다. 답장이 왔는지 확인하는 일이 예다. 정기 일정은 알려진 주기로 되풀이되는 작업이다. 매일 보내는 뉴스레터가 예다.
원문 그림 3은 후속 확인을 에이전트가, 정기 일정을 사용자가 정하는 것으로 그린다. 타이머는 인박스와 분리된 자기 내구성 저장소에 둔다. 보통 데이터베이스 표 하나를 더 쓴다. 원문은 인박스에 지금 처리할 수 있는 이벤트만 두라고 쓴다. 후속 확인과 정기 일정은 비슷한 스키마를 공유할 수 있다. 정기 일정은 반복 규칙을 하나 더 기록한다.
타이머는 스스로 실행을 시작하지 않는다. 스케줄러가 저장소를 일정한 간격으로 조회해 때가 된 타이머를 작동시킨다. 스케줄러는 보통 백그라운드 서비스다. 한 번 돌 때마다 스케줄러가 하는 일은 아래와 같다.
스케줄러는 직접 만들어도 된다. 내구성 실행 엔진(durable execution engine)을 써도 된다.
메모리는 서로 끊긴 실행 사이의 연속성을 맡는다. 상시 가동 에이전트는 여러 실행에 걸쳐 일하기 때문이다. 메모리도 인박스·타이머처럼 자기 저장소를 가져야 한다. 원문은 Anthropic 제품에서 메모리를 파일 디렉터리로 구현했다고 쓴다. 예로 Claude Code의 auto memory와 Messages API의 메모리 도구(memory tool)를 든다.
상시 가동 에이전트라면 이 디렉터리를 내구성 저장소에 연결한다. 보통 데이터베이스나 객체 저장소다. 메모리가 워커보다 오래 살아남게 하려는 배치다. 원문의 경험칙은 에이전트가 다시 찾아볼 수 없는 것만 메모리에 담는 것이다. 이슈 트래커처럼 다른 시스템에 이미 있는 정보는 그 위치를 가리키는 포인터만 저장한다.
원문이 저장 대상으로 꼽는 메모리는 네 종류다.
원문이 그림 4로 보이는 예시 구성은 instructions.md, index.md, reported.md를 매 실행이 시작될 때 읽는다. notes/ 폴더와 progress/ 폴더는 필요할 때 읽는다. 에이전트는 실행 중에 메모리에 쓴다.
위 네 종류는 실행 중에 저장하는 메모리다. 원문은 여기에 dreaming을 더할 수 있다고 쓴다. dreaming은 지난 세션을 돌아보며 메모리를 다듬는다. 낡은 항목을 바꿀 수 있다. 여러 실행에 걸쳐서만 드러나는 패턴도 찾는다. 원문은 자세한 내용을 Anthropic의 에이전트 메모리 글로 넘긴다.
매 실행은 같은 고정 부담(overhead)을 지고 시작한다. 에이전트는 일하기 전에 시스템 프롬프트, 도구 정의, 메모리 파일을 읽는다. 원문은 이 초기 컨텍스트를 작게 유지하라고 권한다. 비용을 낮추려면 프롬프트 캐싱을 쓰라고도 권한다.
새 세션은 고정 부담과 실행을 일으킨 이벤트만 들고 시작한다. 기존 세션은 앞선 실행들의 메시지와 도구 호출을 다시 불러온다. 원문은 세션이 너무 길어지면 오래된 메시지를 압축(compaction)하거나 새 세션을 열라고 쓴다. 두 방법 모두 세부를 잃는다. 원문은 남아야 하는 것을 일하는 도중에 메모리에 저장해 두라고 쓴다.
원문은 상시 가동 에이전트가 가장 큰 위험을 지는 곳으로 권한을 꼽는다. 실행은 사용자의 접근권을 쥐고 있다. 설계상 사람이 지켜보지 않는 상태로 돈다. 에이전트는 도구 호출마다 스스로 진행할지, 막을지, 승인을 기다릴지 정해야 한다. 원문은 권한의 구성 요소가 다른 에이전트가 쓰는 것과 같다고 쓴다.
보류된 도구 호출은 답을 기다리는 동안 에이전트를 막지 않는다. 원문이 그리는 흐름은 아래와 같다.
답을 기다리는 동안 워커는 다른 이벤트를 처리할 수 있다.
상시 가동 에이전트의 사용자는 결과와 약간의 세부만 받는다. 대부분의 AI 에이전트는 응답을 생성하는 대로 사용자에게 스트리밍한다. 사용자는 Claude가 문제를 추론하는 과정부터 도구 호출, 답 작성까지 따라 읽는다. 상시 가동 에이전트는 일 대부분을 백그라운드에서 한다. 단계별 과정 전체는 사용자에게 가지 않는다.
원문은 실행이 끝나는 방식을 셋으로 적는다.
원문은 상시 가동 에이전트 대부분이 메시지를 사용자에게 바로 전달하는 'send' 도구 하나로 충분하다고 쓴다. 정식 아웃박스는 에이전트의 메시지 속도를 조절하거나 에이전트가 오류에서 복구하게 하려 할 때만 필요하다.
정식 아웃박스는 나가는 메시지를 담는 별도 표로, 이벤트 인박스에 대응한다. 워커에 대응하는 것은 디스패처다. 보통 백그라운드 서비스인 디스패처는 대기 중인 메시지를 읽어 무엇을 전달할지 정한다. 고른 메시지를 사용자에게 보낸다. 보류된 도구 호출의 요청은 아웃박스를 거쳐 가도 된다. 인터페이스에 바로 보여 줘도 된다.
원문은 전달 다음 과제로 에이전트가 보내는 메시지 수의 조율을 든다. 너무 많이 보내는 에이전트는 시끄러워진다. 너무 적게 보내는 에이전트는 사용자가 알아야 할 일을 놓친다. 원문은 그 균형을 찾으려면 평가(evals)를 만들라고 권한다. 실무에서는 에이전트가 조용히 시작해 시간이 지나며 사용자의 주의를 더 얻어 가는 편이 낫다고 쓴다.
모든 실행은 인박스의 이벤트 하나로 시작한다. 원문이 그리는 실행 한 번은 다섯 요소를 아래 순서로 지난다.

이 연결이 주기를 이룬다. 실행은 나중에 에이전트를 다시 깨울 타이머를 걸 수 있다. 사용자가 메시지에 답하면 그 답이 인박스의 이벤트로 돌아온다. 실행 하나하나는 짧다. 주기는 끝없이 돈다. 원문은 이 끝없는 주기가 에이전트를 늘 켜져 있는 것처럼 느끼게 한다고 쓴다.
상시 가동 에이전트의 '상시'는 깨어 있는 시간의 길이가 아니라 잠든 에이전트를 다시 깨우는 길이 끊기지 않는 데서 나온다.
팩트체크
B
정합성 한줄평: 원문이 인용한 제품 기능과 비용 수치는 Anthropic의 문서·발표와 맞는다. 78% 절감의 원인 설명, Claude Code의 defer 적용 범위, 프롬프트 캐싱 절감의 조건은 원문보다 좁다.
등급 기준: A = 주장과 출처가 거의 그대로 맞다 · B = 사실은 맞고 어긋남이 해석·범위 수준이다 · C = 절차 사실은 맞지만 핵심 주장이 철회됐거나 근거가 없다 · D = 핵심 주장 다수가 출처와 어긋난다 · F = 출처 대부분이 주장과 반대다.
| 기호 | ✅ 사실 | 🟡 부분사실 | ⚠️ 불확실 | ❌ 거짓 | 의견 |
|---|---|---|---|---|---|
| 뜻 | 열어 본 출처의 문장이 주장과 맞는다 | 방향은 맞지만 범위·원인·조건이 어긋나거나 일부만 확인된다 | 공개 출처로 확인되지 않는다 | 출처가 주장과 어긋난다 | 저자의 설계 권고·판단이라 참거짓을 가리지 않는다 |
| 건수 | 30 | 5 | 2 | 0 | 23 |
원문은 Anthropic Applied AI의 William Hu가 2026-11-13 claude.com에 올린 설계 가이드다. 원문이 기대는 제품 사실은 모두 Anthropic 문서에 있다. Claude Code의 auto memory와 Messages API의 메모리 도구는 파일 디렉터리로 동작한다. 압축(compaction)과 auto mode의 분류기, 에이전트 밖 프록시가 자격 증명을 붙이는 배포 권장, Claude의 MCP Apps 지원도 문서와 맞는다. 78%와 40%라는 수치도 링크한 비용 문서와 Opus 5.5 발표(2026-09-22)에 그대로 있다.
어긋남은 세 곳이다. 78%는 SWE-bench Pro 하위 집합에서 해결 작업당 비용이 1.01달러에서 0.22달러로 준 값이다. 이 값에는 기본 effort 변경(high → medium)과 가격 인하가 함께 들어 있다. 비용 문서는 이 차이를 작업 길이로 설명하지 않는다. Claude Code의 defer는 PreToolUse 훅이 -p 비대화형 실행에서, 한 턴에 도구 호출이 하나일 때만 쓰는 결정값이다. 프롬프트 캐시는 최대 1시간 산다. 1시간 넘게 잠드는 에이전트는 실행마다 고정 부담을 캐시에 다시 쓴다.
"상시 가동 에이전트가 다시 늘었다"는 말과 "최신 모델이 언제 확인을 구할지 더 잘 안다"는 말은 Anthropic의 출시 기록과 발표 문구로만 받쳐진다. 업계 전체의 채택이나 판단력 향상을 잰 공개 자료는 없다.
🟡
지난 몇 달 사이 상시 가동 에이전트가 다시 늘었다
Anthropic 자기 제품의 출시 기록은 이 흐름과 맞는다. Claude Platform 릴리스 노트에 따르면 Claude Managed Agents가 2026-04-08 베타로 나왔다. 2026-06-09에는 cron 일정으로 세션을 돌리는 정기 배포(scheduled deployments)가 붙었다. 2026-11-12에는 Managed Agents 서비스 전체를 자기 인프라에서 돌리는 자체 호스팅판이 나왔다. Claude Code는 2.1.71(2026-03-06 배포)에서 정해진 간격으로 프롬프트를 다시 돌리는 /loop 명령을 더했다.
원문 '상시 가동 에이전트의 부활을 보고 있다' → 확인 'Anthropic 제품의 출시 기록만 있다'. 업계 전체의 사용량이나 채택률을 잰 공개 자료는 원문과 링크 어디에도 없다.
Claude Platform release notes · Claude Code CHANGELOG.md · @anthropic-ai/claude-code 배포 기록
✅
상시 가동 에이전트도 다른 에이전트와 같은 핵심 루프 위에서 돈다
원문이 링크한 Anthropic 「Building effective AI agents」(2024-12-19)의 정의와 맞는다. 그 글은 에이전트를 환경의 피드백을 보며 도구를 쓰는 LLM의 루프로 정의한다. 그 글은 상시 가동 형태를 따로 다루지 않는다. 이 링크가 받치는 것은 '같은 루프'라는 정의까지다.
⚠️
고객들이 이런 경험을 자기 제품에 넣는 법을 묻기 시작했다
Anthropic 안쪽의 관찰이라 공개 자료로 확인할 수 없다. 원문은 고객 수나 문의 건수를 적지 않는다.
🟡
최신 모델은 판단력이 좋아져 사용자 의도를 더 잘 이해한다
Anthropic 발표문이 같은 방향으로 쓰지만 판단력을 잰 숫자는 내지 않는다. Fable 5.2 발표(2026-11-09)는 이 모델이 강한 엔지니어링 판단력을 보이고 모호한 요청에서도 좋은 결과를 낸다고 적는다. 그 근거로 든 것은 초기 테스터 인용과 사례다. Opus 5.5 발표(2026-09-22)는 자동 행동 감사에서 가장 좋은 점수를 받았다고 적는다. 그 감사는 수천 개 모의 상황에서 바람직하지 않은 행동을 찾는 정렬 시험이다.
원문 '사용자 의도를 더 믿을 만하게 이해한다' → 확인 '발표문의 서술과 고객 인용은 있고 측정값은 없다'.
Introducing Claude Fable 5.2 and Claude Mythos 5.2 · Introducing Claude Opus 5.5
⚠️
최신 모델은 언제 사용자에게 확인을 구할지 더 잘 안다
확인 시점이 나아졌다는 Anthropic 공개 측정은 없다. 모델별 프롬프트 가이드는 이 행동을 effort와 시스템 프롬프트로 조정할 대상으로 다룬다. Sonnet 5.5 가이드는 low·medium effort의 긴 에이전트 작업에서 모델이 일을 끝내기 전에 확인을 구한다고 적는다. 스스로 답할 수 있는 질문을 하거나 여러 단계 작업의 한 단계 뒤에 멈추는 예를 든다.
Fable 5.2 가이드는 불필요한 중단을 줄이는 시스템 프롬프트 문구를 준다. Anthropic이 medium effort로 코딩 세션을 다시 돌려 보니, 이 문구를 넣자 이어 갈 수 있는 일을 남긴 채 끝난 세션이 약 절반으로 줄었다. 가이드는 이 문구를 쓰면 모델이 덜 물으므로 위험하거나 되돌릴 수 없는 작업에는 자체 확인 단계를 두라고 한다. 원문 '확인을 구할 때를 더 잘 안다' → 확인 '공개 문서는 개선 수치 없이 조정 방법만 준다'.
✅
지능의 값이 내려가고 있다
릴리스 노트의 가격표가 맞는다. Opus 5.5(2026-09-22 출시)는 백만 토큰당 입력 4달러, 출력 20달러다. 바로 앞 모델 Opus 5는 5달러, 25달러다. Fable 5.2(2026-11-09 출시)는 8달러, 40달러다. Fable 5.1은 10달러, 50달러다.
✅
한 장기 코딩 벤치마크에서 Opus 5.5의 해결 작업당 비용은 Opus 5보다 78% 적었다
원문이 링크한 「비용과 지능 최적화」 문서의 '모델 업그레이드' 절에 같은 수치가 있다. 벤치마크는 SWE-bench Pro에서 Anthropic 평가 환경에 맞춰 고른 하위 집합이고, Opus 5.5 비교는 문제 478개로 채점했다. 해결 작업당 비용은 Opus 5가 1.01달러, Opus 5.5가 0.22달러다(고객 청구 기준 정가). 해결률은 91.9%에서 92.8%로 거의 같다. 문서는 이 하위 집합의 점수를 공개 리더보드와 비교할 수 없다고 적는다.
SWE-bench Pro의 원 논문(Scale AI, 2025)은 제목에서 장기(long-horizon) 소프트웨어 엔지니어링 과제를 내세운다. 비교 대상 Opus 5(claude-opus-5)는 2026-07-24 출시된 모델 이름 그대로다.
✅
일반 워크로드에서는 Opus 5.5가 Opus 5보다 40% 쌌다
Opus 5.5 발표(2026-09-22)가 기본 설정에서 일반 워크로드 비용이 Opus 5보다 40% 적다고 적는다. 같은 발표에서 입출력 토큰 가격은 20%, 캐시 읽기 가격은 60% 내렸다. 비용 문서는 이 40%를 발표에서 가져온다. 문서의 비용 절감 수단 표는 같은 값을 '최대 40%'로 적는다.
🟡
긴 작업일수록 값 하락의 혜택이 가장 크다
문서는 78%와 40%의 차이를 작업 길이로 설명하지 않는다. 표의 비교는 각 모델의 기본 effort끼리다. Opus 5는 high, Opus 5.5는 medium이다. Opus 5의 토큰 가격으로 다시 계산하면 절감은 약 69%다. 문서는 이전 모델이 이미 대부분을 푸는 벤치마크에서는 시도당 비용이 절감을 좌우한다고 적는다. Opus 5.5와 Fable 5.1이 이 하위 집합을 대체로 포화시킨다고도 적는다.
원문 '긴 작업이 가장 큰 혜택을 본다' → 확인 '78%는 기본 effort 변경, 가격 인하, 거의 포화된 벤치마크가 겹친 값이다'.
✅
Claude Code의 auto memory는 파일 디렉터리로 구현돼 있다
Claude Code 문서가 그대로 적는다. 프로젝트마다 ~/.claude/projects/<project>/memory/ 디렉터리가 있다. 그 안에 MEMORY.md 색인과 메모리 하나당 주제 파일 하나가 있다. 세션을 시작할 때는 MEMORY.md의 앞 200줄 또는 25KB까지만 싣는다. 원문이 권하는 '색인만 싣고 세부 파일은 필요할 때 읽는' 구성과 같은 모양이다.
auto memory 자동 저장은 Claude Code 변경 기록의 2.1.59 항목에 처음 나온다. 이 버전의 npm 배포일은 2026-02-25다.
Claude가 프로젝트를 기억하는 방법 · Claude Code CHANGELOG.md · @anthropic-ai/claude-code 배포 기록
✅
Messages API의 메모리 도구도 파일 디렉터리로 구현돼 있다
메모리 도구 문서는 Claude가 메모리 파일 디렉터리에 정보를 저장하고 대화를 넘어 다시 찾는다고 적는다. 이 도구는 클라이언트 측에서 돈다. Claude는 view·create·str_replace·insert·delete·rename 파일 명령을 요청할 뿐이다. 실제 저장은 애플리케이션이 맡는다. /memories 경로는 핸들러가 사용자별 디렉터리나 데이터베이스 키 같은 실제 저장소에 연결하는 접두사다. 원문이 권하는 '디렉터리를 데이터베이스나 객체 저장소에 연결하는' 구성이 이 구조 위에 선다.
메모리 도구는 2025-09-29 베타로 나왔다. 2026-02-17부터는 베타 헤더 없이 쓴다.
✅
dreaming은 지난 세션을 돌아보며 메모리를 다듬고, 낡은 항목을 바꾸고, 여러 실행에 걸친 패턴을 찾는다
원문이 링크한 Anthropic 「The components of agent memory」(2026-11-06)가 같은 설명을 한다. 그 글은 dreaming을 로그를 되짚어 메모리의 실수를 고치고 새 노트를 만드는 과정으로 소개한다. 한 세션에서 쓴 노트는 그 세션의 맥락만 본다. dreaming은 여러 세션을 가로질러 공통 패턴을 찾고 반복된 실수를 고친다고 그 글은 적는다.
✅
(맥락) dreaming은 Claude Managed Agents의 Dreams 기능으로 나와 있다
원문은 dreaming을 기법으로만 소개하고 제품 이름을 대지 않는다. Claude Platform 릴리스 노트에 따르면 Claude Managed Agents의 Dreams가 2026-05-06 연구 프리뷰로 나왔다. dream 하나는 기존 메모리 저장소와 지난 세션 기록을 함께 읽는다. 결과로 중복을 합치고 낡은 항목을 바꾸고 새 통찰을 더한 메모리 저장소를 새로 낸다. 쓰려면 dreaming-2026-04-21 베타 헤더를 보내고 접근을 신청한다. 지원 모델에는 2026-10-01에 Opus 5.5가, 2026-11-09에 Fable 5.2가 들어갔다.
🟡
실행마다 들어가는 고정 부담은 프롬프트 캐싱으로 비용을 낮춘다
캐싱은 한 실행 안의 여러 턴에서 비용을 줄인다. 실행 사이 공백이 캐시 수명보다 길면 줄이지 못한다. 프롬프트 캐싱 문서에 따르면 캐시 수명은 기본 5분이고 캐시를 쓸 때마다 다시 늘어난다. 추가 비용을 내고 고를 수 있는 가장 긴 수명은 1시간이다.
캐시는 tools, system, messages 순서의 접두사를 덮는다. 캐시 읽기는 기본 입력 가격의 0.1배다. Opus 5.5·Sonnet 5.5는 0.05배, Fable 5.2는 0.025배다. 캐시 쓰기는 5분 수명이면 1.25배, 1시간 수명이면 2배다.
원문 '고정 부담을 캐싱으로 싸게 만든다' → 확인 '1시간 넘게 잠드는 상시 가동 에이전트는 실행마다 고정 부담을 캐시에 다시 쓴다'. 문서는 한 단계가 바뀌면 그 단계와 뒤 단계의 캐시가 모두 무효가 된다고 적는다. 메모리 파일을 시스템 프롬프트에 넣으면 메모리가 바뀐 실행마다 시스템과 메시지 캐시를 새로 쓴다.
✅
세션이 길어지면 오래된 메시지를 압축할 수 있다
압축 개요 문서는 압축을 대화의 오래된 턴을 Claude가 서버에서 쓴 요약으로 바꾸는 기능으로 설명한다. 요청할 때 압축하는 방식과, 입력 토큰이 정한 값에 이르면 API가 압축하는 방식이 있다. 둘 다 베타다. 서버 측 압축 API는 2026-02-05 베타로 처음 나왔다(Opus 4.6). 요청 시 압축은 2026-09-14에 나왔고 베타 헤더는 compact-2026-09-04다.
✅
압축도 새 세션도 세부를 잃는다
압축 문서도 요약이 내용을 잃는 경우를 전제한다. 기본 요약이 뒤 턴에 필요한 내용을 빼면 자체 요약 프롬프트를 쓰라고 안내한다. 최근 턴을 원문 그대로 남기는 선택지도 둔다. 새 세션은 원문의 정의대로 고정 부담과 이벤트만 들고 시작해서 이전 실행의 대화를 갖지 않는다.
메모리 도구 문서는 원문의 권고와 같은 결론을 적는다. 장시간 실행되는 에이전트에는 압축과 메모리를 함께 쓰라고 한다. 요약 뒤에도 남아야 할 정보는 메모리가 보존한다고 적는다.
✅
웹훅 공급자 같은 일부 소스는 느린 응답을 실패로 친다
GitHub는 웹훅을 보낸 뒤 10초 안에 2xx 응답을 받지 못하면 연결을 끊는다. 그 전송은 실패로 기록된다. GitHub 문서는 응답부터 보낸 뒤 본문을 큐에서 처리하라고 권한다. Stripe 문서도 복잡한 처리를 시작하기 전에 2xx부터 돌려주라고 적는다.
근거: Best practices for using webhooks · Receive Stripe events in your webhook endpoint
✅
(맥락) Slack Events API는 3초 안에 2xx 응답이 없으면 전송 실패로 보고 세 번 재시도한다
Slack은 응답이 3초를 넘기면 그 전송을 실패로 친다. 재시도는 거의 즉시, 1분 뒤, 5분 뒤 세 번이다. 재시도 요청에는 몇 번째 시도인지 적은 x-slack-retry-num 헤더가 붙는다. 핸들러가 늦으면 같은 이벤트가 최대 네 번 들어온다.
근거: The Events API
✅
(맥락) 같은 이벤트가 두 번 이상 올 수 있고, 공급자는 이벤트 ID로 중복을 거르라고 안내한다
Stripe는 웹훅 엔드포인트가 같은 이벤트를 두 번 이상 받을 수 있다고 적는다. 처리한 이벤트 ID를 기록해 두었다가 이미 기록된 이벤트를 건너뛰라고 권한다. GitHub는 재전송 때 X-GitHub-Delivery 헤더 값을 원래 전송과 같게 보낸다. 원문이 권하는 '소스의 고유 식별자로 중복 제거'는 이런 ID로 구현한다.
근거: Receive Stripe events in your webhook endpoint · Best practices for using webhooks
✅
스케줄러는 직접 만들 수도 있고 내구성 실행 엔진을 쓸 수도 있다
Temporal 문서는 타이머가 영속 저장된다고 적는다. 만료 시점에 워커나 Temporal 서비스가 내려가 있어도, 둘이 다시 올라오면 타이머를 기다리던 워크플로 코드가 이어서 실행된다. 기다리는 동안 워커는 추가 자원을 쓰지 않는다. 원문이 그리는 '저장소를 고정 주기로 훑는 스케줄러'를 엔진의 타이머가 대신 맡는다.
✅
권장 패턴은 에이전트 환경 밖의 프록시가 나가는 요청에 자격 증명을 넣는 것이다
Claude Code 문서 「Securely deploying AI agents」의 자격 증명 관리 절은 에이전트의 보안 경계 밖에서 프록시를 돌리라고 권한다. 에이전트는 자격 증명 없이 요청을 보낸다. 프록시가 자격 증명을 붙여 목적지로 넘긴다.
문서가 꼽는 이점은 네 가지다. 에이전트는 실제 자격 증명을 보지 못한다. 프록시가 허용 엔드포인트 목록을 강제한다. 프록시가 모든 요청을 기록한다. 자격 증명은 각 에이전트에 흩어지지 않고 한곳에 모인다.
✅
Claude Code의 auto mode는 분류기로 위험한 동작을 막고, Claude가 더 안전한 방법을 찾게 한다
Anthropic 엔지니어링 글(2026-03-25)은 auto mode가 승인 판단을 모델 기반 분류기에 맡긴다고 설명한다. 허용 목록에 있는 읽기 도구와 프로젝트 안 파일 편집은 분류기를 거치지 않는다. 그 밖의 동작, 곧 셸 명령·웹 요청·외부 도구 호출·하위 에이전트 생성·프로젝트 밖 파일 작업은 분류기가 실행 전에 검토한다. 분류기가 막으면 Claude는 멈춰서 입력을 기다리지 않고 더 안전한 경로를 찾는다. 한 세션에서 연속 3회 또는 누적 20회 막히면 사람에게 넘긴다.
✅
가장 중요한 결정에는 여전히 사용자 검토가 필요하다
Claude Code 권한 모드 문서는 auto mode가 권한 프롬프트를 줄일 뿐 안전을 보장하지 않는다고 적는다. 민감한 작업의 검토는 auto mode가 대신하지 않는다는 문장도 있다. 사용자가 정한 ask 규칙은 auto mode에서도 프롬프트를 띄운다.
-p로 도는 무인 실행에는 조건이 하나 붙는다. --permission-prompt-tool 없이 돌면 돌아갈 프롬프트가 없다. 반복 차단 한도(연속 3회, 누적 20회)에 닿으면 그 동작은 실행되지 않는다. Claude는 실행을 멈추지 않고 일을 계속한다.
🟡
Claude Code에서 훅은 도구 호출을 보류하고 사용자의 추가 입력을 기다릴 수 있다
문서가 defer를 결정값으로 받는다고 적은 훅은 PreToolUse 하나다. Claude Code는 -p 플래그를 쓴 비대화형 모드에서, 한 턴의 도구 호출이 하나일 때만 defer를 따른다. 대화형 세션과 도구 호출이 여럿인 턴에서는 Claude Code가 경고와 함께 defer를 무시한다. 답을 기다리는 주체는 Claude Code가 아니다. claude -p를 하위 프로세스로 띄운 Agent SDK 앱이나 자체 UI다.
원문: 'Claude Code에서 훅이 도구 호출을 보류한다' → 확인: PreToolUse 훅이 -p 비대화형 실행에서, 한 턴의 도구 호출이 하나일 때만 보류한다.
✅
호출이 보류되면 실행이 끝나고 세션은 호출 도중 상태로 저장된다
훅이 defer를 반환하면 도구는 실행되지 않는다. 턴은 stop_reason이 tool_deferred인 결과로 끝난다. 대기 중인 도구 호출은 트랜스크립트에 남는다. 결과의 deferred_tool_use 필드에 도구의 id·이름·입력이 담긴다. 대기 시간 제한과 재시도 한도는 없다. 세션은 보존 정리 기간(기본 30일)이 지나 삭제될 때까지 디스크에 남는다.
✅
사용자의 답이 오면 새 실행이 저장된 세션을 그 입력과 함께 재개한다
Claude Code에서 이 단계는 claude -p --resume <session-id>다. 재개하면 같은 도구 호출이 PreToolUse 훅을 다시 부른다. 훅이 사용자의 답을 updatedInput에 담아 allow를 반환하면 도구가 실행된다. Claude는 거기서 이어서 일한다. 답이 아직 없으면 훅은 defer를 다시 반환할 수 있다.
✅
(맥락) defer 결정은 Claude Code 2.1.89에서 PreToolUse 훅에 추가됐다
Claude Code 변경 기록의 2.1.89 항목은 PreToolUse 훅에 defer 권한 결정을 더했다고 적는다. 설명은 '헤드리스 세션이 도구 호출에서 멈췄다가 -p --resume으로 재개해 훅이 다시 판단한다'이다. npm 레지스트리 기록상 2.1.89는 2026-03-31(UTC)에 배포됐다. 원문 발행 7개월여 전이다. 2026-11에 배포된 2.1.319와 2.1.321에도 보류 호출의 재개와 결정 우선순위를 고친 항목이 있다.
근거: Claude Code CHANGELOG · npm 레지스트리 @anthropic-ai/claude-code
✅
승인 요청은 MCP Apps로 만든 대화형 카드로 보여 줄 수 있다
MCP Apps는 MCP 서버가 대화형 HTML 화면을 돌려주는 MCP 확장이다. 차트·폼·대시보드가 대화 안에 바로 그려진다. 앱은 샌드박스 iframe 안에서 돈다. MCP 도구 호출은 호스트를 거친다. 자체 제품에 이런 카드를 띄우려면 그 인터페이스가 MCP Apps 호스트여야 한다. MCP 문서는 그 방법으로 @mcp-ui/client 패키지와 SDK의 App Bridge 모듈 두 가지를 든다.
근거: MCP Apps
✅
(맥락) Claude는 2026-01-26부터 MCP Apps를 지원한다
Anthropic은 2026-01-26 claude.com 글에서 MCP Apps 기반 대화형 커넥터를 Claude에 들였다고 발표했다. 같은 글은 모바일·웹·데스크톱의 Free·Pro·Max·Ultra·Team·Enterprise 요금제와 Claude Cowork에서 쓸 수 있다고 적는다. MCP 문서의 지원 클라이언트 목록에도 Claude와 Claude Desktop이 있다.
✅
저자는 William Hu(Applied AI @ Anthropic)이고 발행일은 2026-11-13이다
영문 페이지의 구조화 데이터(JSON-LD BlogPosting)는 저자를 William Hu, 직함을 'Applied AI @ Anthropic', 발행일을 2026-11-13으로 적는다. article:published_time 메타 태그와 화면의 날짜 표기도 2026-11-13이다. 한국어 로캘 페이지의 구조화 데이터도 같은 값이다.
✅
감사 인사는 Rodrigo Olivares와 Michael Segner에게 돌린다
본문 끝 Acknowledgements 절이 필자를 William Hu로 적는다. 감사 대상은 Rodrigo Olivares와 Michael Segner 두 사람이다.
✅
(맥락) 한국어 로캘 페이지는 한국어 번역 없이 영문 제목·데크·본문을 대역으로 보여 준다
한국어 페이지의 html 요소는 lang="ko"다. 제목·데크를 담은 블록과 본문을 담은 블록, 두 곳에 lang="en"이 붙은 대역(standIn) 클래스가 있다. 그 안의 글은 영문 그대로다. 구조화 데이터의 inLanguage도 en이다. 한국어로 나오는 것은 사이트 메뉴, 글 머리의 카테고리·제품·날짜·읽기 소요 시간·공유 표지, '목차' 제목, 페이지 꼬리의 관련 아티클 목록이다. canonical 주소와 og:url은 영문 페이지를 가리킨다.
✅
(맥락) 한국어 페이지와 영문 페이지의 본문 문장은 글자 단위로 같다
두 페이지의 본문은 첫 문장부터 감사 인사까지 한 글자도 다르지 않다. 글의 제목 11개(h1 1개, h2 4개, h3 5개, h4 1개)도 같다. 서로 다른 제목은 페이지 꼬리의 '관련 아티클'과 'Related articles' 한 쌍이다.
근거: Building always-on agents 한국어 로캘 · Building always-on agents
✅
(맥락) 한국어 페이지의 문서 링크 7개는 /docs/ko/ 한국어 문서로, 영문 페이지는 /docs/en/으로 간다
본문 링크 11개 가운데 문서 링크 7개만 로캘이 다르다. 한국어 페이지는 platform.claude.com/docs/ko/와 code.claude.com/docs/ko/로 보낸다. 영문 페이지는 같은 경로의 /docs/en/으로 보낸다. anthropic.com 글 3개와 modelcontextprotocol.io 링크는 두 페이지가 같다.
✅
(맥락) 한국어 문서의 #credential-management 앵커는 영문과 같은 자격 증명 관리 절을 한국어로 연다
한국어 문서 「AI 에이전트 안전하게 배포하기」는 영문 문서의 한국어 번역이다. #credential-management 앵커가 '자격증명 관리' 절 제목에 붙어 있다. 그 절은 보안 경계 밖 프록시가 나가는 요청에 자격 증명을 넣는 패턴을 영문과 같은 순서로 권한다.
✅
(맥락) 한국어 문서의 #defer-a-tool-call-for-later 앵커는 영문과 같은 defer 절을 한국어로 연다
한국어 「Hooks 참조」의 #defer-a-tool-call-for-later 앵커는 '도구 호출을 나중으로 지연' 절에 붙어 있다. 그 절은 -p 비대화형·한 턴 한 호출이라는 제한과 재개 절차를 영문과 같은 순서로 싣는다. 영문 절의 버전 표기 2.1.246과 2.1.319도 한국어 절에 있다.
✅
(맥락) 한국어 페이지와 영문 페이지는 같은 그림 파일 7개를 쓴다
2026-11-14 기준 두 페이지는 그림 7개 모두 같은 주소의 파일을 쓴다. 대체 텍스트 7개도 같은 영문이다. 그림 5(컨텍스트 사용량 애니메이션)는 1200×675 크기, 15.8초 길이, 790프레임 GIF다.
근거: Building always-on agents 한국어 로캘 · Building always-on agents
아래 항목은 저자의 설계 권고와 판단이다. 참거짓을 판정하지 않는다.
| 원문 요지 | 관련 사실 |
|---|---|
| 상시 가동 에이전트는 상태를 유지하고 먼저 움직인다. 세션을 넘어 컨텍스트를 관리하고 직접 감독 없이 행동한다 | — |
| 상시 가동 에이전트와 다른 에이전트의 차이는 루프가 아니라 루프를 둘러싼 아키텍처와 기본 구성 요소에 있다 | — |
| 메모리는 인박스·타이머처럼 자기 저장소를 따로 가진다 | — |
| 메모리 디렉터리를 데이터베이스나 객체 저장소 같은 내구성 저장소에 대응시켜 워커보다 오래 남긴다 | 메모리 도구는 저장소를 앱이 고른다(메모리 절) |
| 메모리에는 다시 찾아볼 수 없는 것만 담고, 이슈 트래커처럼 다른 시스템에 있는 정보는 포인터로 남긴다 | — |
| 메모리는 사용자 지시·사용자 노트·지난 메시지·작업 진행의 네 가지이고, 노트와 진행은 실행 시작 때 인덱스만 싣는다 | auto memory도 MEMORY.md 인덱스와 주제별 파일로 나뉜다(메모리 절) |
| 실행마다 드는 고정 부담(시스템 프롬프트·도구 정의·메모리)을 가볍게 유지한다 | — |
| 새 세션은 고정 부담과 이벤트만으로 시작하고, 기존 세션은 앞선 실행의 메시지와 도구 호출을 다시 싣는다 | — |
| 압축이나 새 세션은 세부를 잃으니 남겨야 할 것은 그때그때 메모리에 저장한다 | 압축 문서도 요약이 뒤 턴에 필요한 세부를 놓칠 수 있다고 적는다(컨텍스트 창 절) |
| 대부분의 AI 에이전트는 사용자 메시지에만 실행되고, 상시 가동 에이전트는 웹훅·예약 작업·백그라운드 작업으로도 깨어난다 | — |
| 소스가 에이전트를 직접 부르면 동시 도착 이벤트가 실행끼리 경쟁하고 크래시가 이벤트를 잃는다 | 웹훅 공급자는 늦은 응답을 실패로 치고 재전송한다(이벤트 인박스 절) |
| 인박스는 내구성 목록(DB 테이블)·핸들러(HTTP 엔드포인트)·워커(백그라운드 서비스) 세 부분으로 시작한다 | — |
| 이벤트마다 상태를 추적하고 소스의 고유 식별자로 중복을 거른다. 관계형 DB에 한 행씩 쌓고, 사용자당 인박스 하나로 시작한다 | Stripe는 이벤트 ID 기록을, GitHub는 재전송에도 같은 X-GitHub-Delivery 값을 쓴다 |
| 핸들러는 가벼운 확인만 하고 프롬프트 인젝션 같은 깊은 검증은 실행 중에 한다 | GitHub 10초, Slack 3초 응답 기한 |
| 인박스가 기준 원본이다. 깨어난 워커는 인박스부터 읽어 죽은 워커의 이벤트를 다시 잡는다 | — |
| 인박스당 활성 워커는 하나다. 실행 중 새 이벤트는 다음 실행으로 미루거나, 현재 실행에 합치거나, 중단 후 다시 시작한다 | — |
| 대기 중인 이벤트는 한 실행으로 묶어 에이전트가 한 번만 답하게 한다 | — |
| 타이머는 인박스와 분리된 내구성 저장소에 두고, 스케줄러가 고정 주기로 훑어 후속 확인은 완료로, 정기 일정은 다음 시각으로 바꾼다 | Temporal 같은 엔진은 영속 타이머를 제공한다(타이머 절) |
| 권한은 상시 가동 에이전트의 위험이 가장 큰 곳이다 | — |
| 보류된 호출이 답을 기다리는 동안 워커는 다른 이벤트를 처리해 에이전트가 막히지 않는다 | Claude Code의 보류 호출은 대기 시간 제한이 없고 -p 프로세스는 턴을 끝내고 나온다 |
| 대부분은 사용자에게 바로 보내는 send 도구로 충분하다. 정식 아웃박스는 메시지 속도 조절이나 오류 복구가 필요할 때 둔다 | — |
| 보내는 메시지 양은 평가(evals)로 맞추고, 조용히 시작해 사용자의 주의를 차츰 얻는다 | — |
| 다섯 기본 구성 요소가 한 주기를 이룬다. 실행은 짧고 주기는 끝없이 이어진다 | — |
원본 (완역)
지난 몇 달 동안 우리는 상시 가동 에이전트(always-on agent)가 다시 부상하는 것을 지켜봤다.
상시 가동 에이전트는 상태를 유지하고(stateful) 능동적이다(proactive). 세션을 넘나들며 컨텍스트를 관리하고, 직접 감독하지 않아도 행동한다는 뜻이다. 그 밑바탕에서는 다른 에이전트와 같은 핵심 루프로 돌아간다. 다른 점은 그것을 둘러싼 아키텍처다. 이 아키텍처는 기본 구성 요소(primitive)로 짜여 있다. 이 요소들이 에이전트가 언제 깨어날지, 실행(run)과 실행 사이에 무엇이 이어질지, 작업 결과가 사용자에게 어떻게 닿을지를 제어한다.
이런 부상은 주로 최근의 모델 발전 덕분이다. 모델이 발전하면서 상시 가동 에이전트를 운영하는 일이 더 현실적이 되었다. 첫째, 최신 모델은 판단력이 더 좋다. 사용자의 의도를 이해하는 일과 언제 사용자에게 확인을 구할지 아는 일에서 더 믿을 만하다. 둘째, 지능이 싸지고 있다. 가장 큰 혜택을 보는 쪽은 장기 작업이다. 예를 들어 장기 코딩 벤치마크 하나에서 Opus 5.5는 해결한 작업당 비용이 Opus 5보다 78% 적었다. 일반적인 워크로드에서는 40% 적었다.
고객들은 이런 경험을 자사 제품에 어떻게 넣을 수 있는지 우리에게 묻기 시작했다. 어떤 회사는 기존 에이전트를 더 능동적으로 만들고 싶어 하고, 어떤 회사는 처음부터 새로 만들려 한다.
이 글은 상시 가동 에이전트를 떠받치는 기본 구성 요소를 하나씩 나누어 살펴보고, 그 요소들이 어떻게 맞물리는지 짚어 본다.
상시 가동 에이전트는 실제로 “상시 가동”하지 않는다. 이 말은 사용자 경험을 묘사할 뿐이다.
실제로 에이전트는 대부분의 시간을 잠든 채 보내다가 주기적으로 깨어나 일을 한다. 한 번 일하는 구간을 실행이라고 부른다. 실행에서 에이전트는 이벤트를 받고, 작업을 마친 뒤, 무슨 일이 있었는지에 관한 정보를 저장한다. 실행은 세션 안에서 일한다. 세션은 메시지와 도구 호출의 기록(transcript)이다. 실행이 끝나면 에이전트는 다시 잠들고, 이 주기가 끝없이 반복된다.

상시 가동 에이전트를 둘러싼 아키텍처에는 다섯 가지 핵심 기본 구성 요소가 있다. 이벤트 인박스, 타이머, 메모리, 권한, 아웃박스다. 하나씩 살펴보자.
대부분의 AI 에이전트는 사용자가 메시지를 보낼 때만 동작한다. 반면 상시 가동 에이전트는 웹훅, 예약 작업, 백그라운드 잡을 비롯한 여러 종류의 이벤트로 촉발될 수 있다.
솔깃한 방법 하나는 이벤트 소스마다 에이전트를 직접 호출하게 하는 것이다. 하지만 이 방법에는 실패 유형이 몇 가지 있다. 예를 들어 두 이벤트가 동시에 도착하면 서로 경합하는 실행이 시작될 수 있고, 크래시가 나면 이벤트 하나가 통째로 사라질 수 있다.
여기서 이벤트 인박스가 나선다. 모든 소스는 에이전트를 호출하는 대신 이벤트를 인박스로 보내고, 워커가 거기서 이벤트를 가져간다.
가장 단순한 형태는 다음 세 가지 요소로 이루어진다.
인박스는 이벤트마다 상태를 추적해야 한다. 이벤트는 소스가 붙인 고유 식별자를 기준으로 중복을 걸러 낼 수 있다. 인박스에는 관계형 데이터베이스가 잘 맞는다. 이벤트 하나를 새 행 하나로 덧붙이면 된다. 사용자당 인박스 하나로 시작하기를 권한다. 병렬성이 더 필요하면 더 잘게 나눌 수 있다.

새 이벤트가 들어오면 핸들러가 그 이벤트를 인박스에 쓰고 워커를 깨운다. 워커는 대기 중인 것을 모두 읽고 실행을 시작한다. 사용자의 답장처럼 이전 작업을 이어 가는 이벤트는 기존 세션을 재개하고, 나머지는 모두 새 세션을 시작한다.
그다음 워커는 이벤트를 에이전트 루프에 넘기고, 실행이 끝나기를 기다린 뒤, 해당 이벤트를 완료로 표시한다. 구현 세부는 까다로워질 수 있다. 몇 가지 모범 사례는 다음과 같다.
타이머는 이벤트 인박스와 함께 상시 가동 에이전트를 능동적으로 만든다. 타이머는 대체로 두 범주 중 하나에 속한다. 후속 확인(follow-up)과 정기 일정(schedule)이다. 후속 확인은 답장이 왔는지 확인하는 일처럼 에이전트가 스스로에게 정하는 기한이다. 반면 정기 일정은 매일 보내는 뉴스레터처럼 정해진 주기로 반복되는 작업이다.
타이머는 인박스와 분리된 자체 내구성 저장소에 둔다. 보통 또 하나의 데이터베이스 테이블이다. 인박스에는 바로 처리할 수 있는 이벤트만 있어야 한다. 후속 확인과 정기 일정은 비슷한 스키마를 공유할 수 있다. 다만 정기 일정은 반복 규칙도 추적해야 한다.

타이머는 혼자서 실행을 시작하지 않는다. 대신 스케줄러(보통 백그라운드 서비스)가 일정한 간격으로 저장소를 폴링하고, 기한이 된 것을 모두 발동시킨다. 스케줄러는 한 번 돌 때마다 다음 일을 한다.
스케줄러는 직접 서비스를 만들어도 되고 내구성 실행 엔진(durable execution engine)을 써도 된다.
상시 가동 에이전트는 서로 끊긴 수많은 실행에 걸쳐 일하고, 연속성을 유지하려고 메모리에 의존한다.
이벤트 인박스나 타이머와 마찬가지로 메모리에도 자체 저장소가 있어야 한다. Claude Code의 auto memory나 Messages API의 메모리 도구(memory tool) 같은 우리 제품에서는 메모리를 파일 디렉터리로 구현한다. 상시 가동 에이전트라면 이 디렉터리가 내구성 저장소에 대응해야 한다. 보통 데이터베이스나 객체 저장소다. 그래야 메모리가 워커보다 오래 살아남는다.
경험칙으로 보면, 메모리에는 에이전트가 다시 찾아볼 수 없는 것만 담아야 한다. 이슈 트래커처럼 다른 시스템에 이미 있는 정보라면 그 대신 포인터를 저장해야 한다. 상시 가동 에이전트가 저장해야 할 메모리의 종류는 다음과 같다.
아래 도식은 구성 예 하나를 보여 준다.

지금까지 설명한 것은 모두 실행 중에 저장하는 메모리다. 여기에 dreaming을 더할 수도 있다. dreaming은 지난 세션을 돌아보며 메모리를 추려 정리한다. dreaming은 낡은 항목을 교체하고, 여러 실행에 걸쳐서만 드러나는 패턴을 찾아낼 수 있다. 더 알고 싶다면 에이전트 메모리에 관한 우리 글이 이 내용을 더 자세히 다룬다.
에이전트는 일을 시작하기 전에 시스템 프롬프트, 도구 정의, 메모리 파일을 불러온다. 이 초기 컨텍스트라는 “고정 부담(overhead)”은 모든 실행에 들어간다. 그래서 이를 가볍게 유지하고 프롬프트 캐싱으로 비용을 낮추기를 권한다.
새 세션은 이 컨텍스트 고정 부담과 실행을 촉발한 이벤트만 가지고 시작한다. 반면 기존 세션은 앞선 실행들의 메시지와 도구 호출을 다시 불러온다.
세션이 너무 길어지면 오래된 메시지를 압축(compaction)하거나 새 세션을 시작할 수 있다. 두 방법 모두 세부 정보를 잃는다. 그러니 계속 남아야 하는 것은 작업하는 동안 그때그때 메모리에 저장해야 한다.

상시 가동 에이전트의 위험이 가장 크게 몰리는 곳이 권한이다. 실행은 사용자의 접근 권한을 쥐고 있고, 설계상 지켜보는 사람 없이 동작한다. 에이전트는 도구 호출마다 스스로 진행할지, 막을지, 승인을 기다릴지 정해야 한다.
권한을 이루는 요소는 다른 에이전트가 쓰는 것과 같다.
대부분의 AI 에이전트에서는 응답이 생성되는 대로 사용자에게 스트리밍된다. 그래서 사용자는 Claude가 문제를 추론하고, 도구를 호출하고, 답을 쓰는 과정을 따라갈 수 있다.
반면 상시 가동 에이전트는 일의 대부분을 백그라운드에서 한다. 사용자는 단계별 전 과정 대신 결과와 몇 가지 세부 사항을 받는다.

실행은 다음 세 가지 중 하나로 끝날 수 있다.
대부분의 상시 가동 에이전트는 메시지를 사용자에게 바로 전달하는 “전송(send)” 도구 하나로 충분하다. 정식 아웃박스는 에이전트가 보내는 메시지의 속도를 조절하고 싶거나, 에이전트가 오류에서 복구할 수 있게 하고 싶을 때만 필요하다.
아웃박스는 나가는 메시지를 담는 별도 테이블로, 이벤트 인박스에 대응한다. 워커에 대응하는 디스패처도 있다. 디스패처는 보통 백그라운드 서비스다. 디스패처는 대기 중인 메시지를 읽고, 무엇을 전달할지 정한 뒤, 그 메시지를 사용자에게 보낸다. 보류된 도구 호출에서 나온 요청은 아웃박스를 거칠 수도 있고 인터페이스에 바로 표시될 수도 있다.
전달 말고도, 에이전트가 메시지를 얼마나 보낼지 조정하는 일이 중요하다. 너무 많이 보내는 에이전트는 시끄러워지고, 너무 적게 보내는 에이전트는 사용자가 알아야 할 것을 놓친다. 적절한 균형을 찾으려면 평가(evals)를 만들기를 권한다. 실제로는 에이전트가 조용하게 시작해서 시간이 지나며 사용자의 관심을 더 얻어 가는 편이 낫다.
다섯 가지 기본 구성 요소는 다음과 같이 맞물린다.

모든 실행은 인박스의 이벤트에서 시작한다. 그 이벤트가 사용자 메시지든, 웹훅이든, 타이머든 마찬가지다. 워커가 이벤트를 집으면 실행을 개시하고, 새 세션이나 기존 세션에서 에이전트를 깨운다. 에이전트는 메모리를 읽어 기준선을 잡고, 권한 범위 안에서 행동한 뒤, 새로 알게 된 것으로 메모리를 갱신한다. 실행이 끝나면 에이전트는 아웃박스에 행 하나를 넣고, 디스패처가 그 메시지를 사용자에게 전달한다.
이것들이 모여 하나의 주기를 이룬다. 실행은 나중에 에이전트를 다시 깨울 타이머를 설정할 수 있고, 사용자가 메시지에 답하면 그 답은 인박스에 이벤트로 돌아온다. 실행 하나하나는 짧지만 주기는 끝없이 계속된다. 에이전트가 상시 가동하는 것처럼 느껴지게 만드는 것이 바로 이 점이다.
William Hu가 썼다. 기여해 준 Rodrigo Olivares와 Michael Segner에게 특별히 감사한다.
원본 링크·인용
저자 William Hu(Applied AI @ Anthropic) · 발행 2026-11-13 · Anthropic claude.com Resources › Articles · 카테고리 Best practices · 제품 태그 Claude Platform · 감사 Rodrigo Olivares, Michael Segner
기타
표의 왼쪽은 이 문서가 쓰는 낱말, 오른쪽은 원문 낱말이다.
| 이 문서 | 원문 |
|---|---|
| 상시 가동 에이전트 | always-on agent |
| 실행 | run |
| 세션 | session |
| 에이전트 루프 · 핵심 루프 | agent loop · core loop |
| 기본 구성 요소 | primitive |
| 이벤트 인박스(인박스) | event inbox (inbox) |
| 핸들러 · 워커 | handler · worker |
| 타이머 · 후속 확인 · 정기 일정 | timer · follow-up · schedule |
| 스케줄러 | scheduler |
| 내구성 저장소 · 내구성 실행 엔진 | durable store · durable execution engine |
| 메모리 · 메모리 도구 | memory · memory tool |
| 컨텍스트 창 · 고정 부담 | context window · overhead |
| 프롬프트 캐싱 · 압축 | prompt caching · compaction |
| 권한 · 자격 증명 저장소 · 프록시 | permissions · credential store · proxy |
| 보류된 도구 호출 · 보류하다 | deferred tool call · defer |
| 아웃박스 · 디스패처 | outbox · dispatcher |
| 평가 | evals |
auto memory, auto mode, dreaming, MCP Apps는 기능 이름이라 원문 그대로 쓴다. Messages API, Claude Code, Opus 5.5, Opus 5 같은 제품·모델 이름도 옮기지 않는다.
claude.com 한국어 페이지(/ko/)는 이 글을 번역하지 않고 영문 본문을 그대로 싣는다. 제목과 데크도 영문이다. 이 문서의 완역은 그 영문 본문을 옮긴 것이다. 한국어 페이지와 영문 페이지의 본문 텍스트는 글자 단위로 같다. 두 페이지의 차이는 둘이다.
그림 7장은 두 페이지가 같은 파일을 쓴다. 그림 7장의 대체 텍스트(alt)도 두 페이지가 같은 영문이다. 그림 안의 라벨은 원문 그대로 영어다.
원문 본문, 그림 7장, 링크 20개를 모두 싣는다. 본문 링크 11개는 완역의 같은 자리에 있다. 목차 앵커 4개, 카테고리 링크 1개, 관련 아티클 4개를 포함한 링크 20개 전부는 원본 링크·인용 블록에 모았다. 원문 페이지의 공유 버튼과 관련 아티클 안내 문구는 옮기지 않는다.