> · 8 мин

Почему Claude Code тупеет после auto-compact — и что с этим делать

Почему Claude Code тупеет после auto-compact — и что с этим делать

Почему Claude Code тупеет после auto-compact — и что с этим делать

Работаешь с Claude Code два часа, всё идёт отлично: модель помнит архитектуру, понимает решения, дописывает код точно в стиле проекта. А потом в углу мелькает "Auto-compacting..." — и через минуту Claude как будто подменили. Переспрашивает то, что обсуждали час назад. Предлагает подходы, которые уже отвергли. Начинает переделывать готовый код.

Знакомо? Ты не один — это одна из самых обсуждаемых проблем Claude Code на Reddit и GitHub Issues.

TL;DR: Auto-compact сжимает контекст с потерями — теряются принятые решения, отвергнутые подходы и детали реализации. Новый чат с хорошим CLAUDE.md часто эффективнее, чем продолжение после компактизации. Но есть 6 конкретных приёмов, которые позволяют не доводить до этого.

Что происходит при auto-compact

Claude Code работает с контекстным окном модели — у Opus 4.6 это 1 000 000 токенов (у Sonnet — 200 000). По мере работы оно заполняется: твои сообщения, ответы Claude, содержимое прочитанных файлов, результаты команд, CLAUDE.md, скиллы, системные инструкции. Когда заполнение доходит до ~98%, срабатывает auto-compact — Claude суммаризирует всю историю разговора и начинает новую сессию с этим саммари вместо полной переписки.

Звучит разумно. На практике — это lossy compression. Вот что конкретно теряется:

  • Принятые решения и их причины. "Мы выбрали JWT вместо сессий, потому что..." — после компактизации Claude помнит, что используется JWT, но не помнит почему. И может предложить переделать на сессии
  • Отвергнутые подходы. Ты потратил 20 минут объясняя, почему не нужен Redux — а после compact Claude снова его предлагает
  • Контекст in-flight работы. Если compact сработал посреди задачи, Claude может потерять понимание, что именно он менял и зачем
  • Стиль и конвенции из разговора. Договорились писать тесты определённым образом — после compact это улетучивается

По исследованию SFEIR Institute, 82% потерь инструкций после компактизации — предотвратимы правильной конфигурацией.

Почему новый чат работает лучше

Контринтуитивно, но факт: чистый claude с нуля часто даёт лучший результат, чем продолжение после auto-compact. Причин три.

1. Свежий контекст = максимальная точность. По данным исследователей, LLM показывают пиковое качество при заполнении контекста ниже 50%. Opus 4.6 теряет 17 пунктов по метрике MRCR при переходе от пустого контекста к заполненному на 1M токенов. Новый чат стартует с заполнением 1-3%, а после compact — с 20-30%. Но даже на миллионном окне деградация реальна.

2. Саммари хуже оригинала. Compact создаёт текстовое резюме всей сессии. Но резюме — это интерпретация, а не факт. Claude может неточно передать нюанс решения, пропустить важное условие или исказить приоритеты. С каждой повторной компактизацией потери накапливаются — это называют "context rot".

3. CLAUDE.md перечитывается заново. При запуске нового claude файл CLAUDE.md загружается полностью и в начало контекста, где модель обращает на него максимум внимания. После compact CLAUDE.md тоже перечитывается, но в контексте уже лежит саммари, конкурирующее за внимание модели.

6 приёмов, чтобы не доводить до auto-compact

1. Мониторь контекст — /cost и /context

Команда /cost показывает текущее потребление токенов. По данным SFEIR, деградация качества начинается с 70% заполнения, а на 85%+ резко растёт частота галлюцинаций. Привычка проверять /cost каждые 15-20 минут позволяет вовремя среагировать.

/context покажет, что именно занимает место — часто это MCP-серверы, которые добавляют определения инструментов в каждый запрос. Одна команда /mcp покажет, сколько токенов тратит каждый сервер.

2. Ручной /compact с фокусом — вместо auto-compact

Главная проблема auto-compact — он срабатывает в 98%, когда уже поздно для качественной суммаризации. Ручной compact на 70% — совсем другое дело:

/compact focus on: 1) architecture decisions for auth module, 2) test patterns we established, 3) current task state

Конкретный промпт для /compact кардинально меняет качество саммари. Вместо того чтобы Claude сам решал, что важно, ты указываешь: сохрани решения, паттерны и текущий статус. По рекомендациям от ClaudeLog, стратегическая ручная компактизация сохраняет в 2-3 раза больше полезного контекста.

3. Всё важное — в CLAUDE.md, а не в чат

CLAUDE.md перечитывается при каждой компактизации и при каждом новом чате. Чат — нет. Поэтому всё, что должно пережить compact, должно жить в CLAUDE.md:

# Compact Instructions
- При компактизации ОБЯЗАТЕЛЬНО сохрани: архитектурные решения, паттерны тестирования, текущий статус задач
- Отвергнутые подходы и причины отказа — критически важны

# Architecture Decisions
- Auth: JWT + refresh tokens (НЕ сессии — причина: микросервисная архитектура)
- State: Zustand (НЕ Redux — причина: оверинжиниринг для нашего масштаба)

Секция "Compact Instructions" — официально рекомендуемый способ управлять тем, что сохраняется при компактизации.

4. Субагенты для изоляции контекста

Субагенты (Task tool) получают собственный чистый контекст, полностью изолированный от основной сессии. Их работа не раздувает твой контекст — обратно приходит только краткий результат.

Вместо того чтобы просить Claude в основном чате "прочитай все файлы в src/auth и разберись в архитектуре", делегируй это субагенту. Основной контекст останется чистым, а ты получишь сжатый ответ.

По оценкам из исследования hyperdev, грамотное использование субагентов даёт 84% сокращение потребления токенов при сохранении качества.

5. PreCompact hook — автоматический бэкап перед потерей контекста

PreCompact hook срабатывает прямо перед компактизацией — это последний шанс сохранить полный контекст. Context Recovery Hook — готовое решение, которое сохраняет структурированный бэкап сессии в markdown-файл:

{
  "hooks": {
    "PreCompact": [{
      "hooks": [{
        "type": "command",
        "command": "node .claude/hooks/ContextRecoveryHook/conv-backup.mjs",
        "async": true
      }]
    }]
  }
}

Бэкап включает: список изменённых файлов, принятые решения, статус задач, выполненные команды. После compact (или после /clear и нового чата) загружаешь этот markdown — и Claude восстанавливает контекст без потерь.

6. Паттерн "SESSION.md" — ручной чекпоинт каждые 30 минут

Идея из Dev.to: создай SESSION.md в корне проекта и обновляй его каждые 20-30 минут:

# Session State
## Active Goal
Рефакторинг auth модуля — переход на JWT

## Key Decisions
- JWT + refresh tokens (не сессии)
- Токены хранятся в httpOnly cookies (не localStorage)

## Rejected Approaches
- Redux для стейта — оверинжиниринг
- Passport.js — слишком много магии

## In Progress
- [x] JWT middleware написан
- [ ] Refresh token endpoint — в процессе, файл src/auth/refresh.ts

Два плюса: SESSION.md переживает любую компактизацию, и при старте нового чата ты просто говоришь "прочитай SESSION.md и продолжай".

Подводные камни

/compact с фокусом иногда теряет больше, чем без фокуса. Если ты указал "focus on auth decisions", Claude может агрессивно сократить всё остальное — включая контекст текущей задачи, если она не про auth. Фокус должен включать ВСЁ важное, а не только одну тему.

PreCompact hook не спасает от мгновенного compact. Начиная с версии 2.0.64, компактизация стала мгновенной. Если hook тяжёлый (пишет большой файл, делает API-запросы), compact может завершиться раньше, чем hook. Флаг async: true решает проблему частично — hook доработает в фоне, но compact уже произойдёт.

Полное отключение auto-compact — рискованная стратегия. Можно выключить через claude config set -g autoCompactEnabled false, но тогда при достижении лимита контекста Claude просто упадёт с ошибкой prompt_too_long. Это работает только если ты дисциплинированно делаешь ручной /compact или /clear до достижения лимита. По данным GitHub issue #6689, 73% пользователей не управляют компактизацией самостоятельно.

Бесконечный цикл компактизации — реальный баг. Issue #2222 описывает ситуацию, когда auto-compact зацикливается: компактизация не уменьшает контекст достаточно, срабатывает снова, и так по кругу. Индикатор показывает NaN%. Решение — /clear и новый чат. Баг был закрыт как NOT_PLANNED, но в новых версиях встречается реже.

Вердикт

Из шести приёмов три дают реальный эффект: ручной /compact с фокусом на 70% заполнения, вынос решений в CLAUDE.md с секцией "Compact Instructions", и субагенты для тяжёлых операций с файлами. Эти три вещи вместе практически устраняют проблему неожиданного auto-compact.

SESSION.md и PreCompact hook — продвинутые техники для длинных сессий (2+ часа непрерывной работы). Если твои сессии обычно укладываются в час — CLAUDE.md и ручной compact достаточно.

А если auto-compact уже сработал и Claude "поплыл" — честно, быстрее открыть новый claude с хорошим CLAUDE.md, чем пытаться восстановить контекст в текущей сессии. Это не баг — это разумная стратегия.

Как попробовать

  1. Добавь в CLAUDE.md секцию "Compact Instructions" с перечнем того, что нужно сохранять при компактизации — архитектурные решения, паттерны, отвергнутые подходы

  2. Проверяй /cost каждые 15-20 минут. Как только контекст перевалил за 70% — запускай ручной compact:

/compact preserve: architecture decisions, test patterns, current task state, rejected approaches
  1. Пересмотри MCP-серверы — запусти /mcp и отключи те, которые не используешь прямо сейчас. Каждый MCP-сервер добавляет определения инструментов в каждый запрос

  2. Делегируй тяжёлые операции субагентам — чтение больших файлов, исследование кодовой базы, поиск по документации. Основной контекст остаётся чистым

  3. Документация: управление контекстом, снижение расхода токенов, настройка хуков

$ ls ./related/

Похожие статьи

subscribe.sh

$ cat /dev/blog/updates

> Свежие заметки о программировании,

> DevOps и AI — прямо в мессенджер

./subscribe