Контекст - ограниченный ресурс, и понимать, что его заполняет, важнее любых трюков экономии. Расходуют его не только ваши сообщения: system prompt и встроенные инструменты, память и CLAUDE.md, схемы MCP-инструментов, если отключён tool search, прочитанные файлы и выводы команд, содержимое загруженных skills, изображения, summary и результаты субагентов, длинные логи ошибок. Команда /context показывает это заполнение - и с неё стоит начинать, когда работа замедлилась или подорожала.
При заполнении контекста срабатывает compaction - сжатие истории в summary. Автосжатие обычно включено, /autocompact задаёт окно, а /compact выполняет summary прямо сейчас. Перед сжатием полезно явно сказать, что сохранить: корневую причину, принятый контракт API, неизменяемые границы, падающий тест и текущий статус проверки. Иначе рискуете потерять при сжатии именно то, ради чего велась работа, - а восстановить это из summary уже нельзя.
У compaction есть цена, о которой редко думают. Оно создаёт новый префикс разговора и потому требует перестройки кэша; если старый кэш уже истёк, сама суммаризация может перечитать большой холодный history. Отсюда практика вызывать /compact на естественной границе задачи, а не посреди debug-трейса: сжатие в неудачный момент и дороже, и рискованнее для того контекста, который вам ещё нужен.
Полезно понимать, что сбрасывает кэш, а что сохраняет префикс, - это прямо влияет на стоимость. Кэш сбрасывают смена модели или effort, если меняется форма запроса, первое включение fast mode, подключение или отключение upfront MCP-инструментов, перезагрузка плагина, bare deny целого встроенного инструмента, сам /compact и обновление Claude Code, изменившее system prompt. Префикс же обычно переживают правки файлов, переключение permission mode, вызов skill, /recap и rewind к существовавшему префиксу.
Отдельно стоит запомнить контринтуитивную деталь: изменение CLAUDE.md в середине сессии не сбрасывает кэш, потому что оно вообще не применяется до clear, compact или перезапуска. Многие правят память и ждут, что агент сразу начнёт ей следовать, - но новый CLAUDE.md подхватится лишь на следующем префиксе. Это не баг, а следствие кэширования, и знать об этом нужно, чтобы не удивляться, почему "поправил инструкцию, а поведение прежнее".
Tool search резко снижает стартовый контекст для MCP. По умолчанию совместимые модели откладывают MCP-инструменты и подтягивают нужную схему через поиск - вместо того чтобы грузить все схемы наперёд. Это большая экономия, но она завязана на протокол: кастомный ANTHROPIC_BASE_URL или прокси, не пропускающий tool_reference-блоки, может её сломать, и тогда ENABLE_TOOL_SEARCH включают только если прокси точно поддерживает протокол.
Отслеживание расхода помогает не улетать в стоимость вслепую. /usage на подписке показывает лимиты плана и активность, но session cost там - не счёт. При API-биллинге ориентируются на usage провайдера или Console, а локальный расчёт воспринимают как оценку. Для скриптовых прогонов удобен bare-режим с output-format json: из ответа можно вытащить стоимость, usage и модель одним jq и агрегировать по прогонам, а не гадать.
Снижают расход, не ухудшая результат, вполне конкретными приёмами: держат CLAUDE.md коротким, а процедуры выносят в skills; используют path-scoped rules; не вставляют большие логи, а сохраняют файл и дают путь; ограничивают исследование конкретной точкой входа; отдают шумное чтение субагенту и возвращают summary; включают MCP tool search; начинают новую сессию под новую задачу; берут более дешёвую модель лишь там, где качество измерено. Узкий контекст - это и дешевле, и умнее, чем один огромный промпт.
# Сказать, что сохранить ДО сжатия
/compact Сохрани корневую причину, принятый контракт API,
неизменяемые границы, failing test и текущий статус проверки.
# Правка CLAUDE.md в середине сессии не применяется до clear/compact/restart# Оценить стоимость скриптового прогона
claude --bare -p "summarize README.md" --allowedTools Read --output-format json \
| jq '{cost:.total_cost_usd, usage:.usage, model:.model}'
# /usage на подписке - лимиты плана, а не счёт