Compaction в Claude Code: как работает сжатие контекста

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