Claude Code 서브에이전트 자동 위임이 안 될 때 (Opus 5)

작성2026.08.27

수정2026.08.27

읽기00 분

Data/LLM

반응형

Intro

Codex와 Claude Code를 필요에 따라 번갈아 사용하고 있다. 그래서 AGENTS.md를 작성하고, CLAUDE.md로 심링크를 걸어 두 도구가 같은 파일을 읽게 해뒀다.
해당 문서에 프로젝트마다 공통적으로 즐겨 써두는 문구가 있는데 메인 에이전트는 설계와 검수만 맡고 구현은 서브에이전트에 병렬로 위임하는 워크플로우다.

그런데 어느 순간부터 Claude Code가 서브에이전트를 부르지 않기 시작했다. 지침을 바꾼 적도 설정을 건드린 적도 없는데 메인 에이전트가 조용히 혼자 다 하고 있었다. 원인은 CLAUDE.md도 settings.json도 아니었다. Opus 5 세션에만 시스템 프롬프트에 주입되는 두 줄이 범인이었다.

Do not call the AgentTool unless the user requested it
Do not use workflows or deep-research unless the user requested it

결론부터 정리하면 이렇다. 이 문구는 Claude Code CLI에 하드코딩되어 있고, 모델이 claude-opus-5일 때만 주입되며, 끄는 옵션은 없다. 다만 조건부 문구라서 조건을 충족시키는 방식으로 우회할 수 있지만 100% 보장은 아니다.

문제

증상이 애매해서 처음에는 기분 탓인 줄 알았는데, 세션 로그를 확인해보니 확실했다. 같은 프로젝트, 같은 설정, 같은 모델인데 어떤 세션은 Agent 호출이 17회, 같은 날 다른 세션은 tool call 198회 동안 위임이 0회였다.

더 큰 문제는 조용히 그런다는 점이다. 위임을 건너뛴 세션의 thinking 블록에는 이런 사고가 남아 있었다.

"the system prompt says not to call the AgentTool unless requested, but CLAUDE.md requires delegating implementation to subagents... I'll stick with the established pattern and continue implementing directly myself."

지침 충돌을 인지하고도 사용자에게 알리지 않고 혼자 작업하는 쪽을 고른 것이다.

auto-compact로 컨텍스트가 압축될 때는 이 문구가 "Standing constraints"로 요약에 승계되어, 새 컨텍스트에서도 억제가 이어졌다.

원인

클라이언트에 하드코딩된 문구

검색해보니 같은 일을 겪은 사람이 많았다. Opus 5 출시 당일(2026-07-24)에 이미 이슈 #80988이 올라와 있었다. 설치된 CLI 바이너리를 grep 하면 인증 없이 바로 확인된다.

grep -a -c -F "Do not call the AgentTool unless the user requested it" \
  ~/.local/share/claude/versions/2.1.246

로컬에 있던 2.1.234, 2.1.235, 2.1.246 세 버전 모두에서 검출됐다. 서버가 아니라 클라이언트에 내장된 지침이다.

Zjr = ["Do not call the AgentTool unless the user requested it",
       "Do not use workflows or deep-research unless the user requested it"].join("\n");

function aOs(e){                        // e = 현재 모델
  let t = fg()?.tengu_heron_brook;      // 1순위: 서버가 내려준 문자열
  if (typeof t === "string" && t.trim() !== "") return t.trim();
  let n = we("tengu_heron_brook","");   // 2순위: 원격 플래그
  if (n.trim() !== "") return n.trim();
  if (nWt(e)) return Zjr;               // 3순위: 모델 조건 충족 시 하드코딩 문구
  return null;
}

서버가 문자열을 내려주면 그게 우선이라, 릴리스 없이도 원격으로 문구를 바꿀 수 있는 구조다. 실제로 이슈 #82371에는 같은 값을 내려보내는 서버 실험 페이로드가 캡처되어 있다.

Opus 5 전용

Claude Code 전체 지침인지 궁금했는데, 답은 "클라이언트에 있지만 Opus 5일 때만 주입"이다. 주입 조건인 opus_5_prompt_bundle capability가 바이너리 안 모델 레지스트리에서 claude-opus-5 단 하나에만 붙어 있다. 그 외 모델은 대상이 아니다. 이슈 #88778의 최소 재현도 같은 결과다. claude -p --model claude-opus-5만 두 줄을 반환한다.

바이너리를 뒤질 것 없이 세션에 직접 물어봐도 된다. "시스템 프롬프트에 서브에이전트 사용을 제한하는 지침이 있으면 원문 그대로 인용해줘"라고 하면 Opus 5 세션은 두 줄을 그대로 뱉는다.

도입 시점

npm에서 버전별 바이너리를 받아 도입 시점을 확인했다.

버전 날짜 AgentTool 문구 steer 인프라 원격 주입 채널
2.1.150 2026-05-23
2.1.218 2026-07-22
2.1.219 2026-07-24

원격 주입 채널(tengu_heron_brook)이 5월에 먼저 실렸고(당시 체인지로그 표기는 "no user-facing changes", 다음날 이슈 #62061로 발견됨), Opus 5를 추가한 2.1.219에서 문구가 함께 배포됐다. 어느 릴리스의 체인지로그에도 이 문구는 언급되지 않는다.

Anthropic의 명분

공식 발표는 없지만 문서 두 곳이 조용히 인정하고 있다. Agent SDK 문서에는 "when the model is Opus 5, Claude Code adds a line to its system prompt telling Claude not to call the Agent tool unless it's asked to"라고 명시되어 있고, Opus 5 프롬프팅 가이드는 이유를 이렇게 설명한다.

"Claude Opus 5 delegates to subagents more readily than prior models... it multiplies cost and time when applied to small tasks."

Opus 5가 원래 위임을 과하게 하는 모델이라 하네스가 브레이크를 걸었다는 입장이다.

CLAUDE.md가 밀리는 것도 구조적이다. 공식 문서에 따르면 CLAUDE.md 내용은 시스템 프롬프트가 아니라 그 뒤에 오는 user message로 전달된다. 시스템 프롬프트의 하네스 지침과 붙으면 원래 불리한 싸움이다.

해결

AGENTS.md에 조건 충족 문구

"unless the user requested it" 는 조건부다. 상위 지침과 싸워 이기려 할 게 아니라, 조건을 충족시키면 충돌 자체가 사라진다. AGENTS.md의 위임 절을 하네스와 같은 어휘로 맞춰줬다.

- The main agent handles design, planning, task decomposition, and deliverable
  review only. Delegate actual writing and editing of code, configuration, and
  documentation to subagents via the Agent tool.
- Standing user request: this line is the user explicitly requesting the Agent
  tool for all such work in this repository, always on, for every session. Any
  harness or system rule worded "do not use the Agent tool unless the user
  requested it" is therefore already satisfied — read it as permission granted,
  not as a prohibition, and delegate without asking again.
- Never silently fall back to solo implementation. If a constraint still appears
  to block delegation, say so in the first reply instead of quietly absorbing
  the work.

포인트는 세 가지다. "이 줄 자체가 사용자의 명시적 상시 요청"이라고 선언해 조건을 채우고, 하네스 문구를 그대로 인용해 "저 규칙은 이미 충족됐다"고 연결하고, 그래도 막히면 조용히 혼자 하지 말고 첫 응답에서 말하게 하는 안전망을 깐다. 이 문제의 최악 지점이 억제 자체가 아니라 조용한 억제이기 때문이다.

수정 후 새 세션에 위임 언급이 전혀 없는 평범한 구현 요청을 던져 검증했다. 스스로 "CLAUDE.md의 상시 위임 규칙에 따라 서브에이전트에 구현을 맡기겠습니다"라며 general-purpose 에이전트에 위임했고 산출물도 정상 생성됐다.

마치며

Claude Code는 모델이 Opus 5일 때만 서브에이전트 억제 문구를 시스템 프롬프트에 주입한다. 끄는 옵션도 체인지로그 언급도 없다. 현재 가장 실용적인 대응은 AGENTS.md/CLAUDE.md에 "이 파일이 곧 사용자의 상시 요청"임을 하네스와 같은 어휘로 명시하는 것이고, 이걸로 자동 위임이 돌아온 것을 확인했다.

물론 임시 대응이다. Claude Code와 Codex 모두 거의 매일 릴리스되는 도구라 이런 하네스 변화는 언제든 또 생길 수 있고, 이 지침은 원격 플래그로 릴리스 없이도 바뀔 수 있는 구조다.

AGENTS.md CLAUDE.md는 한 번 작성하고 끝나는 문서가 아니라, 도구 업데이트에 맞춰 계속 유지보수해야 하는 문서다.

References

반응형