Compaction в Claude Code: как работает сжатие контекста
У Claude Code есть скрытая механика, о которой мало кто задумывается, пока не потеряет из-за неё час работы. Compaction — автоматическое сжатие контекста, когда разговор подходит к лимиту токенов. Я столкнулся с этим, когда мой агент на 200-й минуте сессии "забыл" критическое правило из начала диалога. Стал разбираться — и вот что выяснил.
Что такое compaction и зачем оно нужно
Claude Code работает в терминале и ведёт длинные сессии. В отличие от ChatGPT, где каждое сообщение — отдельный запрос, Claude Code накапливает контекст: файлы, которые прочитал, команды, которые выполнил, результаты grep и diff. Всё это складывается в один огромный промпт.
Проблема: у моделей есть лимит контекстного окна. У Claude Sonnet — 200K токенов, у Opus — до 1M. Но даже миллион токенов заканчивается, если агент активно работает с кодовой базой. Compaction — это механизм, который сжимает историю разговора, когда контекст приближается к ~95% лимита.
По сути, Claude Code берёт всю текущую беседу, отправляет её в отдельный вызов модели с промптом "сожми это в ключевые факты" и заменяет полную историю на сжатое саммари. Ты этого не видишь — просто в какой-то момент агент начинает работать с "памятью" о прошлом, а не с полной записью.
Что сохраняется, а что теряется
По моему опыту, compaction хорошо сохраняет:
■ Текущую задачу и её контекст — над чем работаем прямо сейчас
■ Имена файлов, которые недавно редактировались
■ Последние ошибки и их решения
■ Общую архитектуру проекта
А вот что регулярно теряется:
▲ Инструкции из начала сессии — "не трогай этот файл", "используй такой формат"
▲ Промежуточные решения — почему выбрали подход А вместо Б
▲ Конкретные code snippets, которые обсуждались 50 сообщений назад
▲ Тонкие стилистические правила — "не добавляй emoji", "пиши без Co-Authored-By"
Это логично: compaction оптимизирует под "что делать дальше", а не "почему мы делали то, что делали". Контекст принятия решений — первая жертва сжатия.
Кастомный compaction prompt
Claude Code позволяет переопределить промпт сжатия. Это, мб, самая недооценённая настройка. В settings.json (путь: ~/.claude/settings.json) есть параметр:
{
"compactPrompt": "Preserve ALL rules from CLAUDE.md verbatim. Keep file paths, error messages, and architectural decisions. Summarize tool outputs but keep their conclusions."
}Я тестировал разные варианты. Дефолтный промпт — generic "summarize the conversation". Он нормально работает для коротких сессий, но для агентов, которые крутятся часами, нужно быть точнее.
Мой текущий вариант:
{
"compactPrompt": "When compacting, you MUST preserve:\n1. All rules and constraints from CLAUDE.md and system prompt — copy them verbatim\n2. Current task context and progress\n3. File paths that were modified\n4. Specific error messages and their solutions\n5. User corrections and preferences stated during the session\n\nYou MAY summarize:\n- Tool call outputs (keep conclusions, drop raw output)\n- File contents that were read (keep what was learned, drop the text)\n- Exploratory steps that led nowhere"
}Разница заметна. После переключения на кастомный промпт мои агенты перестали "забывать" правила из CLAUDE.md в длинных сессиях.
CLAUDE.md vs compaction: что куда класть
Главный инсайт, который я вынес за три месяца: не полагайся на compaction для критических правил. Всё, что агент обязан помнить всегда, должно жить в CLAUDE.md.
CLAUDE.md загружается в каждую сессию как системный промпт. Compaction его не трогает — он вне истории разговора. Это единственное место, которое гарантированно переживёт любое сжатие.
Моя стратегия:
■ CLAUDE.md — архитектурные правила, стиль кода, запреты, credential paths, naming conventions. Всё, что актуально для любой сессии
■ Контекст разговора — текущая задача, промежуточные результаты, обсуждения. Это ок потерять при compaction
■ Файлы в проекте — TODO.md, ARCHITECTURE.md, notes. Агент может их перечитать, если compaction потёр контекст
Правило: если ты ловишь себя на том, что повторяешь одну и ту же инструкцию агенту — вынеси её в CLAUDE.md. Это не для compaction, это для тебя.
Как понять, что compaction произошёл
В терминале Claude Code показывает компактный индикатор — строку вроде [context compacted]. Но если ты отвлёкся, легко пропустить. Более надёжный способ — следить за cost counter в правом нижнем углу. Резкий скачок стоимости (compaction — это отдельный API call) + сброс счётчика контекста = compaction только что случился.
Ещё один признак: агент начинает переспрашивать вещи, которые вы уже обсуждали. "В каком файле находится конфиг?" — хотя вы этот файл редактировали 20 минут назад. Это верный сигнал, что контекст сжался и детали потерялись.
Когда compaction создаёт проблемы
Реальный кейс из моей практики. У меня есть server-agent — Claude Code, который крутится 24/7 на VPS и отвечает в Telegram. Агент получает сообщение, обрабатывает, ждёт следующее. Сессия может длиться часами.
Проблема: после compaction агент "забывал" access control rules. У меня есть матрица доступа — какие файлы можно читать из какого чата. Эти правила были в начале промпта, но после сжатия модель их теряла и начинала отвечать на запросы, которые должна была блокировать.
Решение: я перенёс все security rules в CLAUDE.md (точнее, в CLAUDE.local.md, который загружается поверх основного). Теперь они в системном промпте, а не в истории — compaction их не затрагивает.
Практические советы
■ Настрой compactPrompt под свой workflow. Если работаешь с данными — проси сохранять SQL queries. Если пишешь статьи — проси сохранять стилистические правила
■ Держи сессии короткими, если задача позволяет. Новая сессия = чистый контекст + полный CLAUDE.md. Иногда лучше, чем длинная сессия с двумя compactions
■ Используй файлы как внешнюю память. Попроси агента записать ключевые решения в TODO.md или NOTES.md в проекте. После compaction он сможет их перечитать
■ CLAUDE.md — для всего критического. Правила, которые должны работать всегда — только туда. Не надейся, что compaction их сохранит. Подробнее о настройке CLAUDE.md я писал в гайде по настройке Claude Code
■ Тестируй compaction намеренно. Запусти длинную сессию, дождись сжатия, проверь — помнит ли агент правила из начала. Это сэкономит часы дебага потом
Compaction — не баг, это необходимый компромисс. Контекстные окна растут, но пока они конечны, сжатие будет частью работы с AI-агентами. Лучше понимать, как оно работает, чем удивляться, когда агент "забудет" важное правило на 200-й минуте.
Подписывайся на Telegram — @danokhlopkov