31| 변수 | 설명 |31| 변수 | 설명 |
32| :- | :- |32| :- | :- |
33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 세션 JWT이며, `sk-ant-cc-` 접두사가 붙습니다. `act` 클레임은 세션 작성자를 식별하며, 작성 사용 환경이 기록한 경우 작성자의 이메일을 포함합니다. 값은 생성 시점의 토큰입니다. 새로고침은 자식의 stdin을 통해 도착하므로 래퍼는 초기 값만 봅니다. [세션 ID 확인](/docs/ko/self-hosted-environments-identity)을 참조하세요. |33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 세션 JWT이며, `sk-ant-cc-` 접두사가 붙습니다. `act` 클레임은 세션 작성자를 식별하며, 작성 사용 환경이 기록한 경우 작성자의 이메일을 포함합니다. 값은 생성 시점의 토큰입니다. 새로고침은 자식의 stdin을 통해 도착하므로 래퍼는 초기 값만 봅니다. [세션 ID 확인](/docs/ko/self-hosted-environments-identity)을 참조하세요. |
34| `CCR_SESSION_ACCOUNT_EMAIL` | 세션 작성자의 이메일이며, 서명 검증 없이 러너에 의해 토큰의 `act.email` 클레임에서 미리 추출됩니다. 커밋 트레일러와 같은 레이블 지정에 적합합니다. 이메일이 자격 증명 발급을 제어할 때는 토큰을 확인하고 [세션 작성자로 범위가 지정된 자격 증명 프로비저닝](#provision-credentials-scoped-to-the-session-creator)에 설명된 대로 클레임을 읽으세요. 토큰이 작성자 이메일을 전달하지 않으면 설정되지 않습니다. 개인 식별 정보로 취급하세요. |34| `CCR_SESSION_ACCOUNT_EMAIL` | 세션 작성자의 이메일이며, 서명 검증 없이 러너에 의해 토큰의 `act.email` 클레임에서 미리 추출됩니다. 커밋 트레일러와 같은 레이블 지정에 적합합니다. 이메일이 자격 증명 발급을 제어할 때는 대신 토큰을 확인하고 토큰에서 클레임을 읽으세요. [세션 작성자로 범위가 지정된 자격 증명 프로비저닝](#provision-credentials-scoped-to-the-session-creator)을 참조하세요. 토큰이 작성자 이메일을 전달하지 않으면(예: 조직의 서비스 ID가 생성한 세션) 설정되지 않습니다. 개인 식별 정보로 취급하세요. |
35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 세션을 생성한 클라이언트 사용 환경(예: `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli`, `scheduled_trigger`)입니다. Anthropic은 세션 생성 시 값을 한 번 기록하므로 래퍼와 모든 라이프사이클 훅이 동일한 값을 봅니다. 채택 분석 및 레이블 지정에만 사용하고 인증 신호로는 사용하지 마세요. 세션에 기록되거나 인식된 사용 환경이 없으면 설정되지 않으므로 `set -u` 아래에서 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}`로 참조하세요. Claude Code v2.1.229 이상이 필요합니다. |35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 세션을 생성한 클라이언트 사용 환경(예: `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli`, `scheduled_trigger`)입니다. Anthropic은 세션 생성 시 값을 한 번 기록하므로 래퍼와 모든 라이프사이클 훅이 동일한 값을 봅니다. 채택 분석 및 레이블 지정에만 사용하고 인증 신호로는 사용하지 마세요. 세션에 기록되거나 인식된 사용 환경이 없으면 설정되지 않습니다. Claude Code v2.1.229 이상이 필요합니다. |
36| `CLAUDE_RUNNER_CLAUDE_BIN` | 러너 자체의 Claude Code 바이너리에 대한 절대 경로입니다. 설치 경로를 하드코딩하지 않고 고정된 바이너리로 제어를 전달하려면 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`로 래퍼를 종료하세요. |36| `CLAUDE_RUNNER_CLAUDE_BIN` | 러너 자체의 Claude Code 바이너리에 대한 절대 경로입니다. 설치 경로를 하드코딩하지 않고 고정된 바이너리로 제어를 전달하려면 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`로 래퍼를 종료하세요. |
37| `CLAUDE_CODE_REMOTE_SESSION_ID` | 태그가 지정된 `cse_...` 형식의 세션 ID입니다. 이는 [라이프사이클 훅](#lifecycle-hooks)이 `session_...` 형식의 `CLAUDE_RUNNER_SESSION_ID`로 보는 동일한 세션입니다. UUID 변수는 두 형식 모두에서 일치하며, `cse_` 접두사를 `session_`으로 대체하면 세션 URL에 표시되는 ID가 됩니다. |37| `CLAUDE_CODE_REMOTE_SESSION_ID` | 태그가 지정된 `cse_...` 형식의 세션 ID입니다. 이는 [라이프사이클 훅](#lifecycle-hooks)이 `session_...` 형식의 `CLAUDE_RUNNER_SESSION_ID`로 보는 동일한 세션입니다. UUID 변수는 두 형식 모두에서 일치하며, `cse_` 접두사를 `session_`으로 대체하면 세션 URL에 표시되는 ID가 됩니다. |
38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 정규 UUID 형식의 동일한 세션 ID이며, UUID를 키로 사용하는 시스템용입니다. |38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | 정규 UUID 형식의 동일한 세션 ID이며, UUID를 키로 사용하는 시스템용입니다. |
39| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | 하나의 Slack 스레드에 속한 [Claude Tag](https://claude.com/docs/claude-tag/overview) 세션의 경우 해당 스레드의 링크입니다. 다른 세션에서는 설정되지 않으며, 스레드 세션에서도 설정되지 않을 수 있습니다. |
40| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | 하나의 Slack 스레드에 속한 Claude Tag 세션의 경우 해당 스레드의 Slack 타임스탬프(예: `1700000000.000100`)입니다. 설정되지 않을 수 있으며, `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL`이 설정되지 않은 경우에도 설정될 수 있으므로 각 변수를 개별적으로 확인하세요. |
39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 현재 세션 JWT를 보유하는 세션별 파일의 절대 경로이며, 토큰 새로고침 전체에서 최신 상태로 유지됩니다. 셸 서브프로세스는 사용자가 세션에 추가한 첨부 파일을 다운로드할 때 `Authorization` 헤더에 대해 이를 읽습니다. `exec`는 변수를 자동으로 보존합니다. 자식의 환경을 다시 빌드하는 래퍼는 변수를 전달해야 하거나 첨부 파일 다운로드가 자동으로 중지됩니다. |41| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | 현재 세션 JWT를 보유하는 세션별 파일의 절대 경로이며, 토큰 새로고침 전체에서 최신 상태로 유지됩니다. 셸 서브프로세스는 사용자가 세션에 추가한 첨부 파일을 다운로드할 때 `Authorization` 헤더에 대해 이를 읽습니다. `exec`는 변수를 자동으로 보존합니다. 자식의 환경을 다시 빌드하는 래퍼는 변수를 전달해야 하거나 첨부 파일 다운로드가 자동으로 중지됩니다. |
40| `CLAUDE_CONFIG_DIR` | 세션별 Claude 구성 디렉토리이며, 러너가 시작 시 캡처한 러너 호스트 구성의 스냅샷에서 세션 시작 시 작성됩니다. [권한 및 도구 승인](#permissions-and-tool-approval)을 참조하세요. 여기에 대한 쓰기는 이 세션으로 격리됩니다. 디렉토리는 [`--remove-session-state`](/docs/ko/self-hosted-environments-reference#runner-cli-flags)로 러너를 시작하지 않는 한 세션이 끝난 후 `<base-dir>/_sessions/` 아래에 유지됩니다. [사전 준비된 체크아웃 재사용](/docs/ko/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)을 참조하세요. |42| `CLAUDE_CONFIG_DIR` | 세션별 Claude 구성 디렉토리이며, 러너가 시작 시 캡처한 러너 호스트 구성의 스냅샷에서 세션 시작 시 작성됩니다. [권한 및 도구 승인](#permissions-and-tool-approval)을 참조하세요. 여기에 대한 쓰기는 이 세션으로 격리됩니다. 디렉토리는 [`--remove-session-state`](/docs/ko/self-hosted-environments-reference#runner-cli-flags)로 러너를 시작하지 않는 한 세션이 끝난 후 `<base-dir>/_sessions/` 아래에 유지됩니다. [사전 준비된 체크아웃 재사용](/docs/ko/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout)을 참조하세요. |
41| `ANTHROPIC_BASE_URL` | 자식이 사용할 API 기본 URL이며, 제어 평면에서 세션별로 전달되고 일반적으로 `https://api.anthropic.com`입니다. 이를 재정의하지 마세요. 세션의 추론 자격 증명은 Anthropic에서 발급한 OAuth 토큰이며 다른 공급자는 이를 수락하지 않습니다. |43| `ANTHROPIC_BASE_URL` | 자식이 사용할 API 기본 URL이며, 제어 평면에서 세션별로 전달되고 일반적으로 `https://api.anthropic.com`입니다. 이를 재정의하지 마세요. 세션의 추론 자격 증명은 Anthropic에서 발급한 OAuth 토큰이며 다른 공급자는 이를 수락하지 않습니다. |
43 45
44래퍼는 또한 서버 제공 환경 변수를 포함한 자식의 관리되는 환경의 나머지를 상속합니다. `exec`는 모두 자동으로 전파합니다. 래퍼가 자식을 다른 방식으로 생성하면 전체 환경을 전달하세요.46래퍼는 또한 서버 제공 환경 변수를 포함한 자식의 관리되는 환경의 나머지를 상속합니다. `exec`는 모두 자동으로 전파합니다. 래퍼가 자식을 다른 방식으로 생성하면 전체 환경을 전달하세요.
45 47
48`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` 및 `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS`는 래퍼 또는 [`command` 훅](#command)에 전달됩니다. 셸 명령, git 훅, Claude Code 훅 등 세션이 실행하는 항목에도 전달됩니다. `checkout`, `post-session`, `spawn-runner` 훅은 이를 받지 않습니다.
49
50<h3 id="give-a-default-to-variables-that-can-be-unset">
51 설정되지 않을 수 있는 변수에 기본값 지정
52</h3>
53
54`CCR_SESSION_ACCOUNT_EMAIL`, `CLAUDE_RUNNER_CLIENT_PLATFORM`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS`는 각각 설정되지 않을 수 있습니다. 스크립트가 `set -u`를 사용하는 경우 설정되지 않은 변수를 확장하면 Bash가 `unbound variable`로 중지되므로, `${CCR_SESSION_ACCOUNT_EMAIL:-}`와 같이 기본값을 지정하여 확장하세요.
55
56셸이 Slack 스레드 링크를 확장하는 모든 곳에서 다음 사항에 주의하세요:
57
58* **따옴표로 묶기**: 링크에는 `?` 및 `&`와 같이 셸이 해석하는 문자가 포함될 수 있으므로 `"${CLAUDE_CODE_REMOTE_SLACK_THREAD_URL:-}"`와 같이 변수를 따옴표로 묶으세요.
59* **값을 `eval` 및 `sh -c` 문자열에 넣지 않기**: 따옴표 안이라도 `eval` 또는 `sh -c`가 실행하는 문자열에 값을 치환하지 마세요. 대신 해당 문자열이 변수를 참조하도록 하세요.
60
46<h3 id="keep-stdin-and-file-descriptor-3-attached">61<h3 id="keep-stdin-and-file-descriptor-3-attached">
47 stdin 및 파일 디스크립터 3을 연결된 상태로 유지62 stdin 및 파일 디스크립터 3을 연결된 상태로 유지
48</h3>63</h3>
49 64
50자식의 stdin은 러너의 제어 채널입니다. 토큰 회전 및 세션 종료 신호가 이를 통해 도착합니다. 러너는 또한 파일 디스크립터 3에서 파이프를 열고 자식의 활동 신호를 읽어 유휴 및 시작 타임아웃을 구동합니다. 일반 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`는 둘 다 자동으로 보존합니다.65자식의 stdin은 러너의 제어 채널입니다. 토큰 회전 및 세션 종료 신호가 이를 통해 도착합니다. 러너는 또한 파일 디스크립터 3에서 파이프를 열고 자식의 활동 신호를 읽어 유휴 및 시작 타임아웃을 구동합니다. 일반 `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"`는 둘 다 자동으로 보존합니다.
51 66
52래퍼가 맨 `&`로 자식을 백그라운드에 두면 자식의 stdin이 끊깁니다. 세션은 초기 OAuth 토큰의 약 30분 수명이 만료될 때까지 정상으로 보이다가 모든 API 호출이 `401 authentication_error`로 실패합니다. 래퍼가 자식을 백그라운드에 두어야 하는 경우(예: 정리 트랩을 살리기 위해) stdin을 파일 디스크립터 4 이상에 저장하고 명시적으로 다시 연결하세요:67래퍼가 맨 `&`로 자식을 백그라운드에 두면 자식의 stdin이 끊깁니다. 세션은 초기 OAuth 토큰의 약 30분 수명이 만료될 때까지 정상으로 보이다가 해당 토큰을 사용하는 모든 API 호출이 `401 authentication_error`로 실패합니다. 래퍼가 자식을 백그라운드에 두어야 하는 경우(예: 정리 트랩을 살리기 위해) stdin을 파일 디스크립터 4 이상에 저장하고 명시적으로 다시 연결하세요:
53 68
54```bash theme={null}69```bash theme={null}
55exec 4<&070exec 4<&0
59wait "$CHILD"74wait "$CHILD"
60```75```
61 76
62래퍼에서 파일 디스크립터 3을 닫거나 재사용하지 마세요. 자식의 stdout 및 stderr 리디렉션은 괜찮습니다.77자식의 stdout은 리디렉션해도 됩니다. 파일 디스크립터 3과 stderr는 러너에 연결된 상태로 유지하세요:
78
79* **파일 디스크립터 3**: 자식의 활동 신호를 러너에 전달합니다. 래퍼에서 이를 닫거나 재사용하지 마세요.
80* **stderr**: 래퍼 또는 자식이 0이 아닌 값으로 종료되면 러너는 stderr의 마지막 줄을 세션에 게시하고 자체 로그에 출력합니다. 세션 사용자가 해당 줄을 보게 되므로 stderr에 비밀을 출력하지 말고, 래퍼를 배포하기 전에 `set -x`를 제거하세요. stderr를 리디렉션해도 세션은 계속 실행되지만, 러너는 종료 코드만으로 실패를 보고합니다.
63 81
64<h3 id="pass-the-system-prompt-flags-through">82<h3 id="pass-the-system-prompt-flags-through">
65 시스템 프롬프트 플래그 전달83 시스템 프롬프트 플래그 전달
108 checkout126 checkout
109</h3>127</h3>
110 128
111저장소당 한 번 실행되며, 러너의 기본 제공 복제 및 페치 대신 실행됩니다. 훅을 사용하여 리드스루 미러에서 복제하거나, 아카이브에서 작업 트리를 시드하거나, 세션별 git 인증을 적용하세요. 러너는 다음 변수를 설정하며, 표에 나열되지 않은 다른 `CLAUDE_RUNNER_` 변수를 설정할 수도 있습니다:129저장소당 한 번 실행되며, 러너의 기본 제공 복제 및 페치 대신 실행됩니다. 훅을 사용하여 HTTPS 또는 SSH로 접근하는 리드스루 미러에서 복제하거나, 아카이브에서 작업 트리를 시드하거나, 세션별 git 인증을 적용하세요. 러너는 다음 변수를 설정하며, 표에 나열되지 않은 다른 `CLAUDE_RUNNER_` 변수를 설정할 수도 있습니다:
112 130
113| 변수 | 설명 |131| 변수 | 설명 |
114| :- | :- |132| :- | :- |
115| `CLAUDE_RUNNER_REPO_URL` | 복제할 저장소 URL이며, `--git-host-rewrite` 및 `--git-ssh-rewrite`가 적용된 후입니다. |133| `CLAUDE_RUNNER_REPO_URL` | 복제할 저장소 URL이며, `--git-host-rewrite` 및 `--git-ssh-rewrite`가 적용된 후입니다. |
116| `CLAUDE_RUNNER_REPO_REF` | 체크아웃할 리비전: 세션이 요청한 대로 분기, 태그 또는 커밋 SHA입니다. 비어 있으면 저장소의 기본 분기를 의미합니다. |134| `CLAUDE_RUNNER_REPO_REF` | 체크아웃할 리비전으로, 세션이 요청한 그대로입니다: 브랜치, 태그, 커밋 SHA 또는 `refs/pull/<number>/head`와 같은 전체 참조 이름. 비어 있으면 저장소의 기본 브랜치를 의미합니다. |
117| `CLAUDE_RUNNER_CHECKOUT_PATH` | 작업 트리를 남겨야 할 절대 경로 |135| `CLAUDE_RUNNER_CHECKOUT_PATH` | 작업 트리를 남겨야 할 절대 경로 |
118| `CLAUDE_RUNNER_SESSION_ID` | 태그가 지정된 `session_...` 형식의 세션 ID이며, 로깅 및 상관관계 지정용입니다. |136| `CLAUDE_RUNNER_SESSION_ID` | 태그가 지정된 `session_...` 형식의 세션 ID이며, 로깅 및 상관관계 지정용입니다. |
119| `CLAUDE_RUNNER_SESSION_UUID` | 정규 UUID 형식의 동일한 세션 ID |137| `CLAUDE_RUNNER_SESSION_UUID` | 정규 UUID 형식의 동일한 세션 ID |
120| `CLAUDE_RUNNER_API_BASE_URL` | 세션 범위 호출용 Anthropic API 기본 URL |138| `CLAUDE_RUNNER_API_BASE_URL` | 세션 범위 호출용 Anthropic API 기본 URL |
121| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 세션을 생성한 클라이언트 표면(예: `web_claude_ai`, `desktop_app`, `ios`)입니다. 세션에 기록되거나 인식된 표면이 없으면 설정되지 않습니다. |139| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 세션을 생성한 클라이언트 사용 환경(예: `web_claude_ai`, `desktop_app`, `ios`)입니다. 세션에 기록되거나 인식된 사용 환경이 없으면 설정되지 않으므로 `set -u` 아래에서는 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}`로 참조하세요. Claude Code v2.1.229 이상이 필요합니다. |
122| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 세션 범위 API 호출용 세션 액세스 토큰 |140| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 세션 범위 API 호출용 세션 액세스 토큰 |
123| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | 러너가 훅이 실행하는 git에 대해 고정하는 Git 설정입니다. [라이프사이클 훅 내부의 Git 구성](#git-configuration-inside-lifecycle-hooks)에서 설명합니다. Claude Code v2.1.280 이상이 필요합니다. |141| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | 러너가 훅이 실행하는 git에 대해 고정하는 Git 설정입니다. [라이프사이클 훅 내부의 Git 구성](#git-configuration-inside-lifecycle-hooks)에서 설명합니다. Claude Code v2.1.280 이상이 필요합니다. |
124 142
125스크립트는 요청된 리비전에서 체크아웃된 `CLAUDE_RUNNER_CHECKOUT_PATH`에 작업 트리를 남겨야 합니다. 분리된 HEAD는 괜찮습니다. 러너는 그 위에 세션의 작업 분기를 생성합니다. 러너는 이후 경로에 `.git`이 포함되어 있는지 확인합니다. 훅이 Perforce 또는 압축 해제된 tarball과 같은 비git 소스를 구체화하면 러너의 환경에서 `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1`을 설정하여 해당 확인을 건너뛰세요. 작업 분기 생성 및 결과 푸시와 같은 git 기반 흐름에는 git 체크아웃이 필요하므로 [`post-session` 훅](#post-session)으로 비git 트리에서 결과를 내보내세요.143스크립트는 요청된 리비전에서 체크아웃된 `CLAUDE_RUNNER_CHECKOUT_PATH`에 작업 트리를 남겨야 합니다. 분리된 HEAD는 괜찮습니다. 러너는 그 위에 세션의 작업 브랜치를 생성합니다.
126 144
127러너는 훅에 git 자격증명을 전달하지 않습니다. 대신 세션의 ID에서 세션별 복제 자격증명을 발급합니다. [세션 서비스에서 토큰 확인](/docs/ko/self-hosted-environments-identity#verify-the-token-from-your-service)에 설명된 대로 `CLAUDE_RUNNER_API_BASE_URL` 아래의 JWKS 엔드포인트에 대해 표준 JWT 라이브러리로 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`을 확인한 다음 자격증명 서비스가 토큰의 `act` 클레임의 ID에 대한 단기 복제 자격증명을 발급하도록 합니다. `CLAUDE_RUNNER_CLAUDE_BIN`은 체크아웃 훅 환경에서 설정되지 않으므로 `decode-token` 서브명령을 사용할 수 없습니다. SSH 에이전트, 자격증명 도우미 또는 `.netrc`와 같이 호스트가 이미 가지고 있는 git 인증으로 폴백하는 것도 옵션입니다.145훅이 반환된 후 러너는 `CLAUDE_RUNNER_CHECKOUT_PATH`에 `.git`이 포함되어 있는지 확인합니다. 훅이 Perforce 또는 압축 해제된 tarball과 같은 비git 소스를 구체화하면 러너의 환경에서 `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1`을 설정하여 해당 확인을 건너뛰세요. 작업 브랜치 생성 및 결과 푸시와 같은 git 기반 흐름에는 git 체크아웃이 필요하므로 [`post-session` 훅](#post-session)으로 비git 트리에서 결과를 내보내세요.
128 146
129훅이 0이 아닌 값으로 종료되거나 0으로 종료되지만 사용 가능한 체크아웃을 남기지 않으면 러너가 수행하는 작업은 저장소에 따라 다릅니다:147<h4 id="get-git-credentials-in-the-hook">
148 훅에서 git 자격 증명 얻기
149</h4>
130 150
131* **세션이 결과를 푸시하는 저장소**: 러너가 세션을 실패하고 0이 아닌 종료 시 스크립트의 stderr 끝을 사용자에게 표시합니다.151러너는 훅에 git 자격 증명을 전달하지 않습니다. `CLAUDE_RUNNER_CLAUDE_BIN`은 체크아웃 훅 환경에서 설정되지 않으므로 `decode-token` 서브명령도 여기서는 사용할 수 없습니다. 대신 세션의 ID에서 세션별 복제 자격 증명을 발급하거나, 호스트 자체의 git 인증으로 폴백하세요:
132* **세션이 읽기만 하는 저장소**(예: 실행 중인 세션에 추가된 저장소): 러너는 `[runner:warn]` 줄을 실패 세부 정보와 함께 로깅하고, `Skipped` 단계를 세션에 게시하고, 훅이 체크아웃 경로에 남긴 것을 제거하고, 나머지 저장소로 계속합니다. 러너가 경로를 즉시 제거할 수 없으면 세션 종료 시 제거를 다시 시도합니다. 건너뛰기로 인해 세션에 저장소가 전혀 없으면 러너는 어쨌든 세션을 실패합니다.
133 152
134v2.1.228 이전에는 러너가 모든 저장소에 대해 훅 실패 시 세션을 실패했으므로 훅이 제공할 수 없는 읽기 전용 저장소는 세션이 새 러너에서 다시 시작될 때마다 다시 세션을 실패했습니다.153* **세션별 복제 자격 증명**: [세션 서비스에서 토큰 확인](/docs/ko/self-hosted-environments-identity#verify-the-token-from-your-service)에 설명된 대로 `CLAUDE_RUNNER_API_BASE_URL` 아래의 JWKS 엔드포인트에 대해 표준 JWT 라이브러리로 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`을 확인합니다. 그런 다음 자격 증명 서비스가 토큰의 `act` 클레임에 있는 ID에 대한 단기 복제 자격 증명을 발급하도록 합니다. 해당 자격 증명의 키는 `act.sub`로 지정하고, `act.email`을 요구하지 마세요.
154* **호스트 git 인증**: SSH 에이전트, 자격 증명 도우미 또는 `.netrc`와 같이 호스트가 이미 가지고 있는 git 인증을 사용합니다.
135 155
136러너는 세션이 끝난 후 체크아웃 경로를 제거합니다.156<h4 id="when-the-hook-fails">
157 훅이 실패할 때
158</h4>
159
160훅이 0이 아닌 값으로 종료되거나, 0으로 종료되지만 사용 가능한 체크아웃을 남기지 않으면 훅이 실패한 것입니다:
161
162* **세션이 결과를 푸시하는 저장소**: 러너가 세션을 실패하고 0이 아닌 종료 시 스크립트의 stderr 끝을 사용자에게 표시합니다.
163* **세션이 읽기만 하는 저장소**(예: 실행 중인 세션에 추가된 저장소): 러너는 `[runner:warn]` 줄을 실패 세부 정보와 함께 로그에 기록하고, `Skipped` 단계를 세션에 게시하고, 훅이 체크아웃 경로에 남긴 것을 제거하고, 나머지 저장소로 계속합니다. 건너뛰기로 인해 세션에 저장소가 전혀 없으면 러너는 어쨌든 세션을 실패합니다.
164
165훅이 성공하면 러너는 세션이 끝난 후 체크아웃 경로를 제거합니다.
137 166
138<h3 id="post-session">167<h3 id="post-session">
139 post-session168 post-session
151| `CLAUDE_RUNNER_WORKSPACE_PATHS` | 세션의 작업 트리의 콜론 구분 절대 경로입니다. 0개 저장소 세션의 경우 비어 있습니다. |180| `CLAUDE_RUNNER_WORKSPACE_PATHS` | 세션의 작업 트리의 콜론 구분 절대 경로입니다. 0개 저장소 세션의 경우 비어 있습니다. |
152| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | 세션의 디버그 로그 경로이며, 훅이 실행되는 동안 여전히 디스크에 있습니다. |181| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | 세션의 디버그 로그 경로이며, 훅이 실행되는 동안 여전히 디스크에 있습니다. |
153| `CLAUDE_RUNNER_API_BASE_URL` | 세션 범위 호출용 Anthropic API 기본 URL |182| `CLAUDE_RUNNER_API_BASE_URL` | 세션 범위 호출용 Anthropic API 기본 URL |
154| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 세션을 생성한 클라이언트 표면(예: `web_claude_ai`, `desktop_app`, `ios`)입니다. 세션에 기록되거나 인식된 표면이 없으면 설정되지 않습니다. Claude Code v2.1.229 이상이 필요합니다. |183| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 세션을 생성한 클라이언트 사용 환경(예: `web_claude_ai`, `desktop_app`, `ios`)입니다. 세션에 기록되거나 인식된 사용 환경이 없으면 설정되지 않으므로 `set -u` 아래에서는 `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}`로 참조하세요. Claude Code v2.1.229 이상이 필요합니다. |
155| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 세션 범위 API 호출용 세션 액세스 토큰 |184| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | 세션 범위 API 호출용 세션 액세스 토큰 |
156| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | 러너가 훅이 실행하는 git에 대해 고정하는 Git 설정입니다. [라이프사이클 훅 내부의 Git 구성](#git-configuration-inside-lifecycle-hooks)에서 설명합니다. Claude Code v2.1.280 이상이 필요합니다. |185| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | 러너가 훅이 실행하는 git에 대해 고정하는 Git 설정입니다. [라이프사이클 훅 내부의 Git 구성](#git-configuration-inside-lifecycle-hooks)에서 설명합니다. Claude Code v2.1.280 이상이 필요합니다. |
157 186
158`CLAUDE_RUNNER_EXIT_REASON`은 네 가지 값 중 하나를 취합니다:187`CLAUDE_RUNNER_EXIT_REASON`은 네 가지 값 중 하나를 취합니다:
159 188
160* `completed`: 세션이 깔끔하게 종료되었습니다. Claude Code 프로세스가 정상적으로 종료되었거나, 세션이 여전히 실행 중인 동안 아카이브되거나 삭제되었습니다.189* `completed`: 세션이 깔끔하게 종료되었습니다. Claude Code 프로세스가 정상적으로 종료되었거나, 세션이 아카이브되거나 삭제된 후 스스로 종료되었습니다.
161* `failed`: Claude Code 프로세스가 충돌했거나, 시작 후 설정이 실패했습니다.190* `failed`: Claude Code 프로세스가 충돌했거나, 시작 후 설정이 실패했습니다.
162* `interrupted`: 러너가 세션을 중지했습니다. 슬롯을 해제하기 위해 세션을 해제했거나, 시작 시 타임아웃되었거나, 서버가 이 러너에서 세션을 이동했거나, 러너가 드레인 중이었거나, 세션이 [`--kill-session-after-min`](/docs/ko/self-hosted-environments-reference#runner-cli-flags) 제한을 초과했습니다.191* `interrupted`: 러너가 세션을 중지했으며, 다음 경우 중 하나입니다:
192 * 러너가 슬롯을 확보하기 위해 세션을 해제했습니다.
193 * 세션이 시작 시 시간 초과되었습니다.
194 * 서버가 이 러너에서 세션을 이동했습니다.
195 * 프로세스가 종료되기 전에 러너의 폴링이 아카이브 또는 삭제를 감지했습니다.
196 * 러너가 드레인 중이었습니다.
197 * 세션이 [`--kill-session-after-min`](/docs/ko/self-hosted-environments-reference#runner-cli-flags) 제한을 초과했습니다.
163* `abandoned`: 다른 러너가 요청한 세션용으로 예약되어 있습니다. 훅은 현재 이 경우에 실행되지 않습니다.198* `abandoned`: 다른 러너가 요청한 세션용으로 예약되어 있습니다. 훅은 현재 이 경우에 실행되지 않습니다.
164 199
165[세션 라이프사이클 카운터 의미론](/docs/ko/self-hosted-environments-reference#session-lifecycle-counter-semantics)은 해제, 시작 타임아웃 및 서버 이동을 `interrupted` 대신 `completed`로 계산합니다. 러너가 슬롯을 깔끔하게 반환했기 때문입니다. 훅 수신과 카운터를 비교할 때 이 차이를 예상하세요.200훅 수신을 [세션 라이프사이클 카운터](/docs/ko/self-hosted-environments-reference#session-lifecycle-counter-semantics)와 비교하면 일부 `interrupted` 수신이 카운터에서는 `completed`로 계산된다는 점을 예상하세요. 카운터는 해제, 시작 타임아웃, 서버 이동, 그리고 러너의 폴링이 먼저 감지한 아카이브 또는 삭제를 `completed`로 계산합니다. 러너가 슬롯을 깔끔하게 반환했기 때문입니다.
166 201
167훅의 종료 상태는 세션 결과에 영향을 주지 않습니다. 실패는 로깅되고 무시됩니다. 러너는 `--post-session-hook-timeout-sec`(기본값 60초)까지 모든 세션 종료(러너 종료 포함)에서 대기합니다. 이 예제는 커밋되지 않은 작업을 구조 분기에 저장합니다:202훅의 종료 상태는 세션 결과에 영향을 주지 않습니다. 실패는 로깅되고 무시됩니다. 러너는 `--post-session-hook-timeout-sec`(기본값 60초)까지 모든 세션 종료(러너 종료 포함)에서 대기합니다. 이 예제는 커밋되지 않은 작업을 구조 분기에 저장합니다:
168 203
169```bash theme={null}204```bash theme={null}
170#!/usr/bin/env bash205#!/usr/bin/env bash
171set -u206set -u
207export GIT_ALLOW_PROTOCOL=${GIT_ALLOW_PROTOCOL:-https:http:ssh}
172IFS=':'208IFS=':'
173# -c 재정의는 저장소 로컬 설정보다 우선하므로 세션이 작성한 fsmonitor,209# -c 재정의는 저장소 로컬 설정보다 우선하므로 세션이 작성한 fsmonitor,
174# 훅 경로 및 gpg-program 구성이 훅의 권한으로 코드를 실행하는 것을210# 훅 경로 및 gpg-program 구성이 훅의 권한으로 코드를 실행하는 것을
175# 차단합니다. -c commit.gpgsign=false는 --configure-git 사용 시에도211# 차단합니다. -c commit.gpgsign=false는 --configure-git 사용 시에도
176# 이 구조 커밋을 서명하지 않은 상태로 둡니다.212# 이 구조 커밋을 서명하지 않은 상태로 둡니다.
177# 저장소 로컬 credential.helper와 pushurl은 여전히 적용되며, v2.1.280 이전213# 저장소 로컬 credential.helper와 pushurl은 여전히 적용되며, v2.1.280 이전
178# 러너에서는 core.sshCommand도 적용됩니다. 훅이 세션에 없는 자격 증명을214# 러너에서는 core.sshCommand도 적용됩니다. 이 푸시에 자격 증명을 제공하기
179# 보유하면 스크립트 아래의 참고 사항을 참조하세요.215# 전에 스크립트 아래의 참고 사항을 참조하세요.
180g() { git -c core.fsmonitor=false -c core.hooksPath=/dev/null \216g() { git -c core.fsmonitor=false -c core.hooksPath=/dev/null \
181 -c commit.gpgsign=false "$@"; }217 -c commit.gpgsign=false "$@"; }
182for ws in $CLAUDE_RUNNER_WORKSPACE_PATHS; do218for ws in $CLAUDE_RUNNER_WORKSPACE_PATHS; do
188done224done
189```225```
190 226
191훅은 러너 호스트의 자체 환경에서 사용 가능한 git 자격 증명으로 푸시합니다. [이미지에 자격 증명 없음 자세](/docs/ko/self-hosted-environments-deploy#configure-git) 아래에서(기본 제공 복제가 Anthropic git 프록시를 통과할 때 포함) 없으므로 푸시하기 전에 훅 내에서 단기 푸시 자격 증명을 발급합니다. 훅이 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`에서 받는 세션 토큰을 자신의 토큰 서비스와 교환하고 [세션 ID 확인](/docs/ko/self-hosted-environments-identity)에서 설명하는 대로 확인합니다. 훅이 세션이 가지지 않은 자격 증명을 보유하면 `origin`을 운영자 제공 URL로 바꾸고 `-c credential.helper=` 및 자신의 도우미를 전달합니다. 세션이 작성한 구성이 여전히 영향을 줄 수 있는 항목은 [라이프사이클 훅 내부의 Git 구성](#git-configuration-inside-lifecycle-hooks)에서 설명합니다.227스크립트의 `GIT_ALLOW_PROTOCOL` 줄은 git을 HTTPS, HTTP 및 SSH 원격으로 제한합니다. 러너의 환경에서 이미 비어 있지 않은 자체 `GIT_ALLOW_PROTOCOL` 목록을 설정한 경우 스크립트는 해당 목록을 유지합니다.
228
229훅은 러너 호스트의 자체 환경에서 사용 가능한 git 자격 증명으로 푸시합니다. [이미지에 자격 증명 없음 자세](/docs/ko/self-hosted-environments-deploy#configure-git) 아래에서(기본 제공 복제가 Anthropic git 프록시를 통과할 때 포함) 없으므로 푸시하기 전에 훅 내에서 단기 푸시 자격 증명을 발급합니다. 훅이 `CLAUDE_CODE_SESSION_ACCESS_TOKEN`에서 받는 세션 토큰을 자신의 토큰 서비스와 교환하고 [세션 ID 확인](/docs/ko/self-hosted-environments-identity)에서 설명하는 대로 확인합니다.
230
231훅이 git에 제공하는 모든 자격 증명은 세션이 얻을 수 있는 것으로 간주하고, 이 푸시 이상의 작업은 할 수 없도록 발급하세요. 훅의 git은 세션이 작성할 수 있는 설정 파일을 읽으며, 그중 하나에 지정된 자격 증명 도우미나 필터 드라이버는 훅의 권한으로 실행됩니다. 또한 이러한 파일의 설정은 어떤 원격을 지정하든 푸시의 대상을 변경할 수 있습니다. 러너가 훅에서 고정하는 git 설정과 이러한 파일에 맡기는 설정은 [라이프사이클 훅 내부의 Git 구성](#git-configuration-inside-lifecycle-hooks)을 참조하세요.
192 232
193<h4 id="hook-timing-when-the-runner-releases-a-session">233<h4 id="hook-timing-when-the-runner-releases-a-session">
194 러너가 세션을 해제할 때 훅 타이밍234 러너가 세션을 해제할 때 훅 타이밍
264| `CLAUDE_RUNNER_ORDER_ID` | 스폰 요청당 고유하고 Kubernetes 리소스 이름에 안전한 불투명 멱등성 키입니다. 프로비저너의 중복 제거 키로 주문 ID만 사용합니다. |304| `CLAUDE_RUNNER_ORDER_ID` | 스폰 요청당 고유하고 Kubernetes 리소스 이름에 안전한 불투명 멱등성 키입니다. 프로비저너의 중복 제거 키로 주문 ID만 사용합니다. |
265| `CLAUDE_RUNNER_SESSION_ID` | 이 요청이 대상으로 하는 세션입니다. 세션의 모든 재요청에서 반복되므로 로깅 및 라우팅에 사용하고 중복 제거 키로는 사용하지 마십시오. [`--min-idle`](/docs/ko/self-hosted-environments-reference#orchestrator-cli-flags)이 설정된 경우 특정 세션 전에 대기 중인 러너를 부팅하는 사전 워밍 요청의 경우 비어 있으므로 변수가 설정되어 있다고 가정하지 마십시오. |305| `CLAUDE_RUNNER_SESSION_ID` | 이 요청이 대상으로 하는 세션입니다. 세션의 모든 재요청에서 반복되므로 로깅 및 라우팅에 사용하고 중복 제거 키로는 사용하지 마십시오. [`--min-idle`](/docs/ko/self-hosted-environments-reference#orchestrator-cli-flags)이 설정된 경우 특정 세션 전에 대기 중인 러너를 부팅하는 사전 워밍 요청의 경우 비어 있으므로 변수가 설정되어 있다고 가정하지 마십시오. |
266| `CLAUDE_RUNNER_SESSION_UUID` | 정규 UUID 형식의 동일한 세션 ID입니다. 사전 워밍 요청의 경우 비어 있습니다. |306| `CLAUDE_RUNNER_SESSION_UUID` | 정규 UUID 형식의 동일한 세션 ID입니다. 사전 워밍 요청의 경우 비어 있습니다. |
267| `CLAUDE_RUNNER_ATTEMPT` | 이 세션이 가진 스폰 요청의 수입니다. 사전 워밍 요청의 경우 `0`입니다. |307| `CLAUDE_RUNNER_ATTEMPT` | 로깅에 사용하는 세션별 카운터입니다. 재시도 횟수나 요청 수가 아닙니다. 사전 워밍 요청의 경우 `0`이지만, 세션에 대한 요청도 `0`을 가질 수 있습니다. |
268| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | 폴 응답의 HTTP `Date` 헤더에서 서버 시간입니다. 훅이 작업 지시서 JWT의 `exp`를 확인할 때 로컬 클록 대신 이 값과 비교하여 시간 차이를 허용합니다. 게이트웨이가 헤더를 생략한 경우 비어 있습니다. |308| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | 폴 응답의 HTTP `Date` 헤더에서 서버 시간입니다. 훅이 작업 지시서 JWT의 `exp`를 확인할 때 로컬 클록 대신 이 값과 비교하여 시간 차이를 허용합니다. 게이트웨이가 헤더를 생략한 경우 비어 있습니다. |
269| `CLAUDE_RUNNER_POOL_ID` | 새 러너가 조인해야 하는 환경의 ID이며, `ccpool_...` 형식입니다. |309| `CLAUDE_RUNNER_POOL_ID` | 새 러너가 조인해야 하는 환경의 ID이며, `ccpool_...` 형식입니다. |
270| `CLAUDE_RUNNER_ACCOUNT_ID` | 세션을 대기열에 넣은 계정의 태그된 ID이며, 계정별 라우팅, 할당량 또는 차지백용입니다. 사용할 수 없을 때 비어 있으며, Claude Tag 채널 세션의 경우 항상 비어 있습니다. 이러한 세션은 계정이 대기열에 넣지 않습니다. |310| `CLAUDE_RUNNER_ACCOUNT_ID` | 세션을 대기열에 넣은 계정의 태그된 ID이며, 계정별 라우팅, 할당량 또는 차지백용입니다. 사용할 수 없을 때 비어 있으며, Claude Tag 채널 세션의 경우 항상 비어 있습니다. 이러한 세션은 계정이 대기열에 넣지 않습니다. |
271| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | 세션을 대기열에 넣은 계정의 이메일입니다. 사용할 수 없을 때 비어 있습니다. 이메일을 개인 식별 정보로 취급하고 로깅하지 마십시오. |311| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | 세션을 대기열에 넣은 계정의 이메일입니다. 사용할 수 없을 때 비어 있습니다. 이메일을 개인 식별 정보로 취급하고 로깅하지 마십시오. |
272| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | 세션의 첫 번째 git 소스의 URL이며, 해당 리포지토리가 사전 워밍된 러너로 라우팅하기 위한 것입니다. 세션에 git 소스가 없을 때 비어 있습니다. |312| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | 세션의 첫 번째 git 소스의 URL이며, 해당 리포지토리가 사전 워밍된 러너로 라우팅하기 위한 것입니다. 세션에 git 소스가 없을 때 비어 있습니다. |
273| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | 세션의 첫 번째 git 소스의 리비전입니다: 브랜치, SHA 또는 태그입니다. 지정되지 않은 경우 비어 있습니다. |313| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | 세션의 첫 번째 git 소스의 리비전입니다: 브랜치, SHA, 태그 또는 전체 참조 이름입니다. 지정되지 않은 경우 비어 있습니다. |
274| `CLAUDE_RUNNER_REPO_SOURCES` | 세션의 모든 git 소스에 대한 `{url, revision}`의 JSON 배열이며, 보조 리포지토리에서 라우팅하는 훅용입니다. 소스가 없을 때 비어 있습니다. |314| `CLAUDE_RUNNER_REPO_SOURCES` | 세션의 모든 git 소스에 대한 `{url, revision}`의 JSON 배열이며, 보조 리포지토리에서 라우팅하는 훅용입니다. 소스가 없을 때 비어 있습니다. |
275| `CLAUDE_RUNNER_CORRELATION_ID` | 세션 생성 시 제공된 상관 ID이며, 훅이 이 작업 지시서를 세션을 생성한 요청에 매핑할 수 있도록 에코백됩니다. 세션에 없을 때 비어 있습니다. |315| `CLAUDE_RUNNER_CORRELATION_ID` | 세션 생성 시 제공된 상관 ID이며, 훅이 이 작업 지시서를 세션을 생성한 요청에 매핑할 수 있도록 에코백됩니다. 세션에 없을 때 비어 있습니다. |
276| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 세션을 생성한 클라이언트 표면입니다. 예: `web_claude_ai`, `desktop_app`, `ios` 또는 `scheduled_trigger`이며, 채택 분석용입니다. 세션에 기록되거나 인식된 표면이 없을 때 설정되지 않으며, 사전 워밍 요청의 경우도 마찬가지입니다. `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`로 확인하면 `set -u` 하에서 안전하게 유지됩니다. |316| `CLAUDE_RUNNER_CLIENT_PLATFORM` | 세션을 생성한 클라이언트 표면입니다. 예: `web_claude_ai`, `desktop_app`, `ios` 또는 `scheduled_trigger`이며, 채택 분석용입니다. 세션에 기록되거나 인식된 표면이 없을 때 설정되지 않으며, 사전 워밍 요청의 경우도 마찬가지입니다. `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`로 확인하면 `set -u` 하에서 안전하게 유지됩니다. |
286 326
2871. **`CLAUDE_RUNNER_ORDER_ID`에서 멱등성을 유지합니다.** 동일한 요청의 재전달은 최대 하나의 러너를 스폰해야 합니다. 주문 ID에서 결정론적 리소스 이름을 파생시키고 플랫폼이 중복을 거부하도록 합니다. 대신 `CLAUDE_RUNNER_SESSION_ID`를 키로 사용하지 마십시오. 세션의 모든 재요청은 새 주문 ID와 함께 동일한 세션 ID를 전달하므로, 세션 ID로 명명되거나 중복 제거된 워크로드는 한 번 생성되고 해당 세션에 대해 다시는 생성되지 않습니다.3271. **`CLAUDE_RUNNER_ORDER_ID`에서 멱등성을 유지합니다.** 동일한 요청의 재전달은 최대 하나의 러너를 스폰해야 합니다. 주문 ID에서 결정론적 리소스 이름을 파생시키고 플랫폼이 중복을 거부하도록 합니다. 대신 `CLAUDE_RUNNER_SESSION_ID`를 키로 사용하지 마십시오. 세션의 모든 재요청은 새 주문 ID와 함께 동일한 세션 ID를 전달하므로, 세션 ID로 명명되거나 중복 제거된 워크로드는 한 번 생성되고 해당 세션에 대해 다시는 생성되지 않습니다.
2882. **워크로드를 재시도하지 마십시오.** 하나의 주문 ID는 최대 하나의 생성된 워크로드를 의미합니다. 러너가 등록되지 않으면 Anthropic은 `--expected-spawn-seconds` 후 새 주문 ID로 재요청합니다.3282. **워크로드를 재시도하지 마십시오.** 하나의 주문 ID는 최대 하나의 생성된 워크로드를 의미합니다. 러너가 등록되지 않으면 Anthropic은 `--expected-spawn-seconds` 후 새 주문 ID로 재요청합니다.
2893. **종료 코드 계약을 사용합니다.** 종료 0은 제출됨을 의미합니다. 종료 1은 재시도 가능한 실패를 의미합니다. 세션은 백오프되고 다시 제공됩니다. 종료 2 이상은 재시도 불가능을 의미합니다. 세션은 [Owner](/docs/ko/cloud-environments#organization-shared-environments)가 환경의 **Activity** 탭에서 **Retry**를 선택할 때까지 다시 스폰되지 않습니다. 0이 아닌 종료 시 훅의 stderr 끝이 실패 이유로 표시되므로 실행 가능한 오류를 stderr에 작성하고 시크릿은 절대 작성하지 마십시오. 사전 워밍 요청의 경우 실패할 세션이 없습니다: 오케스트레이터는 0이 아닌 종료를 로컬에만 로깅하고, 서버는 리스 후 스폰을 재요청합니다.3293. **종료 코드 계약을 사용합니다.** 결과에 맞는 상태로 종료합니다:
2904. **`--expected-spawn-seconds`를 최소한 p99 부팅 시간으로 설정합니다.** 이는 서버 측 리스입니다. 모든 오케스트레이터 복제본은 동일한 값을 사용해야 합니다.330
331 * **종료 0**: 제출됨.
332 * **종료 1**: 재시도 가능한 실패. 세션은 백오프되고 다시 제공됩니다.
333 * **종료 2 이상**: 재시도 불가능한 실패. 사용자가 세션에 새 메시지를 보내거나 [Owner](/docs/ko/cloud-environments#organization-shared-environments)가 환경의 **Activity** 탭에서 해당 세션의 **Retry**를 선택할 때까지 세션은 다시 스폰되지 않습니다.
334
335 0이 아닌 종료 시 훅의 stderr 끝이 **Activity** 탭에 실패 이유로 표시되므로 실행 가능한 오류를 stderr에 작성하고 시크릿은 절대 작성하지 마십시오. 셸 훅에서는 [일시적인 실패를 재시도 가능한 상태로 유지하십시오](#keep-transient-failures-retryable-in-a-shell-hook).
336
337 사전 워밍 요청의 경우 실패할 세션이 없습니다: 오케스트레이터는 0이 아닌 종료를 로컬에만 로깅하고, 서버는 `--expected-spawn-seconds` 리스가 만료된 후 스폰을 재요청합니다.
3384. **`--expected-spawn-seconds`를 최소한 스폰 요청부터 러너 등록까지의 p99 시간으로 설정합니다.** 오케스트레이터가 스폰 요청을 받은 시점부터 측정하고, 부팅 시간뿐 아니라 플랫폼에서 용량을 기다리는 시간도 포함하십시오. 이 값은 서버 측 리스이며 작업 지시서도 함께 만료되므로, 워크로드가 이보다 오래 걸리는 러너는 등록할 수 없습니다. 모든 오케스트레이터 복제본은 동일한 값을 사용해야 합니다.
291 339
292훅이 stdout 또는 stderr에 작성하는 모든 것은 자격증명이 자동으로 삭제된 오케스트레이터의 로그에 나타납니다. 세션이 대기 중인 상태로 유지되면 오케스트레이터의 `/healthz` 본문에서 대기열 수를 확인한 후 [**Cloud environments** 관리 페이지](https://claude.ai/admin-settings/cloud-environments)에서 환경의 **Activity** 탭을 엽니다: 실패한 세션을 확장하여 스폰 오류를 확인하고 **Retry**를 선택하여 재요청합니다.340훅이 stdout 또는 stderr에 작성하는 모든 것은 자격증명이 자동으로 삭제된 오케스트레이터의 로그에 나타납니다. 세션이 대기 중인 상태로 유지되면 오케스트레이터의 `/healthz` 본문에서 대기열 수를 확인한 후 [**Cloud environments** 관리 페이지](https://claude.ai/admin-settings/cloud-environments)에서 환경의 **Activity** 탭을 엽니다: 실패한 세션을 확장하여 스폰 오류를 확인하고 **Retry**를 선택하여 재요청합니다.
293 341
294**Activity** 탭에 스폰 오류가 없는 상태로 대기 중인 세션은 훅이 세션 ID를 키로 사용하고 있음을 의미할 수 있습니다. 확인하려면 플랫폼에 해당 세션의 첫 번째 스폰 요청에 대한 워크로드가 있는지, 재요청에 대한 워크로드가 없는지 확인합니다. 그렇다면 대신 `CLAUDE_RUNNER_ORDER_ID`를 키로 사용합니다.342**Activity** 탭에 스폰 오류가 없는 상태로 대기 중인 세션은 훅이 세션 ID를 키로 사용하고 있음을 의미할 수 있습니다. 확인하려면 플랫폼에 해당 세션의 첫 번째 스폰 요청에 대한 워크로드가 있는지, 재요청에 대한 워크로드가 없는지 확인합니다. 그렇다면 대신 `CLAUDE_RUNNER_ORDER_ID`를 키로 사용합니다.
295 343
344<h4 id="keep-transient-failures-retryable-in-a-shell-hook">
345 셸 훅에서 일시적인 실패를 재시도 가능한 상태로 유지하기
346</h4>
347
348`set -e`를 사용하는 셸 훅에서는 재시도로 해결될 수 있었던 실패가 세션을 차단할 수 있습니다. 훅은 실패한 명령에서 멈추고 해당 명령 자체의 상태로 종료하며, 오케스트레이터는 그 상태에 종료 코드 계약을 적용합니다. 명령이 설치되지 않았을 때의 `127`이나 HTTP 오류 시 `curl --fail`이 반환하는 `22`처럼 많은 실패가 2 이상의 상태를 반환하므로, 첫 번째 실패에서 세션이 차단됩니다.
349
350훅이 이미 차단한 세션은 사용자가 새 메시지를 보내거나 [Owner](/docs/ko/cloud-environments#organization-shared-environments)가 환경의 **Activity** 탭에서 해당 세션의 **Retry**를 선택할 때까지 차단된 상태로 유지됩니다.
351
352이러한 실패를 대신 종료 1로 바꾸려면 훅의 `#!` 줄 바로 아래, 실패할 수 있는 어떤 코드보다도 위에 다음 줄을 넣으십시오:
353
354```bash theme={null}
355set -e
356PERMANENT=; permanent() { printf '%s\n' "$*" >&2; PERMANENT=1; exit 2; }
357trap 'rc=$?; [ "$rc" -eq 0 ] || [ -n "${PERMANENT:-}" ] || exit 1' EXIT
358```
359
360이 줄들은 훅의 나머지 부분이 동작하는 방식을 바꾸므로, 추가한 후 다음 각 패턴이 있는지 훅을 확인하십시오:
361
362* **단독 `exit 2` 이상**: trap이 설정되면 종료 1이 됩니다. 어떤 재시도로도 해결할 수 없는 오류의 경우 대신 `permanent "namespace claude-runners does not exist"`처럼 이유와 함께 `permanent`를 호출하십시오. `$( )`, `( )` 또는 파이프 내부가 아닌 메인 셸에서 호출하십시오.
363* **`exec`**: `exec`는 셸을 대체하여 trap이 실행되지 않으므로, 훅의 마지막 명령을 `exec`로 시작하지 마십시오.
364* **두 번째 `EXIT` trap**: 두 번째 `trap ... EXIT`는 첫 번째를 대체하므로 두 trap을 하나로 병합하십시오. 정리 명령을 `rc=$?;` 바로 뒤에 넣고 각각을 `|| true;`로 끝내십시오. 그러면 정리 작업이 성공 시뿐 아니라 실패 시에도 실행되며, 정리 명령이 실패해도 훅의 종료 상태가 설정되지 않습니다. 다음 병합된 trap은 그 형태를 보여 주며, `your-cleanup-command`는 사용자 자신의 명령을 나타냅니다:
365
366 ```bash theme={null}
367 trap 'rc=$?; your-cleanup-command || true; [ "$rc" -eq 0 ] || [ -n "${PERMANENT:-}" ] || exit 1' EXIT
368 ```
369* **실패해도 되는 명령**: 훅이 이전에 `set -e`를 사용하지 않았다면, 이제 아무것도 찾지 못한 조회나 플랫폼이 거부하는 중복 제출처럼 0이 아닌 값을 반환하는 첫 번째 명령에서 멈춥니다. 훅이 결과에 따라 동작한다면 해당 명령을 `if`의 조건으로 만드십시오. 결과를 무시한다면 명령 뒤에 `|| true`를 붙이십시오.
370
371trap이 작동하는지 확인하려면 `trap` 줄 바로 아래에 `no-such-command`처럼 존재하지 않는 명령을 호출하는 줄을 추가하십시오. 셸에서 훅 파일을 실행하고 `echo $?`가 `1`을 출력하는지 확인한 다음 해당 줄을 제거하십시오.
372
296<h2 id="send-model-requests-to-bedrock-or-agent-platform">373<h2 id="send-model-requests-to-bedrock-or-agent-platform">
297 Bedrock 또는 Agent Platform으로 모델 요청 보내기374 Bedrock 또는 Agent Platform으로 모델 요청 보내기
298</h2>375</h2>
381Amazon Bedrock 또는 Google Cloud의 Agent Platform으로 모델 요청을 보내는 세션은 Anthropic API의 세션과 다음과 같은 점에서 다릅니다.458Amazon Bedrock 또는 Google Cloud의 Agent Platform으로 모델 요청을 보내는 세션은 Anthropic API의 세션과 다음과 같은 점에서 다릅니다.
382 459
383* **claude.ai의 정책**: [서버 관리형 설정](/docs/ko/server-managed-settings)은 이러한 세션에 도달하지 않습니다. Owner가 Claude Code 관리자 설정에서 지정하는 조직 정책도 도달하지 않으므로, Claude Code는 세션 내에서 이를 적용하지 않습니다. 의존하는 규칙은 러너 이미지의 [관리형 설정 파일](/docs/ko/managed-settings#delivery-mechanisms)에 넣으십시오.460* **claude.ai의 정책**: [서버 관리형 설정](/docs/ko/server-managed-settings)은 이러한 세션에 도달하지 않습니다. Owner가 Claude Code 관리자 설정에서 지정하는 조직 정책도 도달하지 않으므로, Claude Code는 세션 내에서 이를 적용하지 않습니다. 의존하는 규칙은 러너 이미지의 [관리형 설정 파일](/docs/ko/managed-settings#delivery-mechanisms)에 넣으십시오.
461* **계정 스킬**: 이러한 세션은 개인의 claude.ai 계정에서 활성화된 스킬을 다운로드하지 않습니다. [각 세션의 구성이 조합되는 방식](#how-each-session’s-config-is-assembled)을 참조하십시오.
384* **파일**: claude.ai나 모바일 또는 데스크톱 앱에서 세션에 첨부한 파일은 세션에 도달하지 않으며, Claude는 [`SendUserFile` 도구](/docs/ko/tools-reference)로 파일을 다시 보낼 수 없습니다. 대신 입력 파일을 저장소나 러너에 두십시오.462* **파일**: claude.ai나 모바일 또는 데스크톱 앱에서 세션에 첨부한 파일은 세션에 도달하지 않으며, Claude는 [`SendUserFile` 도구](/docs/ko/tools-reference)로 파일을 다시 보낼 수 없습니다. 대신 입력 파일을 저장소나 러너에 두십시오.
385* **모델 선택**: Anthropic의 컨트롤 플레인이 각 세션의 모델을 전송하며, 모델 없이 세션이 시작되면 Claude Code는 해당 제공업체의 기본값을 사용합니다. 러너는 세션에 전달하는 환경에서 `ANTHROPIC_MODEL`과 `ANTHROPIC_DEFAULT_MODEL`을 제거합니다. 제공업체 페이지의 예시에서는 `ANTHROPIC_MODEL`을 설정하지만, 러너 환경에서는 두 변수 모두 아무런 효과가 없습니다. [Amazon Bedrock](/docs/ko/amazon-bedrock#4-pin-model-versions) 및 [Agent Platform](/docs/ko/google-vertex-ai#5-pin-model-versions)의 모델 버전 고정에 나오는 모델 계열별 변수는 세션에 도달합니다. 이 변수는 `opus` 같은 별칭이 무엇으로 해석되는지를 결정하며, 전체 모델 ID가 무엇으로 해석되는지는 결정하지 않습니다.463* **모델 선택**: Anthropic의 컨트롤 플레인이 각 세션의 모델을 전송하며, 모델 없이 세션이 시작되면 Claude Code는 해당 제공업체의 기본값을 사용합니다. 러너 환경의 `ANTHROPIC_MODEL`이나 `ANTHROPIC_DEFAULT_MODEL`로는 모델을 선택할 수 없지만, 별칭이 무엇으로 해석되는지는 고정할 수 있습니다.
464 * **`ANTHROPIC_MODEL` 및 `ANTHROPIC_DEFAULT_MODEL`**: 제공업체 페이지의 예시에서는 `ANTHROPIC_MODEL`을 설정하지만, 러너는 세션에 전달하는 환경에서 이 두 변수를 제거합니다.
465 * **모델 계열별 고정 변수**: [Amazon Bedrock](/docs/ko/amazon-bedrock#4-pin-model-versions) 및 [Agent Platform](/docs/ko/google-vertex-ai#5-pin-model-versions)의 모델 버전 고정에 나오는 변수는 세션에 도달합니다. 이 변수는 `opus` 같은 별칭이 무엇으로 해석되는지를 결정하며, 전체 모델 ID가 무엇으로 해석되는지는 결정하지 않습니다.
386* **계정에서 제공하지 않는 모델**: 세션이 모델 이름이 포함된 오류와 함께 메시지에서 실패할 수 있습니다. 개발자가 선택할 수 있는 모델, 모델 버전 고정에 설명된 백그라운드 모델, [자동 모드](/docs/ko/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry)가 사용하는 분류기 모델을 활성화하십시오. Amazon Bedrock에서는 정책에서 각 모델을 허용하십시오.466* **계정에서 제공하지 않는 모델**: 세션이 모델 이름이 포함된 오류와 함께 메시지에서 실패할 수 있습니다. 개발자가 선택할 수 있는 모델, 모델 버전 고정에 설명된 백그라운드 모델, [자동 모드](/docs/ko/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry)가 사용하는 분류기 모델을 활성화하십시오. Amazon Bedrock에서는 정책에서 각 모델을 허용하십시오.
387* **웹 검색 및 빠른 모드**: [웹 검색](/docs/ko/tools-reference#websearch-tool-behavior)은 Amazon Bedrock에서 사용할 수 없으며, [빠른 모드](/docs/ko/fast-mode)는 두 제공업체 모두에서 사용할 수 없습니다. 제공업체에 따라 달라지는 기타 기능은 [제공업체별로 달라지는 CLI 기능](/docs/ko/feature-availability#cli-capabilities-that-vary-by-provider)을 참조하십시오.467* **웹 검색 및 빠른 모드**: [웹 검색](/docs/ko/tools-reference#websearch-tool-behavior)은 Amazon Bedrock에서 사용할 수 없으며, [빠른 모드](/docs/ko/fast-mode)는 두 제공업체 모두에서 사용할 수 없습니다. 제공업체에 따라 달라지는 기타 기능은 [제공업체별로 달라지는 CLI 기능](/docs/ko/feature-availability#cli-capabilities-that-vary-by-provider)을 참조하십시오.
388 468
411 491
412세션은 러너의 환경을 상속하므로, 러너에서 [`ENABLE_TOOL_SEARCH`](/docs/ko/mcp#scale-with-mcp-tool-search)를 설정하면 러너가 생성하는 모든 세션의 MCP 도구 검색을 제어할 수 있습니다. 값에 대해서는 MCP 페이지에서 다룹니다.492세션은 러너의 환경을 상속하므로, 러너에서 [`ENABLE_TOOL_SEARCH`](/docs/ko/mcp#scale-with-mcp-tool-search)를 설정하면 러너가 생성하는 모든 세션의 MCP 도구 검색을 제어할 수 있습니다. 값에 대해서는 MCP 페이지에서 다룹니다.
413 493
494<a id="connection-timing" />
495
496<h3 id="wait-for-mcp-servers-before-the-first-turn">
497 첫 턴 전에 MCP 서버 대기하기
498</h3>
499
500자체 호스팅 세션은 아직 연결 중인 MCP 서버를 두 개의 별도 시점에서 잠시 기다립니다. 대기 시간 내에 연결되지 못한 서버는 첫 턴이 시작될 때 해당 도구가 누락되며, 이후 별도의 조치 없이 사용할 수 있게 됩니다. 두 가지 대기는 다음과 같습니다:
501
502* **세션 시작**: 도구 목록을 처음 가져오기 전에, 세션은 항목에 [`alwaysLoad: true`](/docs/ko/mcp#exempt-a-server-from-deferral)를 설정한 HTTP 또는 SSE 서버를 기본적으로 최대 5초 동안 기다리며, 러너 환경에서 [`MCP_CONNECTION_NONBLOCKING=0`](/docs/ko/env-vars)을 설정한 경우에는 모든 서버를 기다립니다. 그 외의 경우 HTTP 및 SSE 서버는 백그라운드에서 연결됩니다. 세션이 여기서 대기하는 동안에는 초기화가 느려집니다. [`MCP_CONNECT_TIMEOUT_MS`](/docs/ko/env-vars)로 5초 기본값을 변경할 수 있습니다.
503* **첫 턴**: 메시지가 도착한 후, 첫 턴은 아직 연결 중인 stdio 서버를 최대 2초 동안 기다립니다. 세션이 여기서 대기하는 동안에는 첫 응답이 느려집니다. 이 대기 시간을 변경하려면 러너 환경에서 [`CLAUDE_CODE_MCP_STARTUP_WAIT_MS`](/docs/ko/env-vars)를 설정합니다. 이 설정은 대기 대상 서버를 변경하지 않습니다. Claude Code v2.1.274 이상이 필요합니다.
504
505`claude mcp add`에는 `alwaysLoad` 플래그가 없습니다. 이 키를 설정하려면 대신 `claude mcp add-json`으로 서버를 추가합니다. 이 명령은 서버의 JSON에서 해당 키를 받아 `.claude.json`에 기록합니다. Dockerfile에서는 다음과 같습니다:
506
507```dockerfile theme={null}
508RUN claude mcp add-json core '{"type":"http","url":"https://mcp.example.com/mcp","alwaysLoad":true}' --scope user
509```
510
511이후 턴에서도 서버의 도구가 나타나지 않으면, [MCP 서버](#mcp-servers)에서 설명한 대로 서버가 세션에 전달되었는지 확인합니다.
512
414<h3 id="turn-off-built-in-session-tools">513<h3 id="turn-off-built-in-session-tools">
415 기본 제공 세션 도구 끄기514 기본 제공 세션 도구 끄기
416</h3>515</h3>
569 668
570`SELF_HOSTED_RUNNER_HOST_CONFIG_DIR`을 설정하여 다른 경로에서 시드하거나 빈 디렉토리를 가리켜 시딩을 비활성화하십시오.669`SELF_HOSTED_RUNNER_HOST_CONFIG_DIR`을 설정하여 다른 경로에서 시드하거나 빈 디렉토리를 가리켜 시딩을 비활성화하십시오.
571 670
572저장소 커밋된 `.claude/settings.json`은 프로젝트 설정으로 위에 계층화됩니다. 여러 저장소가 있는 세션에서는 [최대 하나의 저장소 파일만 적용됩니다](#repository-settings-in-sessions-with-several-repositories). 세션은 또한 러너 이미지의 표준 시스템 경로에서 [`managed-settings.json`](/docs/ko/settings#where-settings-live)을 읽습니다. 해당 키가 [서버 관리 설정](/docs/ko/server-managed-settings)과 함께 적용되는지 여부는 [Claude Code가 관리형 소스를 결합하는 방식](/docs/ko/managed-settings#how-claude-code-combines-managed-sources)을 따릅니다. 기본적으로 조직이 서버 관리 키를 제공할 때 세션은 [Claude Code가 모든 관리자 소스에서 읽는 키](/docs/ko/managed-settings#keys-read-from-every-admin-source)(예: `env` 블록, 샌드박스 잠금, 샌드박스 바이너리 경로 및 `forceRemoteSettingsRefresh`)를 제외하고 러너 이미지의 파일을 무시합니다. [설정 우선순위](/docs/ko/settings#settings-precedence)를 참조하십시오.671세션은 다음 설정 파일도 읽습니다:
672
673* **프로젝트 설정**: 저장소에 커밋된 `.claude/settings.json`은 사용자 수준 기준선 위에 계층화됩니다. 여러 저장소가 있는 세션에서는 [최대 하나의 저장소 파일만 적용됩니다](#repository-settings-in-sessions-with-several-repositories).
674* **관리형 설정**: 세션은 러너 이미지의 표준 시스템 경로에서 [`managed-settings.json`](/docs/ko/settings#where-settings-live)을 읽습니다. 해당 키가 [서버 관리 설정](/docs/ko/server-managed-settings)과 함께 적용되는지 여부는 [Claude Code가 관리형 소스를 결합하는 방식](/docs/ko/managed-settings#how-claude-code-combines-managed-sources)을 참조하십시오.
675
676이러한 소스가 적용되는 순서는 [설정 우선순위](/docs/ko/settings#settings-precedence)를 참조하십시오.
573 677
574Anthropic의 제어 평면이 세션에 [Claude Code 훅](/docs/ko/hooks)을 제공할 때 러너는 자신의 구성 위에 설치하지 않고 자신의 구성과 함께 설치합니다. Claude Code v2.1.229 이상이 필요합니다.678Anthropic의 제어 평면이 세션에 [Claude Code 훅](/docs/ko/hooks)을 제공할 때 러너는 자신의 구성 위에 설치하지 않고 자신의 구성과 함께 설치합니다. Claude Code v2.1.229 이상이 필요합니다.
575 679
577* **작성자**: 제어 평면은 세션별 또는 타사 입력이 아닌 자신의 배포의 고정 상수에서 스크립트를 채웁니다.681* **작성자**: 제어 평면은 세션별 또는 타사 입력이 아닌 자신의 배포의 고정 상수에서 스크립트를 채웁니다.
578* **여전히 이를 관리하는 것**: `--settings`를 통해 제공된 훅은 관리되는 계층이 아닌 일반 병합 훅 구성에 들어가므로 관리되는 설정이 여전히 적용됩니다. `disableAllHooks`는 이를 비활성화하며, [`allowManagedHooksOnly`](/docs/ko/settings-reference#allowmanagedhooksonly)가 로드된 상태로 유지하는 범주에 포함되지 않습니다.682* **여전히 이를 관리하는 것**: `--settings`를 통해 제공된 훅은 관리되는 계층이 아닌 일반 병합 훅 구성에 들어가므로 관리되는 설정이 여전히 적용됩니다. `disableAllHooks`는 이를 비활성화하며, [`allowManagedHooksOnly`](/docs/ko/settings-reference#allowmanagedhooksonly)가 로드된 상태로 유지하는 범주에 포함되지 않습니다.
579 683
684사용자가 직접 세션을 시작하면 Claude Code는 해당 사용자의 [claude.ai 계정에서 활성화된 스킬](/docs/ko/skills#skills-in-cowork-and-cloud-sessions)도 해당 세션의 구성 디렉토리로 다운로드합니다. [루틴](/docs/ko/routines) 실행은 소유자의 스킬을 받지 않으며, [Bedrock 또는 Agent Platform으로 모델 요청을 보내는](#send-model-requests-to-bedrock-or-agent-platform) 세션은 스킬을 전혀 다운로드하지 않습니다. 이러한 세션에 필요한 스킬은 저장소의 `.claude/skills/`에 커밋하거나 러너 이미지에 추가하십시오.
685
580[Claude Tag](https://claude.com/docs/claude-tag/overview) 세션을 제외하면, 자체 호스팅 환경의 세션은 기본적으로 [자동 메모리](/docs/ko/memory#auto-memory)가 꺼진 상태로 실행됩니다. 여러 세션에 걸쳐 유지되어야 하는 지침에는 러너 이미지 또는 저장소의 `CLAUDE.md`를 사용하십시오.686[Claude Tag](https://claude.com/docs/claude-tag/overview) 세션을 제외하면, 자체 호스팅 환경의 세션은 기본적으로 [자동 메모리](/docs/ko/memory#auto-memory)가 꺼진 상태로 실행됩니다. 여러 세션에 걸쳐 유지되어야 하는 지침에는 러너 이미지 또는 저장소의 `CLAUDE.md`를 사용하십시오.
581 687
582호스트의 `~/.claude/`에 대한 러너의 스냅샷에는 `projects/` 디렉토리가 포함되지 않습니다. 자동 메모리의 기본 스토리지 위치는 이 디렉토리 아래에 있습니다. 이곳에 메모리 파일을 넣더라도 러너는 이를 세션으로 시드하지 않으며, 해당 파일로 자동 메모리가 켜지지도 않습니다.688호스트의 `~/.claude/`에 대한 러너의 스냅샷에는 `projects/` 디렉토리가 포함되지 않습니다. 자동 메모리의 기본 스토리지 위치는 이 디렉토리 아래에 있습니다. 이곳에 메모리 파일을 넣더라도 러너는 이를 세션으로 시드하지 않으며, 해당 파일로 자동 메모리가 켜지지도 않습니다.