세줄요약
Opus 4.6의 1M 컨텍스트 윈도우가 Max/Team/Enterprise에서 기본 제공으로 풀렸다. MCP Elicitation으로 서버가 작업 도중 사용자한테 직접 질문을 던질 수 있게 됐고, sparse worktree로 모노레포에서 필요한 디렉토리만 체크아웃한다. 200K에서 리소스 관리하던 시대가 끝나고, 이전에 불가능했던 걸 시도하는 시대가 열렸다.
3월 12일까지의 업데이트를 정리한 지 이틀 만에 두 버전이 더 나왔다.
v2.1.75와 v2.1.76. 이틀 사이에 들어온 변화가 작지 않다. Opus 4.6의 1M 컨텍스트 윈도우가 기본 제공으로 풀렸고, MCP 서버가 작업 도중 사용자한테 직접 질문을 던질 수 있게 됐다.
이전 3편에서 "200K 컨텍스트 안에서 리소스를 어떻게 분배할 것인가"를 썼는데, 200K가 아니라 1M이 됐다. 이야기의 전제가 바뀌었다.
Opus 4.6, 1M 컨텍스트가 기본이다
이전까지 1M 컨텍스트는 extra usage를 켜야 쓸 수 있었다. 일반적으로는 200K가 기본이고, 더 쓰려면 추가 토큰을 소모하는 구조였다.
v2.1.75에서 Max, Team, Enterprise 플랜의 Opus 4.6 사용자는 별도 설정 없이 1M 컨텍스트를 쓴다.
claude --version
# 2.1.75 이상이면 자동 적용
# 별도 설정 불필요
이게 뭘 바꾸는가. 이전 글에서 /context로 토큰 프로파일링하고, Summarize from here로 히스토리를 압축하고, MCP 도구를 비활성화해서 공간을 확보하는 이야기를 했다. 200K에서는 이 최적화가 생존의 문제였다. 1M에서는 여유의 문제가 된다.
대규모 코드베이스를 통째로 컨텍스트에 올릴 수 있다. UE5 프로젝트에서 Slate 커스텀 위젯의 헤더 파일 10개를 한꺼번에 열어놓고 "이 위젯들 사이의 의존성을 분석해줘"가 가능하다. 200K에서는 3~4개가 한계였다.
Agent Teams와 합치면 더 강력하다. 리더 에이전트가 프로젝트 전체 구조를 컨텍스트에 올리고, 서브에이전트에게 구체적인 작업을 분배하는 식이다. 컨텍스트가 넉넉하니까 리더가 "아 이 파일 뭐였더라"하고 다시 읽을 필요가 없다.
다만 1M 컨텍스트가 공짜는 아니다. 컨텍스트가 클수록 응답 레이턴시가 늘어난다. 간단한 작업에 1M을 꽉 채울 이유는 없다. 이전 글의 비유를 빌리면, 프레임 버짓이 16.6ms에서 83ms로 늘어난 거지 무한이 된 게 아니다. 필요한 만큼만 쓰되, 상한이 여유로워진 것.
비활성화도 가능하다.
export CLAUDE_CODE_DISABLE_1M_CONTEXT=1
# 200K로 돌아감
레이턴시에 민감한 작업이나 비용을 아끼고 싶을 때.
MCP Elicitation — 서버가 사용자한테 질문한다
이건 구조적으로 큰 변화다.
이전까지 MCP 서버는 도구를 제공하고, Claude가 그 도구를 호출하는 단방향이었다. 서버가 사용자한테 뭔가를 물어보는 채널이 없었다. API 키가 필요하면? 환경변수에 미리 넣어놓거나, Claude가 추측하거나, 실패하거나.
MCP Elicitation은 서버가 작업 도중에 사용자한테 구조화된 입력을 요청할 수 있게 한다. 대화형 다이얼로그로 폼 필드가 뜨거나, 브라우저 URL로 리다이렉트된다.
# 흐름 예시
# 1. Claude가 MCP 서버의 도구를 호출
# 2. 서버: "이 작업에 대상 브랜치명이 필요합니다"
# 3. 사용자한테 폼 다이얼로그가 뜸 → 입력
# 4. 서버가 입력을 받아서 작업 계속
게임 서버에서 클라이언트-서버 상호작용과 비슷하다. 이전까지는 서버가 fire-and-forget 방식으로 결과만 돌려줬는데, 이제 서버가 클라이언트(사용자)한테 request-response를 보낼 수 있다. 양방향 통신이 된 거다.
Elicitation 훅과 ElicitationResult 훅이 같이 들어왔다.
{
"hooks": {
"Elicitation": {
"command": "node scripts/log-elicitation.js"
},
"ElicitationResult": {
"command": "node scripts/validate-elicitation-result.js"
}
}
}
Elicitation 훅은 서버가 입력을 요청할 때 발화된다. 요청 내용을 로깅하거나, 특정 서버의 요청을 필터링할 수 있다. ElicitationResult는 사용자가 응답한 후 발화되어, 응답이 서버로 돌아가기 전에 가로채거나 오버라이드할 수 있다.
자동화 시나리오에서 유용하다. /loop으로 반복 작업을 돌리는데 MCP 서버가 중간에 입력을 요청하면? ElicitationResult 훅에서 미리 정의한 응답을 자동으로 넣어주면 된다.
-n / --name — 시작할 때 바로 이름
이전 글(3편)에서 /remote-control --name으로 세션에 이름을 붙이는 기능을 다뤘다. v2.1.76에서 이게 일반 세션으로 확장됐다.
claude -n "Ether Blog"
# 또는
claude --name "Gongnog Feature-Auth"
Remote Control이 아닌 일반 세션에서도 이름이 붙는다. 여러 터미널에서 Claude Code를 동시에 돌릴 때 "이 터미널이 뭐 하는 세션이지?"를 즉시 알 수 있다.
프롬프트 바에 세션 이름이 표시되는 기능도 v2.1.75에서 들어왔다. /rename으로 붙인 이름이 항상 눈에 보인다.
worktree.sparsePaths — 모노레포에서 필요한 것만
대규모 모노레포에서 claude --worktree를 쓰면 전체 레포를 체크아웃한다. 레포가 10GB라면 10GB를 복사한다.
worktree.sparsePaths 설정으로 필요한 디렉토리만 sparse-checkout으로 가져올 수 있다.
// .claude/settings.json
{
"worktree": {
"sparsePaths": [
"packages/my-service",
"libs/shared",
"configs"
]
}
}
claude --worktree
# → packages/my-service, libs/shared, configs만 체크아웃
# → 나머지는 건너뜀
UE5 프로젝트처럼 Content 폴더만 수십 GB인 경우, 코드 디렉토리(Source/)만 체크아웃하면 worktree 생성이 몇 초로 줄어든다.
--worktree 시작 성능도 개선됐다. git refs를 직접 읽고, 리모트 브랜치가 로컬에 이미 있으면 git fetch를 건너뛴다.
PostCompact 훅
compaction이 완료된 후 발화하는 훅이 추가됐다.
{
"hooks": {
"PostCompact": {
"command": "echo \"[$(date)] Compacted. Tokens saved.\" >> .claude/compact-log.txt"
}
}
}
compaction 후에 메모리를 업데이트하거나, 요약 내용을 외부 시스템에 전송하거나, 로그를 남기는 데 쓸 수 있다. 이전에는 compaction이 언제 일어났는지 알 방법이 없었다. auto-compaction이 조용히 돌다가 중요한 컨텍스트가 날아가도 모르고 지나쳤는데, 이제 훅으로 추적 가능하다.
auto-compaction에도 안전장치가 생겼다. 연속 3번 실패하면 서킷 브레이커가 작동해서 더 이상 재시도하지 않는다. 이전에는 무한 재시도.
/color — 세션에 색을 입힌다
모든 사용자에게 /color 커맨드가 개방됐다.
/color blue
/color red
/color green
프롬프트 바에 색상이 표시된다. 여러 세션을 동시에 돌릴 때 시각적으로 구분하는 용도다. 이전에는 이름만으로 구분했는데, 색까지 붙으면 터미널 탭을 훑어볼 때 "파란색이 블로그, 빨간색이 Gongnog"처럼 직감적으로 찾을 수 있다.
--name과 조합하면 이렇게 된다.
# 터미널 1
claude -n "Ether Blog"
/color blue
# 터미널 2
claude -n "Gongnog"
/color green
# 터미널 3
claude -n "LAMDice"
/color red
메모리 파일 타임스탬프
자동 메모리 파일에 last-modified 타임스탬프가 붙는다.
이전에는 메모리가 "이 프로젝트는 Prisma를 쓴다"와 "이 프로젝트는 Drizzle로 마이그레이션 중이다"를 동시에 갖고 있으면, 어떤 게 최신인지 Claude가 알 수 없었다. 두 정보가 충돌하면 랜덤하게 하나를 골랐다.
타임스탬프가 붙으면서 Claude가 "Drizzle 마이그레이션 메모가 더 최신이니까 이걸 기준으로 하자"고 판단할 수 있다. 메모리가 쌓일수록 오래된 정보와 최신 정보의 충돌이 많아지는데, 이걸 자동으로 해결해준다.
훅 소스 표시
권한 프롬프트에서 해당 훅이 어디서 온 건지 표시된다.
# 이전
⚠️ Hook wants to run: node scripts/check.js
Allow? [y/n]
# 이후
⚠️ Hook wants to run: node scripts/check.js
Source: plugin (my-linter-plugin)
Allow? [y/n]
settings에서 직접 설정한 건지, 플러그인에서 온 건지, 스킬에서 온 건지 구분된다. 플러그인이 많아지면 "이 훅이 대체 어디서 튀어나온 거야?"가 빈번해지는데, 소스가 표시되면 신뢰 판단이 훨씬 쉬워진다.
그 외 개선들
v2.1.76에서 백그라운드 에이전트를 킬하면 부분 결과가 대화 컨텍스트에 보존된다. 이전에는 킬하면 에이전트가 작업한 내용이 통째로 사라졌다. 한참 돌아간 에이전트를 중단해도 그때까지의 결과를 살릴 수 있다.
모델 폴백 알림이 verbose 모드가 아니어도 항상 보이게 됐다. 모델 이름도 raw ID 대신 사람이 읽기 편한 이름으로 표시된다. 블럭쿼트 가독성이 다크 테마에서 개선돼서 텍스트가 이탤릭 + 왼쪽 바로 표시된다. 이전에는 dim 처리라 거의 안 보였다.
Remote Control 세션 제목이 "Interactive session" 대신 첫 프롬프트에서 추출된다. clipboard 복사가 tmux over SSH 환경에서도 동작하도록 개선됐다.
/effort 가 정식 슬래시 커맨드 메뉴에 등록돼서 자동완성으로 찾을 수 있다. /voice는 활성화 시 현재 STT 언어를 표시하고, 설정된 언어가 지원되지 않으면 경고를 보여준다.
macOS에서 MDM이 아닌 머신의 시작 성능이 개선됐다. 불필요한 서브프로세스 스폰을 건너뛴다.
이틀의 무게
v2.1.75와 v2.1.76 사이는 하루다. 하루 만에 MCP Elicitation 같은 구조적 변경이 들어왔다.
3월 업데이트 전체를 돌아보면, Agent Teams로 멀티 에이전트를 짜고, /loop으로 반복 자동화하고, 자동 메모리로 컨텍스트를 유지하고, ultrathink으로 중요한 순간에 풀파워를 쓰고, HTTP 훅과 스킬로 외부 시스템을 연결하고, 이제 1M 컨텍스트에 MCP Elicitation까지.
CLI 도구 하나가 할 수 있는 일의 범위가 아니다. 이건 개발 플랫폼이다.
"컨텍스트가 5배 커졌다고 5배 더 많이 넣는 게 아니다. 이전에 불가능했던 걸 시도하는 거다."
Top comments (0)