🔥 12 patch 안에 두 디폴트가 옵트인으로 돌아왔다 — Claude Code 2.1.128~2.1.138
강의 목차

2.1.129의 CHANGELOG 한 줄을 다시 봤다.
CHANGELOG 원문은 Gateway /v1/models discovery for the /model picker is now opt-in via CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 (was automatic in 2.1.126-2.1.128). (게이트웨이의 /v1/models discovery가 이제 CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 환경 변수가 켜져야만 동작한다. 2.1.126~2.1.128에서는 자동이었다).
내가 직전 글에서 적었던 fix가 정확히 이 자동 동작이었다. 자동으로 켜진 지 3 patch 만에 환경 변수 뒤로 옮겨갔다.
같은 12 patch 안에 똑같은 패턴이 한 번 더 도착했다. EnterWorktree가 새 브랜치를 어디서 끊는지를 두고 두 번 결정을 바꿨다. 2.1.128이 base를 로컬 HEAD로 바꾸고, 2.1.133이 새 worktree.baseRef 설정으로 다시 origin/<default>를 디폴트로 돌렸다.
두 옵트인 키는 자동 디폴트를 환경 변수와 설정 키 뒤로 옮겼고, 같은 묶음의 권한 fix 두 가지는 plan mode와 auto mode의 우선순위를 더 단단하게 만들었다.
/model 피커의 게이트웨이 discovery가 환경 변수로 옮겨갔다

2.1.129가 한 환경 변수를 추가했다. CHANGELOG 원문은 Gateway /v1/models discovery for the /model picker is now opt-in via CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 (was automatic in 2.1.126-2.1.128) (게이트웨이의 /v1/models discovery가 이제 CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 환경 변수가 켜져야만 동작한다. 2.1.126~2.1.128까지는 자동이었다).
이 자동 동작은 직전 글에서 다뤘다. 이전엔 /model 피커가 Anthropic 본사 카탈로그를 그대로 띄웠다. 게이트웨이가 모델 일부만 노출하거나 별칭을 붙여 둔 환경에서는 피커에 보이는 이름과 게이트웨이가 받는 이름이 어긋났다. 2.1.126부터 게이트웨이의 /v1/models 응답이 그 목록을 채워서, 피커에서 고른 이름이 바로 게이트웨이의 라우팅 키로 들어갔다.
3 patch 후 그 자동 동작이 옵트인으로 돌아왔다. 새 환경 변수 CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1이 켜져야 게이트웨이의 /v1/models 호출이 다시 일어난다. 안 켜면 피커가 first-party Anthropic 정적 모델 목록만 띄운다.
같은 2.1.129에서 한 묶음의 fix가 더 들어왔다. CHANGELOG 원문은 Third-party deployments (Bedrock, Vertex, Foundry, or ANTHROPIC_BASE_URL gateway) no longer see spinner tips pointing at first-party Anthropic surfaces (Bedrock, Vertex, Foundry, ANTHROPIC_BASE_URL 게이트웨이로 굴리는 third-party deployment가 이제 first-party Anthropic 표면을 가리키는 spinner tip을 안 본다). 두 fix는 같은 방향이다. 2.1.129가 게이트웨이 환경에서 first-party Anthropic 표면을 자동으로 가리키지 않도록 두 동작을 한 묶음으로 묶었다.
회귀 사유는 CHANGELOG가 적지 않았다. 추정으로는 게이트웨이의 /v1/models 응답이 표준 schema와 어긋나는 환경에서 피커가 이상한 이름을 띄우는 사례가 있었다고 본다. Anthropic이 명시적으로 회귀 사유를 적은 적은 없으니 단정은 안 한다. 다만 한 디폴트가 자동에서 환경 변수 옵트인으로 옮겨갔다는 사실은 그대로다.
본사 endpoint(api.anthropic.com)를 그대로 쓰는 환경에서는 이 환경 변수를 켤 일이 없다. ANTHROPIC_BASE_URL이 다른 호스트를 가리킬 때만 이 변수가 의미가 있다.
EnterWorktree의 base가 origin/<default>로 다시 들어왔다

2.1.128이 EnterWorktree의 base를 한 차례 바꿨다. CHANGELOG 원문은 EnterWorktree now creates the new branch from local HEAD as documented, instead of origin/<default-branch> (EnterWorktree가 이제 documented한 대로 로컬 HEAD에서 새 브랜치를 만든다. 이전의 origin/<default-branch>가 아니다). 같은 줄에 한 줄 더 따라온다. unpushed commits are no longer dropped (push 하기 전 commit이 더 이상 사라지지 않는다).
문제는 이전 동작이었다. 2.1.126까지는 EnterWorktree가 origin/<default>에서 새 브랜치를 끊었기 때문에, push 하기 전 commit이 있는 상태에서 새 워크트리를 열면 그 commit들이 안 들어갔다. 2.1.128은 그 동작을 documented behavior로 맞춰 주려고 base를 로컬 HEAD로 바꿨다.
5 patch 후 2.1.133이 다시 손을 댔다. CHANGELOG 원문은 Added worktree.baseRef setting (fresh | head) to choose whether --worktree, EnterWorktree, and agent-isolation worktrees branch from origin/<default> or local HEAD (worktree.baseRef 설정을 추가했다. 이 설정은 fresh와 head 두 값을 받는다. --worktree, EnterWorktree, agent-isolation 워크트리가 origin/<default>에서 브랜치를 만들지 로컬 HEAD에서 만들지를 정한다).
같은 줄에 디폴트 동작도 따로 적었다. the default fresh changes EnterWorktree's base back to origin/<default> (it has been local HEAD since 2.1.128). set worktree.baseRef: "head" to keep unpushed commits in new worktrees (디폴트 fresh는 EnterWorktree의 base를 다시 origin/<default>로 돌린다. 2.1.128부터 로컬 HEAD였던 동작이다. push 하기 전 commit을 새 워크트리에 끌어가고 싶으면 worktree.baseRef: "head"로 명시한다).
2.1.133이 세 워크트리 동작 (--worktree 플래그, EnterWorktree 도구, agent-isolation 워크트리)을 한 설정 키 뒤로 묶었다. 디폴트 fresh는 origin/<default>에서 끊는다. head는 로컬 HEAD에서 끊고 unpushed commit을 새 워크트리로 끌어간다. 2.1.128 ~ 2.1.132의 동작을 그대로 유지하려면 worktree.baseRef: "head"를 명시한다.
같은 2.1.133이 한 워크트리 안전망을 더 넣었다. CHANGELOG 원문은 Added sandbox.bwrapPath and sandbox.socatPath managed settings (Linux/WSL) to specify custom bubblewrap and socat binary locations (sandbox.bwrapPath와 sandbox.socatPath managed settings를 추가했다. Linux/WSL에서 커스텀 bubblewrap과 socat 바이너리 위치를 지정한다). 워크트리 자체와는 다른 영역이지만 같은 묶음의 권한·격리 정리 흐름이다. 두 영역(워크트리 base와 sandbox 바이너리 위치) 모두 기본값 + 명시 옵션 구조로 들어왔다.
사용자가 만질 환경 변수와 설정 키

12 patch 안에 두 곳에 옵트인 키가 도착했다. 두 키는 켜는 위치와 디폴트 동작이 다르다.
| 동작 | 옵트인 키 | 디폴트 | 켜면 |
|---|---|---|---|
/model 피커의 게이트웨이 모델 목록 | CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 환경 변수 | first-party Anthropic 정적 모델 목록 | 게이트웨이의 /v1/models 응답을 따른다 |
EnterWorktree / --worktree / agent-isolation 워크트리 base | worktree.baseRef: "head" 설정 | origin/<default>에서 끊는다 | 로컬 HEAD에서 끊고 unpushed commit을 끌어간다 |
표만 보고도 운용이 끝난다. 사내 게이트웨이를 끼고 굴리는 환경이면 환경 변수를 켠다. 워크트리에 unpushed commit을 끌어가고 싶으면 설정을 켠다. 둘 다 디폴트는 안전 쪽이다. 게이트웨이 응답을 무조건 안 받고, 새 워크트리는 push된 base에서 끊는다.
그래서 옵트인 키 한 줄을 켤지 안 켤지 결정은 운영 조건에 따라 다르다. 게이트웨이를 안 쓰면 첫 번째 환경 변수는 켜지 않는다. 워크트리를 직접 만들지 않으면 두 번째 설정도 만지지 않는다. 두 키 모두 안 켜진 채로 문제없는 환경을 디폴트로 두고, 필요한 경우에만 켠다.
settings.autoMode.hard_deny와 plan mode의 allow rule 누수 fix

같은 12 patch에 권한 잠금장치 두 가지가 도착했다. 옵트인 회귀와 다른 카테고리다. 새로 추가된 방어다.
2.1.136이 한 auto mode 룰을 추가했다. CHANGELOG 원문은 Added settings.autoMode.hard_deny for auto mode classifier rules that block unconditionally regardless of user intent or allow exceptions (settings.autoMode.hard_deny를 추가했다. user intent와 allow exception을 무시하고 무조건 막는 auto mode classifier 룰).
hard_deny는 auto mode 분류기에 무조건 거부 규칙을 추가한다. 이전엔 룰이 deny라 해도 사용자가 Yes, run it anyway(그래도 실행한다) 같은 확인을 주면 통과했고, allow 룰이 더 우선이면 그 룰이 deny를 덮었다. hard_deny가 있으면 두 예외를 모두 잠근다. admin이 "위험한 동작은 어떤 상황에도 안 한다"라는 룰을 적어 두면 사용자가 그 룰을 우회할 수 없다.
같은 2.1.136이 plan mode의 누수도 잠갔다. CHANGELOG 원문은 Fixed plan mode not blocking file writes when a matching Edit(...) allow rule exists (Edit(...) allow rule이 매칭될 때 plan mode가 file write를 안 막던 버그를 fix).
plan mode는 "읽기 전용 모드"라는 약속이다. 그 약속을 깨던 escape가 있었다는 뜻이다. Edit(...) allow 룰이 매칭되면 plan mode가 그 file write를 통과시켰는데, 2.1.136부터 plan mode가 더 위에 있다. allow 룰이 매칭돼도 plan mode 안에서는 file write가 안 일어난다.
두 fix의 방향이 같다. 사용자가 admin 룰을 위로 못 넘긴다와 plan mode의 안전 약속을 다른 룰이 못 깬다. 옵트인 회귀가 자동 디폴트의 후퇴였다면, 이 두 fix는 권한 모델의 추가 방어다. 같은 묶음에 같이 들어왔다.
그 외 사용자 체감 fix 한 묶음

나머지 네 가지 fix는 설정을 직접 바꾸지는 않지만 매일 쓰는 환경에서 바로 보인다.
hooks가 받는 $CLAUDE_EFFORT (2.1.133). CHANGELOG 원문은 Hooks now receive the active effort level via the effort.level JSON input field and the $CLAUDE_EFFORT environment variable, and Bash tool commands can read $CLAUDE_EFFORT (hook이 이제 effort.level JSON 입력 필드와 $CLAUDE_EFFORT 환경 변수로 활성 effort 단계를 받는다. Bash tool 커맨드도 $CLAUDE_EFFORT를 읽을 수 있다). hook 작성자는 effort 단계에 따라 다른 동작을 적을 수 있다. 한 hook 안에서 xhigh일 때는 더 자세한 로그를 남기고, medium일 때는 가벼운 점검만 돌리는 분기가 가능해졌다.
CLAUDE_CODE_SESSION_ID Bash 환경 변수 (2.1.132). CHANGELOG 원문은 Added CLAUDE_CODE_SESSION_ID environment variable to the Bash tool subprocess environment, matching the session_id passed to hooks (CLAUDE_CODE_SESSION_ID 환경 변수를 Bash tool 서브프로세스 환경에 추가했다. hook에 전달되던 session_id와 같은 값이다). 한 세션 안에서 Bash 커맨드가 자기가 어떤 세션에서 굴러가는지 안다. 외부 도구로 세션별 로그를 모을 때 한 단계 분기가 줄어든다.
MCP OAuth refresh race fix 묶음 (2.1.128 / 2.1.132 / 2.1.133 / 2.1.136). MCP 서버 여러 개를 동시에 쓰는 사람한테 매일 재인증하던 자국이 사라졌다. 사용자가 만질 키는 없고, 시스템 안정성 fix다. 옵트인 회귀와는 다른 카테고리다.
1-hour 프롬프트 캐시 TTL 다운그레이드 fix (2.1.129). 직전 시리즈의 ENABLE_PROMPT_CACHING_1H에 따라온 fix다. CHANGELOG 원문은 Fixed 1-hour prompt cache TTL being silently downgraded to 5 minutes (1시간 프롬프트 캐시 TTL이 조용히 5분으로 내려가던 문제를 고쳤다). 환경 변수가 켜져 있어도 TTL이 몰래 5분으로 바뀌던 동작을 fix했다. 캐시 동작 자체는 직전 글에서 다뤘다.
옵트인 회귀 패턴 자체가 신호다
12 patch 안에 자동 디폴트 두 개가 옵트인으로 돌아왔다. 자동 디폴트로 한 번 배포하고 → 실사용 문제를 확인한 뒤 → 환경 변수나 설정 키로 좁히는 회귀 패턴이 같은 묶음에 두 번 등장했다.
다음 묶음에서 새 자동 디폴트가 또 들어오면 한 번 더 옵트인 게이트가 따라올 가능성이 높다고 본다. 단정은 안 한다. 다만 같은 패턴이 12 patch 안에 두 번 도착했다는 사실은 그대로다.
운용으로 옮기면 이렇다. release note가 도착할 때마다 게이트웨이, 워크트리, auto mode, plan mode 네 곳의 키 상태를 한 번씩 다시 본다. 새 환경 변수가 들어오면 자동 디폴트를 되돌린 변경인지 먼저 확인한다. CHANGELOG 첫 한 줄에 was automatic in...(이전에는 자동이었다)이 적혀 있으면 그 신호로 본다.
참고 자료
- Claude Code CHANGELOG (raw): 이 글이 추적하는 1차 출처
- 2.1.128 항목:
EnterWorktreebase를 로컬HEAD로 바꾸고,--channels콘솔 인증 지원, MCP 'workspace' 예약 이름 도입 - 2.1.129 항목: 게이트웨이
/v1/modelsdiscovery 옵트인 회귀,--plugin-url플러그인 fetch,CLAUDE_CODE_FORCE_SYNC_OUTPUT, 1-hour 캐시 TTL fix - 2.1.132 항목:
CLAUDE_CODE_SESSION_IDBash env var,CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN, ENABLE_PROMPT_CACHING_1H Bedrock/Vertex 400 fix - 2.1.133 항목:
worktree.baseRef설정 도입,sandbox.bwrapPath/sandbox.socatPath,parentSettingsBehavioradmin tier, hooks가 받는effort.level+$CLAUDE_EFFORT - 2.1.136 항목:
settings.autoMode.hard_denyauto mode 룰, plan modeEdit(...)allow rule 누수 fix,CLAUDE_CODE_ENABLE_FEEDBACK_SURVEY_FOR_OTEL텔레메트리 키, MCP OAuth refresh race fix 묶음 worktree.baseRef설정 문서: 워크트리 base 옵션 정의 위치ANTHROPIC_BASE_URL환경 변수 문서: 게이트웨이 라우팅 셋업
시리즈: Claude Code CHANGELOG 추적
- Part 1 (2.1.108): 캐시 플래그가 조용히 꽂힌 이유
- Part 2 (2.1.109~2.1.114): 6번 업데이트 모음
- Part 3 (2.1.116~2.1.123): /usage 4탭 통합과 비대화 자동화
- Part 4 (2.1.126): 프로젝트 상태를 한 줄로 비우기
- Part 5 (2.1.128~2.1.138): 두 디폴트가 옵트인으로 돌아왔다 ← 현재 글









