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

#Claude Code#Anthropic#CHANGELOG#ANTHROPIC_BASE_URL#worktree#auto mode#plan mode
1714자
18분

2.1.126의 자동 디폴트 두 개 (게이트웨이 /v1/models discovery, EnterWorktree -> local HEAD) 가 2.1.129와 2.1.133에서 옵트인 키 (CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY 환경 변수, worktree.baseRef 설정) 뒤로 옮겨간 walkback 흐름을 양쪽 패널로 비교한 그림

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가 환경 변수로 옮겨갔다

ANTHROPIC_BASE_URL 게이트웨이 환경에서 /model 피커가 2.1.126~2.1.128까지 게이트웨이 /v1/models 응답을 자동으로 따라가다가 2.1.129부터 CLAUDE_CODE_ENABLE_GATEWAY_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>로 다시 들어왔다

EnterWorktree의 base 변천을 세 시점 timeline으로 정리한 그림 — 2.1.126까지 origin/default 브랜치에서 끊고, 2.1.128부터 로컬 HEAD에서 끊고, 2.1.133의 worktree.baseRef 설정 fresh 디폴트로 다시 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까지는 EnterWorktreeorigin/<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 설정을 추가했다. 이 설정은 freshhead 두 값을 받는다. --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 (디폴트 freshEnterWorktree의 base를 다시 origin/<default>로 돌린다. 2.1.128부터 로컬 HEAD였던 동작이다. push 하기 전 commit을 새 워크트리에 끌어가고 싶으면 worktree.baseRef: "head"로 명시한다).

2.1.133이 세 워크트리 동작 (--worktree 플래그, EnterWorktree 도구, agent-isolation 워크트리)을 한 설정 키 뒤로 묶었다. 디폴트 freshorigin/<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.bwrapPathsandbox.socatPath managed settings를 추가했다. Linux/WSL에서 커스텀 bubblewrap과 socat 바이너리 위치를 지정한다). 워크트리 자체와는 다른 영역이지만 같은 묶음의 권한·격리 정리 흐름이다. 두 영역(워크트리 base와 sandbox 바이너리 위치) 모두 기본값 + 명시 옵션 구조로 들어왔다.

사용자가 만질 환경 변수와 설정 키

/model 피커의 게이트웨이 모델 목록과 EnterWorktree의 base 두 옵트인 키를 한 4-column 표로 묶은 도식 — 동작·옵트인 키·디폴트·켜면 동작 4행으로 정리

12 patch 안에 두 곳에 옵트인 키가 도착했다. 두 키는 켜는 위치와 디폴트 동작이 다르다.

동작옵트인 키디폴트켜면
/model 피커의 게이트웨이 모델 목록CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 환경 변수first-party Anthropic 정적 모델 목록게이트웨이의 /v1/models 응답을 따른다
EnterWorktree / --worktree / agent-isolation 워크트리 baseworktree.baseRef: "head" 설정origin/<default>에서 끊는다로컬 HEAD에서 끊고 unpushed commit을 끌어간다

표만 보고도 운용이 끝난다. 사내 게이트웨이를 끼고 굴리는 환경이면 환경 변수를 켠다. 워크트리에 unpushed commit을 끌어가고 싶으면 설정을 켠다. 둘 다 디폴트는 안전 쪽이다. 게이트웨이 응답을 무조건 안 받고, 새 워크트리는 push된 base에서 끊는다.

그래서 옵트인 키 한 줄을 켤지 안 켤지 결정은 운영 조건에 따라 다르다. 게이트웨이를 안 쓰면 첫 번째 환경 변수는 켜지 않는다. 워크트리를 직접 만들지 않으면 두 번째 설정도 만지지 않는다. 두 키 모두 안 켜진 채로 문제없는 환경을 디폴트로 두고, 필요한 경우에만 켠다.

settings.autoMode.hard_deny와 plan mode의 allow rule 누수 fix

2.1.136에 같이 도착한 권한 모델 잠금장치 두 개를 두 패널로 보여주는 도식 — 왼쪽 settings.autoMode.hard_deny가 user intent와 allow exception을 무시하고 BLOCKED를 강제하는 흐름, 오른쪽 plan mode가 Edit allow rule이 매칭돼도 file write를 막는 흐름

같은 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 네 가지를 4-quadrant 그리드로 묶은 도식 — hooks가 받는 effort.level과 $CLAUDE_EFFORT, Bash subprocess의 CLAUDE_CODE_SESSION_ID, MCP OAuth refresh race fix 묶음, 1-hour 프롬프트 캐시 TTL silent downgrade 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 항목: EnterWorktree base를 로컬 HEAD로 바꾸고, --channels 콘솔 인증 지원, MCP 'workspace' 예약 이름 도입
  • 2.1.129 항목: 게이트웨이 /v1/models discovery 옵트인 회귀, --plugin-url 플러그인 fetch, CLAUDE_CODE_FORCE_SYNC_OUTPUT, 1-hour 캐시 TTL fix
  • 2.1.132 항목: CLAUDE_CODE_SESSION_ID Bash env var, CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN, ENABLE_PROMPT_CACHING_1H Bedrock/Vertex 400 fix
  • 2.1.133 항목: worktree.baseRef 설정 도입, sandbox.bwrapPath / sandbox.socatPath, parentSettingsBehavior admin tier, hooks가 받는 effort.level + $CLAUDE_EFFORT
  • 2.1.136 항목: settings.autoMode.hard_deny auto mode 룰, plan mode Edit(...) allow rule 누수 fix, CLAUDE_CODE_ENABLE_FEEDBACK_SURVEY_FOR_OTEL 텔레메트리 키, MCP OAuth refresh race fix 묶음
  • worktree.baseRef 설정 문서: 워크트리 base 옵션 정의 위치
  • ANTHROPIC_BASE_URL 환경 변수 문서: 게이트웨이 라우팅 셋업

시리즈: Claude Code CHANGELOG 추적

YouTube 영상

채널 보기
AI는 왜 수백 차원의 벡터를 사용할까? 고차원 공간과 행렬 | 선형대수학
AI는 데이터를 어떻게 분류할까? 벡터의 거리와 KNN 알고리즘 | 선형대수학
트라이(Trie)를 이용한 자동 완성 알고리즘 | Trie 자료구조 이야기
벡터의 정의와 덧셈 연산 | 선형대수학
트라이(Trie) 자료구조: 파이썬으로 삽입(Insert) 연산 구현하기 | Trie 자료구조 이야기
투영과 예측, 그리고 선형 결합 | 선형대수학
AI를 위한 선형대수학 - 소개 | 선형대수학
행렬의 기본 연산 - 행렬 덧셈, 스칼라 곱, 전치 | 선형대수학