Claude Code ‘Autocompact is thrashing’ 오류 해결 방법
Claude Code에서 Autocompact is thrashing: the context refilled to the limit...가 나오면 모델이나 계정 한도부터 의심하기 쉽다. 하지만 Anthropic 공식 설명은 더 구체적이다. 자동 압축은 성공했지만, 직후에 큰 파일이나 도구 출력이 컨텍스트를 다시 가득 채우는 일이 여러 번 반복돼 Claude Code가 재시도를 멈춘 상태다. 같은 요청을 그대로 반복하지 말고 큰 입력을 잘라 읽고, 남길 정보를 지정해 /compact를 실행해야 한다.
이 오류가 뜻하는 것
Claude Code는 대화가 길어지면 이전 내용을 압축해 작업에 필요한 여유를 만든다. 문제는 압축 직후 같은 대용량 내용이 다시 들어오는 경우다. 예를 들어 다음 작업이 원인이 될 수 있다.
- 수만 줄짜리 로그 파일 전체를 매번 읽기
- 빌드 결과나 테스트 출력 전체를 대화에 붙이기
- 큰 JSON, lock 파일, 생성 코드를 통째로 열기
- 도구가 같은 대형 결과를 반복 반환하기
압축 자체가 실패한 것이 아니라, 압축으로 만든 공간이 즉시 다시 찬 것이다. Claude Code는 의미 없는 압축·재충전 루프가 API 호출을 낭비하지 않도록 중단한다. 따라서 ‘다시 해’라고만 보내면 같은 입력 경로를 반복해 오류가 재발하기 쉽다.
가장 먼저 할 복구 순서
현재 대화에서 계획과 수정 내용은 살리고 큰 출력만 버리고 싶다면 다음 순서로 처리한다.
1. 큰 파일 읽기를 중단하고 범위를 지정한다
이 파일을 읽어 줘 대신 함수명, 줄 범위, 오류 주변처럼 필요한 구간만 지정한다.
server.log 전체를 읽지 말고 마지막 오류가 발생한 시각 주변 200줄만 확인해 줘.
같은 스택 트레이스의 반복은 한 건으로 요약해 줘.
코드 파일도 마찬가지다. 저장소 전체나 생성 디렉터리를 다시 검색하기보다 경로와 심볼을 좁힌다.
src/auth/session.ts에서 refreshToken 함수와 그 호출부만 읽어 줘.
dist, node_modules, coverage는 검색하지 마.
2. 남길 내용을 직접 지정해 압축한다
공식 문제 해결 문서는 다음 예를 제시한다.
/compact keep only the plan and the diff
그대로 써도 되지만 현재 작업에 맞게 바꾸는 편이 낫다.
/compact keep the accepted plan, changed file paths, failing test name, and current diff; drop raw logs and previous search output
목적을 쓰지 않은 /compact보다 어떤 정보를 남기고 무엇을 버릴지 명시한 압축이 복구 뒤 작업을 이어 가기 쉽다. 압축 후에는 바로 같은 큰 파일을 다시 열지 말고, 다음 한 단계만 요청한다.
3. 대형 작업을 별도 컨텍스트로 보낸다
큰 파일 분석이 계속 필요하면 공식 문서의 권장대로 서브에이전트에 분리한다. 메인 대화에는 원본 전체가 아니라 결론, 근거가 있는 줄 범위, 필요한 수정 후보만 돌려받는다.
요청 예시는 다음과 같다.
별도 서브에이전트에서 logs/test.log를 구간별로 조사해 줘.
메인 대화에는 최초 실패 원인, 대표 스택 트레이스 1개, 관련 파일 경로만 요약해 줘.
원본 로그 전체는 반환하지 마.
4. 이전 대화가 더 이상 필요 없으면 /clear
계획이나 변경 상태를 보존할 필요가 없고 새 질문으로 시작해도 된다면 /clear가 가장 확실하다. 다만 아직 커밋하지 않은 변경 자체가 지워지는 명령은 아니더라도, 대화 속에서 합의한 계획과 설명은 잃는다. 실행 전에 현재 변경 파일과 다음 할 일을 짧게 파일로 남겨 두는 편이 좋다.
작업 유형별로 입력을 줄이는 방법
로그 분석
전체 로그 대신 오류 시각, 요청 ID, 예외 이름을 기준으로 먼저 검색한다. 그 결과에서 앞뒤 수십~수백 줄만 읽는다. 반복 스택은 횟수와 대표 사례 한 건으로 요약한다.
테스트 실패
전체 테스트 스위트 출력을 붙이지 않는다. 실패한 테스트 이름, 첫 번째 assertion 차이, 해당 테스트 파일만 전달한다. 필요하면 단일 테스트 명령을 실행해 짧은 재현 로그를 만든다.
대형 저장소 검색
node_modules, dist, build, coverage, 생성 파일처럼 사람이 수정하지 않는 디렉터리는 검색 대상에서 뺀다. ‘인증 코드를 찾아 줘’보다 패키지, 디렉터리, 함수 이름을 함께 지정한다.
큰 JSON과 데이터 파일
전체 파일을 읽히지 말고 키 목록, 스키마, 문제 레코드 몇 개만 추출한다. 데이터 변환이 필요하면 Claude가 원본을 대화로 가져오는 대신 스크립트를 작성하고 로컬에서 집계하도록 요청한다. 대화에는 집계 결과만 남긴다.
오류가 사라져도 다시 발생하는 이유
/compact는 공간을 만들 뿐 원인이 된 명령을 바꾸지 않는다. 압축 직후 에이전트가 같은 대형 파일을 다시 전부 읽으면 컨텍스트는 또 찬다. 복구 메시지에는 반드시 재발 방지 조건을 넣는다.
앞으로 파일 하나에서 한 번에 300줄을 넘겨 읽지 마.
명령 출력이 길면 원문 전체를 가져오지 말고 오류와 마지막 100줄만 요약해.
추가 범위가 필요하면 먼저 이유와 읽을 구간을 알려 줘.
이런 제한은 모델 성능을 낮추는 것이 아니라 작업 단위를 작게 만든다. 필요한 구간이 분명한 디버깅에서는 오히려 같은 로그를 반복 읽는 시간을 줄인다.
thrashing이 아닌 다른 문제인지 확인하는 법
명령이 멈췄지만 정확한 thrashing 문구가 없다면 원인이 다를 수 있다. Anthropic은 Claude Code 안에서 /doctor, 프로그램이 시작되지 않을 때는 셸에서 claude doctor를 실행해 설치·설정·확장·컨텍스트 사용을 진단하라고 안내한다. 플러그인, MCP 서버, hook 때문에 CPU나 메모리가 계속 높다면 다음처럼 안전 모드로 시작해 비교할 수 있다.
claude --safe-mode
안전 모드는 해당 세션에서 사용자 정의 요소를 끈다. 이 상태에서 문제가 사라지면 큰 파일만의 문제가 아니라 플러그인, MCP 서버, hook 쪽을 따로 점검한다. 단순 멈춤이라면 Ctrl+C로 현재 작업을 취소하고, 터미널을 다시 열어 같은 디렉터리에서 claude --resume으로 세션을 이어 갈 수 있다는 안내도 공식 문서에 있다.
복구가 끝났는지 확인하는 기준
오류 메시지가 사라진 것만 보지 않는다. 다음 작업에서 Claude Code가 읽는 범위가 실제로 작아졌는지 확인한다.
/compact지시에 계획·diff·실패 테스트명처럼 남길 항목이 구체적으로 들어갔는가- 로그는 시간·요청 ID·예외 이름으로 먼저 좁혔는가
- 큰 파일은 줄 범위나 함수 단위로 읽는가
- 서브에이전트가 원본 전체 대신 요약과 근거 위치만 반환하는가
- 같은 대형 도구 출력이 압축 직후 다시 들어오지 않는가
이 오류의 해법은 컨텍스트 크기를 억지로 늘리는 것이 아니라, 한 번의 대화에 원본을 모두 쌓지 않는 것이다. 계획과 diff는 남기고, 재생성 가능한 로그와 검색 결과는 버리면 현재 세션을 포기하지 않고도 대부분 복구할 수 있다.