Контекстное окно как ресурс

Каждая сессия Claude Code начинается с пустого контекстного окна — ограниченного пространства (обычно 200 000 токенов), в котором живёт вся активная информация: системный промпт, CLAUDE.md, авто-память, результаты инструментов, ваши сообщения и ответы Claude. Когда окно заполняется, начинают происходить неприятные вещи: Claude теряет контекст ранних частей разговора, начинает «забывать» детали, хуже следует инструкциям.

Важно понимать, что контекстное окно — это не резиновый мешок. Это дефицитный ресурс, которым нужно управлять активно.


Что загружается до первого сообщения

Прежде чем вы напечатали хоть слово, в контекст уже загружено несколько тысяч токенов:

Старт сессии (≈7 000–8 000 токенов)
────────────────────────────────────
Системный промпт            ~4 200 т  (всегда, невидим)
Авто-память (MEMORY.md)       ~680 т  (первые 200 строк / 25 KB)
Информация об окружении       ~280 т  (CWD, ОС, git-ветка)
MCP-инструменты (отложенно)   ~120 т  (только имена, схемы загружаются потом)
Описания skills               ~450 т  (только один-лайнеры)
~/.claude/CLAUDE.md           ~320 т  (глобальные настройки)
project CLAUDE.md           ~1 800 т  (инструкции проекта)

И только после этого появляется ваше первое сообщение. Каждый прочитанный файл, каждый вывод команды, каждый ответ Claude — всё это добавляется поверх.

flowchart TD A["Системный промпт\n~4 200 т"] --> B["Авто-память MEMORY.md\n~680 т"] B --> C["Окружение (OS, git)\n~280 т"] C --> D["MCP инструменты (имена)\n~120 т"] D --> E["Описания skills\n~450 т"] E --> F["~/.claude/CLAUDE.md\n~320 т"] F --> G["project CLAUDE.md\n~1 800 т"] G --> H(["Первое сообщение пользователя"]) H --> I["Чтение файлов\n+1 500–3 000 т / файл"] I --> J["Вывод команд\n+300–1 500 т"] J --> K["Ответы Claude\n+500–2 000 т"] K --> L{"Контекст заполняется?"} L -- "Нет" --> H L -- "Авто" --> M["Авто-компакт\n(удаляет старые выводы → сводка)"] L -- "/compact" --> N["/compact\n(структурированная сводка)"] L -- "/clear" --> O["/clear\n(чистый лист)"] M --> H N --> H style A fill:#6B6964,color:#fff style B fill:#E8A45C,color:#fff style C fill:#6B6964,color:#fff style D fill:#9B7BC4,color:#fff style E fill:#D4A843,color:#fff style F fill:#6A9BCC,color:#fff style G fill:#6A9BCC,color:#fff style H fill:#558A42,color:#fff style I fill:#8A8880,color:#fff style J fill:#A09E96,color:#fff style K fill:#D97757,color:#fff style M fill:#D97757,color:#fff style N fill:#D97757,color:#fff style O fill:#4A6E8A,color:#fff
flowchart TD
    A["Системный промпт\n~4 200 т"] --> B["Авто-память MEMORY.md\n~680 т"]
    B --> C["Окружение (OS, git)\n~280 т"]
    C --> D["MCP инструменты (имена)\n~120 т"]
    D --> E["Описания skills\n~450 т"]
    E --> F["~/.claude/CLAUDE.md\n~320 т"]
    F --> G["project CLAUDE.md\n~1 800 т"]
    G --> H(["Первое сообщение пользователя"])
    H --> I["Чтение файлов\n+1 500–3 000 т / файл"]
    I --> J["Вывод команд\n+300–1 500 т"]
    J --> K["Ответы Claude\n+500–2 000 т"]
    K --> L{"Контекст заполняется?"}
    L -- "Нет" --> H
    L -- "Авто" --> M["Авто-компакт\n(удаляет старые выводы → сводка)"]
    L -- "/compact" --> N["/compact\n(структурированная сводка)"]
    L -- "/clear" --> O["/clear\n(чистый лист)"]
    M --> H
    N --> H

    style A fill:#6B6964,color:#fff
    style B fill:#E8A45C,color:#fff
    style C fill:#6B6964,color:#fff
    style D fill:#9B7BC4,color:#fff
    style E fill:#D4A843,color:#fff
    style F fill:#6A9BCC,color:#fff
    style G fill:#6A9BCC,color:#fff
    style H fill:#558A42,color:#fff
    style I fill:#8A8880,color:#fff
    style J fill:#A09E96,color:#fff
    style K fill:#D97757,color:#fff
    style M fill:#D97757,color:#fff
    style N fill:#D97757,color:#fff
    style O fill:#4A6E8A,color:#fff
Жизненный цикл контекстного окна: от загрузки до компакта

Как контекст нарастает в ходе работы

Прочтение файла на 500 строк — это \~1 500–2 000 токенов. Вывод npm test на 200 строк — ещё \~600. После часового сеанса отладки контекст легко занимает 40–60% окна — и это ещё до того, как что-то начнёт теряться.

Самые прожорливые источники:

  • Чтение файлов — и Claude читает их целиком, даже если нужна одна функция
  • Вывод команд — логи, результаты тестов, diff'ы
  • Инструменты хуков — через additionalContext в PostToolUse
  • Результаты поиска — grep и glob возвращают все совпадения

Посмотреть, что сейчас занимает место: команда /context прямо в сессии.

Проверь себя
Вы запускаете сессию Claude Code и сразу просите: «Прочитай README и расскажи об архитектуре». До вашего сообщения уже загружено ~7 000 токенов. Claude прочтёт README на 300 строк (~900 токенов). Что будет происходить с контекстом по мере работы, даже если вы не пишете много?

/compact: умное сжатие

/compact — главный инструмент для длинных сессий. Команда просит Claude создать структурированную сводку разговора, которая заменяет всю историю в контексте.

Что попадает в сводку:

  • Ваши запросы и намерения
  • Ключевые технические концепции
  • Изменённые файлы и важные фрагменты кода
  • Найденные ошибки и способы их исправления
  • Незавершённые задачи и текущий прогресс

Что теряется:

  • Полный вывод инструментов
  • Промежуточные рассуждения Claude
  • Точный код из прочитанных файлов (останутся «воспоминания» о нём, но не дословный текст)

После /compact Claude перечитывает CLAUDE.md с диска и реинжектирует его в контекст. Авто-память и системный промпт тоже восстанавливаются автоматически. Единственное исключение — список описаний skills: из него останутся только те навыки, которые вы реально использовали в сессии.

Фокусированный compact. Можно сказать Claude, что именно важно сохранить:

/compact сфокусируйся на изменениях в API аутентификации

Либо добавить секцию ## Compact Instructions прямо в CLAUDE.md — тогда эти инструкции будут применяться каждый раз при автоматическом компакте.

## Compact Instructions

При компакте всегда сохраняй:
- Точные имена изменённых файлов
- Все TODO, которые упоминались в разговоре
- Текущее состояние тестов (прошли / упали)
Проверь себя
После /compact что из перечисленного будет доступно Claude: (а) точный код файла auth.ts, который он читал час назад; (б) ваш запрос «разобраться с багом в авторизации»; (в) содержимое CLAUDE.md; (г) описания skills, которые Claude не использовал?

/clear: чистый лист

/clear полностью сбрасывает контекст — стартует новая сессия с чистого листа. Используется когда:

  • Текущая задача завершена, начинается принципиально другая
  • Контекст засорился настолько, что /compact уже не помогает
  • Вы хотите, чтобы Claude «посмотрел свежим взглядом» без груза предыдущих обсуждений

В отличие от /compact, /clear не создаёт никакой сводки. Разговор не сохраняется в контексте нового — только то, что обычно загружается в начале: CLAUDE.md, авто-память, окружение.


Быстрое повторение
Когда следует использовать /clear вместо /compact?

/rewind: шаг назад

Perед каждым редактированием файла Claude делает снимок (checkpoint). Нажатие Esc дважды возвращает сессию к состоянию до последнего изменения: файлы восстанавливаются, контекст откатывается.

Это не git — чекпоинты локальны и живут только в текущей сессии. Они не покрывают действия с удалёнными системами (деплой, запись в БД, отправка запросов к API). Для полноценной отмены таких операций используйте git.


Быстрое повторение
Как работает /rewind и что он откатывает?

Авто-компакт и «thrashing»

Kогда контекст приближается к пределу, Claude начинает автоматическое уплотнение: сначала удаляет старые результаты инструментов, затем создаёт сводку аналогично /compact. Вы увидите сообщение «Conversation compacted» в терминале.

Проблема возникает, если один файл или вывод команды настолько большой, что контекст заполняется снова сразу после компакта. Claude попробует несколько раз, и если ситуация не меняется — остановится с ошибкой «auto-compaction stopped». Что делать:

# Вариант 1: начать новую сессию и работать с меньшими файлами
claude --continue  # продолжить с тем, что сохранилось

# Вариант 2: разбить работу на субагента
# В сессии: «создай субагента, который прочитает файл X и вернёт только нужное»
Проверь себя
Вы работаете с монорепо. В директории `packages/backend/` есть свой CLAUDE.md с правилами для бэкенда. После /compact Claude начинает редактировать файлы бэкенда — применяет ли он правила из этого CLAUDE.md?

Практики гигиены контекста

Многие проблемы с «потерей нити» решаются не командами, а правильными привычками.

Один запрос — одна задача. Длинные сессии с переключением между несвязанными задачами засоряют контекст быстрее всего. Завершили задачу → /clear, начинаете следующую.

Не читайте всё подряд. Неточный промпт («посмотри на проект и исправь баг») заставляет Claude читать десятки файлов. Точный промпт («баг в src/auth/token.ts, строка \~120») сохраняет несколько тысяч токенов.

Субагент для тяжёлого исследования. Если задача требует прочесть 20 файлов — передайте её субагенту. Он работает в отдельном контексте; обратно вернётся только итоговая сводка, не вся история чтения. Подробнее — в статье \Субагенты и контекстная изоляция\.

Compact перед сложным новым этапом. Если вы закончили исследование и готовитесь к реализации — хороший момент для /compact focus on the plan we just created. Это «очищает доску», сохраняя именно то, что нужно для следующего шага.

CLAUDE.md вместо объяснений в чате. Если вы несколько раз объясняли Claude одно и то же правило (стиль именования, архитектурное ограничение) — значит, этому место в CLAUDE.md. После /compact объяснение из чата исчезнет, а CLAUDE.md перечитается заново.

Nested CLAUDE.md и компакт. Помните: project-root CLAUDE.md восстанавливается после компакта, а CLAUDE.md из поддиректорий — нет. Они загружаются снова только когда Claude следующий раз прочитает файл в той поддиректории. Это значит, что важные инструкции лучше держать в корневом файле, а не глубоко в дереве.


See also

Источники

  1. Claude Code — How Claude Code Works
  2. Claude Code — How Claude remembers your project (Memory)
  3. Claude Code — Explore the context window