> · 10 мин

Контекстное окно AI-агента — почему Claude Code тупеет на 50% заполнения и 7 способов это исправить

Контекстное окно AI-агента — почему Claude Code тупеет на 50% заполнения и 7 способов это исправить

Контекстное окно AI-агента: почему Claude Code тупеет на 50% заполнения и 7 способов это исправить

Миллион токенов контекста звучит как бесконечность. На практике Claude Code начинает терять хватку задолго до лимита: забывает решения, принятые в начале сессии, путает имена файлов и уверенно предлагает подход, который вы отвергли двадцать сообщений назад.

TL;DR: Качество ответов Claude Code деградирует с ростом контекста. По исследованию Chroma, точность извлечения информации падает при каждом увеличении контекста, а эффект «потерянного в середине» снижает точность на 30%+ для информации в центре диалога. Ниже 7 конкретных приёмов, которые держат контекст чистым и агента в тонусе.

Куда уходят токены

Прежде чем оптимизировать, нужно понять, на что тратится контекст. Часть окна занята ещё до вашего первого сообщения:

  • Системный overhead: ~33K токенов на внутренности Claude Code
  • MCP-серверы: каждый подключённый сервер (Playwright, postgres-client) загружает определения инструментов при каждом запросе
  • CLAUDE.md: инструкции проекта включаются в каждое сообщение
  • Файлы памяти: auto-memory и кастомные заметки
  • История диалога: каждое сообщение, включая блоки кода и вывод команд

За 4 часа работы легко потратить 40-50% окна, даже если кажется, что вы ничего тяжёлого не делали. Один grep по большой кодовой базе, cat файла на 500 строк, упавший тест с длинным стек-трейсом. Всё это накапливается.

Context rot: что говорят исследования

Термин «context rot» ввела инженерная команда Anthropic: контекст это «конечный ресурс с убывающей отдачей». Вот конкретные цифры.

По бенчмаркам MRCR v2, Claude Opus 4.6 извлекает правильный ответ в 93% случаев при 256K токенов. При полном миллионе эта цифра падает до 78.3%. Звучит неплохо, пока не посчитаешь задачи, где модели нужно одновременно помнить несколько фактов. Три связанных факта при 78.3% точности каждого дают 48% общего успеха (0.783³). Пять фактов, что типично для кросс-файлового рефакторинга, это уже 29.4%.

Исследование JetBrains на 250-ходовых траекториях агентов (SWE-bench Verified) показало кое-что контринтуитивное: простое маскирование старых результатов инструментов (замена содержимого placeholder-ами) работает не хуже LLM-суммаризации и обходится на 52% дешевле. LLM-суммаризация неявно удлиняла траектории агента на 13-15%, потому что стирала сигналы естественной остановки.

Практическое наблюдение из анализа 25+ реальных сессий Claude Code:

  • 0-20% заполнения: надёжная работа, модель честно говорит о неуверенности
  • 20-40%: начинается деградация, пробует неправильные подходы до проверки документации, но исправляется сама
  • 40-60%: ненадёжно. Уверенные ошибочные выводы, фабрикует объяснения, перестаёт самокорректироваться
  • 60-80%: ранние факты становятся недоступны, модель генерирует правдоподобные замены
  • 80-100%: безвозвратно. Повторяющиеся действия, неспособна интегрировать корректировки

Четыре последовательных агента, которым поручили аудитировать работу предыдущего, каждый правильно диагностировал чужие ошибки. И через 15 минут демонстрировал те же самые.

Скрытая обрезка: то, о чём Anthropic молчит

Если бы context rot был единственной проблемой, его можно было бы решить дисциплиной. Но есть нюанс: Claude Code тихо обрезает контекст, даже когда вы далеко от лимита.

После утечки исходников Claude Code в конце марта 2026 сообщество обнаружило как минимум три скрытых механизма в src/services/compact/:

Microcompact (microCompact.ts). Если пауза между сообщениями превышает порог (задаётся через серверный GrowthBook), старые результаты инструментов заменяются на [Old tool result content cleared]. Без уведомления, без срабатывания хуков.

Tool result budget (applyToolResultBudget()). Агрегатный лимит ~200K токенов на все результаты инструментов плюс per-tool caps: Grep ограничен 20K, Bash 30K, глобальный 50K на отдельный результат. По данным пользователя @ArkNill, в одной сессии было зафиксировано 261 событие обрезки бюджета: результаты чтения файлов сокращались с тысяч символов до 1-41 символа.

Session memory compact (sessionMemoryCompact.ts). Запускается перед автокомпактизацией, оставляет только ~40K токенов недавних сообщений.

Ключевая проблема: DISABLE_AUTO_COMPACT=true отключает только автокомпактизацию. Microcompact и tool result budget работают на каждом API-вызове вне зависимости от настроек. Параметры контролируются серверными GrowthBook-флагами, которые Anthropic может менять без обновления CLI.

Один из пользователей на Reddit описал экстремальный workaround: export CLAUDE_CODE_DISABLE_1M_CONTEXT=1, то есть отключить миллионное окно и вернуться к 200K. По его словам и по отзывам в комментариях, Claude после этого стал заметно адекватнее. Гипотеза: при меньшем окне модель плотнее «держит внимание» на том, что есть.

7 стратегий управления контекстом

1. Мониторьте контекст через /context

Команда /context показывает разбивку по компонентам:

system overhead:        33K
MCP servers:            12K (Playwright, postgres-client)
CLAUDE.md:              18K
memory files:            8K
conversation history:  142K
free space:            787K
total usage:           213K (21% of 1M window)

Запускайте каждые 30 минут в длинных сессиях. Когда usage переваливает за 50%, пора действовать. По рекомендации spacecake.ai, 60% это красная зона, после которой качество заметно падает.

2. Используйте .claudeignore агрессивно

.claudeignore работает как .gitignore, исключает файлы из поиска и запрещает чтение. По оценке spacecake.ai, хорошо настроенный ignore-файл снижает контекст на 40-70% на каждое сообщение.

node_modules/
dist/
build/
.git/
.next/
venv/
__pycache__/
*.log
*.tmp
coverage/

Начните с очевидного и добавляйте исключения, только если Claude реально нуждается в каком-то файле.

3. /compact с фокусом, не дожидаясь автокомпактизации

/compact сжимает историю диалога, сохраняя ключевые решения. Но по умолчанию Claude сам решает, что важно, а что нет. Это ненадёжно: по отзывам на Reddit, один пользователь сменил подход к задаче на полпути, после автокомпактизации Claude откатил всё обратно к старому подходу.

Используйте /compact с явным фокусом:

/compact "Keep the API design decisions and the database schema, summarize the debugging session"

Запускайте на естественных точках останова: фича готова, баг починен, модуль закончен. Не ждите предупреждения о заполнении.

4. /clear между задачами: не потеря, а перезагрузка

/clear обнуляет историю полностью. Файлы, код, коммиты всё на месте, стирается только диалог.

Эвристика: если следующая задача не зависит от последних 20 сообщений, жмите /clear. Перед этим зафиксируйте результат: git commit, обновите CLAUDE.md или напишите краткое summary в первом сообщении новой сессии.

По рекомендации MindStudio, разбивка длинного проекта на короткие сессии один из самых надёжных способов поддерживать качество.

5. Держите CLAUDE.md под 300-500 строк

CLAUDE.md загружается в каждое сообщение. Раздутый файл на 2000 строк это постоянный налог на контекст.

Что оставить:

  • Конвенции: язык, фреймворк, именование
  • Ограничения: что нельзя ломать
  • Ссылки на документацию (не саму документацию)

Специализированные инструкции переносите в skills: они загружаются только при вызове.

У memory-файлов тоже есть жёсткий лимит: по данным BSWEN, после 200 строк MEMORY.md содержимое не читается. Если ваш файл длиннее, последние строки невидимы для Claude.

6. Субагенты: отдельный контекст для каждой задачи

Субагенты (spawn через Agent tool) получают собственное контекстное окно. Результат возвращается в основную сессию как компактное резюме, а не полная история.

Вместо одной длинной сессии, которая одновременно читает файлы, пишет тесты и рефакторит:

  • Один субагент пишет тесты
  • Другой ищет паттерны в кодовой базе
  • Третий рефакторит реализацию

Основной агент оркестрирует и мёржит результаты. По словам пользователя xAdakis на Reddit, оркестраторный подход с Sonnet для главного агента и Haiku для подзадач решает проблему потери контекста при компактизации.

Минус: субагенты дороже по токенам. Используйте для независимых, параллельных задач, не для мелочей, где overhead не окупается.

7. Указывайте точные файлы вместо «поищи в проекте»

Разница огромна:

  • Дорого: «Найди, где мы обрабатываем аутентификацию». Claude грепнет несколько файлов, каждый целиком попадёт в контекст
  • Дёшево: «Проверь src/auth/middleware.ts, функцию validateToken». Один точечный read

То же с логами ошибок: не вставляйте 300 строк вывода. Обрежьте до стек-трейса и пары строк вокруг ошибки.

Если просите Claude писать тесты в существующем файле, попросите написать только test-кейсы без setup/teardown бойлерплейта. Если стайл-гайд не требует inline-комментариев, попросите не писать их. Каждый комментарий это токены.

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

/compact с фокусом иногда теряет контекст решений. Вы пишете "keep API decisions", а Claude интерпретирует это по-своему. По отзывам на Reddit, пользователь сменил подход к задаче, а после компактизации Claude тихо вернулся к старому. Решение: фиксировать ключевые решения в файлы (CLAUDE.md, git commit message), а не полагаться на контекст.

Microcompact работает даже при DISABLE_AUTO_COMPACT=true. По данным из GitHub Issue #42542, tool result budget (агрегатный лимит 200K на результаты инструментов) обрезает содержимое на каждом API-вызове. Счётчик токенов может показывать 80K при миллионном окне, но это не «80K использовано», это «остальное тихо удалено». На апрель 2026 нет env-переменной, которая отключает этот механизм.

--continue и --resume наследуют раздутый контекст. Если предыдущая сессия была длинной, --continue подхватит весь накопленный контекст. Иногда эффективнее стартануть свежую сессию с коротким summary в первом сообщении, чем тянуть за собой хвост из 500K токенов.

.claudeignore не работает ретроактивно. Файлы, уже прочитанные в текущей сессии, остаются в контексте. Добавление файла в .claudeignore в середине сессии не удалит его из контекста, только предотвратит повторное чтение.

1M контекст может быть хуже 200K. По обсуждению на Reddit, несколько пользователей заметили улучшение качества после CLAUDE_CODE_DISABLE_1M_CONTEXT=1. Но это недокументированная переменная, и её поведение может измениться.

Вердикт

Из всех стратегий три дают максимальный эффект при минимальных усилиях: .claudeignore (разовая настройка, экономия 40-70% на каждое сообщение), /clear между несвязанными задачами (бесплатная перезагрузка) и мониторинг через /context (30 секунд, чтобы понять, пора ли сжиматься). Субагенты мощный инструмент, но с overhead по токенам, их стоит включать на больших задачах. Скрытые механизмы обрезки контекста (microcompact, tool result budget) это текущая реальность Claude Code, с которой пока приходится жить. Следите за Issue #42542, Anthropic пока не ответил, но давление сообщества растёт.

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

  1. Создайте .claudeignore в корне проекта. Начните с node_modules/, dist/, .git/, coverage/, *.log. Эффект увидите на первом же запросе.

  2. Запустите /context прямо сейчас в текущей сессии. Посмотрите, сколько съедают MCP-серверы и CLAUDE.md. Отключите неиспользуемые серверы через /mcp.

  3. Попробуйте /compact "keep only: [ваши ключевые решения]" после завершения текущей подзадачи. Сравните качество с предыдущими компактизациями без фокуса.

  4. Заведите привычку /clear между задачами. Перед этим git commit с описательным сообщением. Новую сессию начинайте с одного абзаца контекста: что делали, что дальше.

  5. Документация: Context engineering guide от Anthropic, Context rot research от Chroma, команда /context в подробном разборе.

$ ls ./related/

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

subscribe.sh

$ cat /dev/blog/updates

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

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

./subscribe