본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 16. 07:39

하네스를 너무 키워버린 Claude Code가 순정 Claude Code에게 패배하는 「naked codex 현상」 —— 자기 진단과 대처법

요약

Claude Code를 사용하며 규칙(규칙, 스킬, hook)을 지속적으로 추가할수록 'naked codex 현상'이라는 역설적인 문제에 직면하게 됩니다. 이는 설정 파일과 스킬이 LLM의 컨텍스트 윈도우를 과부하하여, 모델이 지시사항의 우선순위를 오판하고 전반적인 성능 저하 및 느린 응답 속도를 초래하기 때문입니다. 본 기사는 이 현상의 원인을 분석하고, `CLAUDE.md` 행수(권장 160~180행), 스킬 건수(권장 30건 이하) 등의 구체적인 진단 지표와 함께, 오래되거나 중복된 규칙을 주기적으로 정리하고 아카이브하는 '재고 조사'의 중요성을 강조합니다.

핵심 포인트

  • Claude Code 설정 과부하로 인한 'naked codex 현상'은 성능 저하의 주요 원인이다.
  • 컨텍스트 윈도우에 쌓이는 방대한 지시서(규칙, 스킬, hook)는 LLM의 주의력과 토큰을 압박한다.
  • 성능 유지를 위해 `CLAUDE.md` 행수와 활성 스킬 건수를 주기적으로 점검하고 최적화해야 한다.
  • 오래된 '과거 인시던트 대응 규칙'은 제거 대상이며, 명확한 기준에 따라 설정을 정리하는 것이 필수적이다.

Claude Code를 사용하면 할수록 어떤 사실을 깨닫게 된다. CLAUDE.md에 규칙을 추가하고, 스킬을 늘리고, hook을 심는다. 처음에는 "이것으로 완벽하다"라고 느낀다. 하지만 몇 달 후, 왠지 모르게 태스크의 완료 품질이 떨어지거나, Claude 스스로가 지시를 따르지 않는 케이스가 늘어나고 있다.

이를 필자는 **「naked codex 현상」**이라고 부르고 있다.

두껍게 튜닝된 Claude Code가, 아무것도 설정하지 않은 순정 Claude Code에게 패배하는 상태.

본 기사에서는 이 현상이 왜 발생하는지, 어떻게 자기 진단을 하는지, 그리고 실제 대처법을 해설한다.

Claude Code는 기동 시 프로젝트 루트와 ~/.claude/ 하위의 파일군을 읽어 들여, 그것을 「컨텍스트 (Context)」로 가진 상태에서 태스크를 처리한다. 이 초기 로드에 포함되는 것은 주로 다음과 같다.

  • CLAUDE.md (글로벌 + 프로젝트)
  • ~/.claude/skills/*/SKILL.md (활성 스킬 전건)
  • hook 스크립트 (SessionStart, PreToolUse, PostToolUse 등)
  • Agent 정의 · 스케줄 태스크 정의

이것들은 「LLM을 위한 지시서」로서 기능하지만, LLM의 컨텍스트 윈도우 (Context Window)에 직접적으로 파고든다는 문제가 있다.

규칙이 200행을 넘고, 스킬이 40건을 넘고, hook이 10개 이상이 되면, Claude Code는 매 턴마다 대량의 지시서를 「다시 읽고 나서」 응답을 생성한다. 이 처리 비용이 태스크 실행에 사용할 수 있는 토큰(Token)과 주의력(Attention)을 압박한다.

결과적으로:

  • 지시의 우선순위를 오판함 (방대한 CLAUDE.md 끝부분의 규칙이 무시됨)
  • 스킬의 트리거 판정이 모호해짐 (유사한 스킬이 늘어날수록 오작동이 증가함)
  • hook이 의도하지 않은 부작용을 일으킴 (컨텍스트가 비대해져 경고가 난무함)

이러한 상태가 겹친 상태는, 심플한 프로젝트에서 claude라고 입력했을 뿐인 신선한 세션 —— 이른바 「naked codex」 —— に 비해 명백히 품질이 떨어진다.

현상의 근본은, 하네스 (Harness, 설정군)가 한 방향으로만 성장한다는 점에 있다.

Claude Code는 뛰어난 코딩 어시스턴트이지만, 자신의 CLAUDE.md를 마음대로 삭제하거나 오래된 스킬을 아카이브하지는 않는다. 추가는 자율적으로 제안하지만, 삭제나 정리는 인간으로부터의 명시적인 지시가 없으면 실행하지 않는다.

이로 인해 다음과 같은 패턴이 반복된다:

태스크가 실패한다
→ 규칙 추가로 커버 (`CLAUDE.md` +10행)
→ 다른 케이스에서 실패
...

각 추가는 국소적으로는 올바른 판단이다. 하지만 쌓이게 되면 전체적으로는 기능하지 않게 된다. 이는 소프트웨어의 「Big Ball of Mud」 안티 패턴 그 자체다.

naked codex 현상인지 아닌지를 판정하는 지표와 기준치를 제시한다.

wc -l ~/.claude/CLAUDE.md
행수판정
〜180행건전
...

Anthropic은 400행 이하를 권장하고 있다. 필자의 환경에서는 256행이 되어 있었으며, 목표인 160~180행을 크게 초과하고 있다는 사실이 월간 점검에서 발각되었다.

ls ~/.claude/skills/ | wc -l
건수판정
〜30건건전
...

스킬은 SKILL.md가 전부 컨텍스트에 로드되는 것은 아니지만, 트리거 판정 로직이 늘어날수록 오작동 · 미작동의 노이즈가 늘어난다.

cat ~/.claude/settings.json | python3 -c "
import json, sys
d = json.load(sys.stdin)
...
"

hook은 LLM 컨텍스트에 직접 들어가지 않지만, 각 도구 호출에 개입하기 때문에 실행 지연과 예기치 않은 블록의 원인이 된다.

필자 환경의 실측치:

  • PreToolUse: 6건 (Bash · TeamCreate · Agent · Edit/Write · Grok · Firecrawl 각각에 개별 훅)
  • PostToolUse: 3건
  • SessionStart/Stop/PreCompact/PostCompact: 각 1건
    합계 14건

PreToolUse가 6건이라는 것은, 매번 도구를 호출할 때마다 최대 6건의 매칭 판정이 돌아간다는 것을 의미한다.

claude

claude를 실행한 후 첫 번째 응답(first response)이 돌아오기까지의 체감 시간이 3초를 넘어가기 시작한다면 주의해야 한다. 이는 SessionStart 훅(hook) 처리, 초기 파일 로드, 스킬 인덱스(skill index) 스캔이 겹친 결과이다.

월간 재고 조사를 실시하여 다음 기준에 따라 삭제한다:

삭제해도 좋은 규칙:

  • 「~하지 말 것」 계열의 네거티브 규칙(negative rule) 중, 최근 30일간 위반 사례가 없는 것
  • 「자세한 내용은 → ~/.claude/docs/xxx.md 를 참조」라고 적혀 있으며 실체가 별도 파일에 있는 것 (참조처로 완전히 위임 가능)
  • 특정 프로젝트(PJ)의 로컬 CLAUDE.md로 옮겨야 하는 것 (글로벌일 필요가 없음)

실제로 필자가 재고 조사에서 자주 발견하는 것은 「과거의 인시던트(incident) 대응 규칙」이다. 인시던트가 발생한 순간에는 중요해 보이지만, 6개월 후에는 아무도 밟지 않는 함정을 위해 3줄이 소비되고 있다.

# 최종 수정일을 확인하여 오래된 규칙을 식별하는 참고 커맨드
git log --follow -p ~/.claude/CLAUDE.md | grep "^+" | head -50

스킬을 다음 3가지 분류로 나누어 정리한다:

분류정의건수 상한 기준
A: 본방 영향계외부 쓰기·자동 전송~10건
...

C로 분류되는 스킬은 「Gotchas도 없고, Eval도 없으며, 일회성으로 완결되는 것」이다. 이것들은 커맨드 파일(.claude/commands/)로 옮기거나 삭제하는 것이 정답이다. 스킬로서 유지할 만큼의 복잡성이 없다.

훅(hook)은 「어떻게 해도 LLM에 대한 지시로는 막을 수 없는 가드레일(guardrail)」에만 사용한다.

훅(hook)이 적절한 케이스:

  • 시크릿(secret) 유출 방지 (git add -A를 감지하여 차단)
  • 과금 API 오작동 방지 (확인되지 않은 상태에서 외부 LLM API를 호출하려고 할 때 차단)
  • Vault git 자동 푸시 (Stop hook으로 커밋을 트리거)

훅(hook)이 부적절한 케이스 (CLAUDE.md 규칙으로 충분함):

  • 「이 커맨드를 실행하기 전에 파일을 확인해 주세요」 → CLAUDE.md의 규칙으로 충분
  • 「완료되면 Slack에 알림을 보낸다」 → 스킬의 Eval 단계에서 실행해야 함
  • 「Bash를 실행하기 전에 로그를 남긴다」 → 대부분의 경우 불필요한 복잡성

월간 단위가 아니라 세션 시작 시 자동으로 체크할 수 있다면 이상적이다.

# ~/.claude/scripts/harness-health-check.sh
#!/bin/bash
set -e
...

이 스크립트를 SessionStart 훅(hook)에서 호출함으로써, 임계치를 넘는 순간 세션 시작 시 경고가 나오게 한다.

naked codex 현상의 해법은 「전부 삭제하고 원래대로 되돌리는 것」이 아니다. 적절하게 키운 하네스(harness)는 확실히 가치가 있다. 목표는 **「경량이며 정밀도가 높은 하네스」**이다.

필자가 실천하고 있는 원칙:

  • 삭제는 추가와 같은 빈도로 수행한다 — 무언가를 추가했다면 무언가를 아카이브(archive)한다.

  • 글로벌보다 먼저 로컬을 의심한다 — 그 규칙이 정말 모든 프로젝트(PJ)에 필요한가?

  • 규칙의 유효 기간을 의식한다 — 「이 인시던트로부터 N일이 지나면 삭제 후보」라고 기록한다.

  • 스킬은 발동 경로가 명확한 것만 — 「언젠가 쓸지도 모른다」는 넣지 않는다.

  • 훅(hook)은 최소한의 최후의 보루 — LLM의 지시로 막을 수 있는 것은 LLM에게 맡긴다

  • naked codex 현상: 하네스를 너무 키워버린 Claude Code가 순정 Claude Code에게 성능으로 패배하는 상태 — 원인은 CLAUDE.md·스킬·훅(hook)의 일방적인 축적에 의한 컨텍스트(context) 압박

  • 자기 진단은 「CLAUDE.md 행수 / 스킬 건수 / 훅(hook) 건수」의 3가지 지표로 정량화할 수 있음

  • 대처는 서지컬 삭제(surgical deletion)·스킬 3분류 정리·훅(hook)의 최소화의 조합

  • 월간 재고 조사를 CLAUDE.md 자체에 「context-drift-review」 키워드로 자동 리마인드시키면 지속하기 쉬움

Claude Code는 「설정하면 설정할수록 좋아지는」 도구가 아니다. 설정의 밀도와 정밀도를 유지하는 것이 장기적으로 높은 성능을 유지하는 열쇠다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0