Правила изоляции для экономии 80% токенов сеанса при исправлении устаревшего кода с помощью Claude Code
Если разработчик с опытом работы менее года, создающий продукт в одиночку, применяет Claude Code к огромной устаревшей кодовой базе, его бюджет токенов исчерпывается менее чем за час. В компании нет старших разработчиков, у которых можно было бы спросить совета, и, изучив лишь базовые команды CLI и открыв терминал, вы будете продолжать получать уведомления о списании средств с карты.
Claude Code не сохраняет состояние диалога на сервере. Системный промпт, файл конфигурации проекта CLAUDE.md, накопленная история диалога и результаты вызовов инструментов каждый раз упаковываются в единый полезный нагрузочный блок (payload) и отправляются обратно в API Anthropic. На 1–2 ходу сразу после начала сеанса этот объем держится в пределах 15 000 токенов, но как только агент начинает сканирование и считывает результаты сборки или десятки тысяч строк логов, нагрузка вырастает до 80 000 токенов. После 6–10 ходов на каждый ход начинает уходить от 120 000 до 200 000 токенов. Это структура, при которой стоимость каждого хода рассчитывается по сложным процентам.
Официальные расценки Anthropic на кэширование промптов делают причину еще более очевидной. Если сохраняется один и тот же контекст префикса, вам придется платить всего 10% от стоимости базовых входных токенов. С другой стороны, если агент нерегулярно считывает десятки тысяч строк кода и кэш-префикс разрушается, то в соответствии с лимитом времени жизни (TTL) в 5 минут добавляются новые затраты на создание кэша в размере 1.25x. Именно поэтому всего после нескольких поисковых запросов фиксируются суммы, которые трудно потянуть в одиночку.
.claudeignore не работает
Многие разработчики успокаивают себя, создавая файл .claudeignore в корневом каталоге. Подводя итог сразу: в официальном движке CLI Claude Code такого файла конфигурации не существует. Подход, при котором в CLAUDE.md прописано «не читать папку с логами», модели игнорируют, как только сочтут это необходимым.
Чтобы физически заблокировать доступ агента к файлам на уровне движка, необходимо использовать настройку permissions.deny в файле .claude/settings.json.
Сначала заблокируйте результаты сборки и файлы безопасности в .claude/settings.json в корне проекта.
json { "permissions": { "deny": [ "Read(./.env*)", "Read(./secrets/**)", "Read(**/node_modules/**)", "Read(**/dist/**)", "Read(**/build/**)", "Read(**/coverage/**)", "Read(**/target/**)", "Read(**/*.log)", "Read(**/*.map)", "Read(legacy-backups/**)", "Edit(**/dist/**)", "Write(**/dist/**)" ], "ask": [ "Bash(git push *)", "Bash(npm publish)", "Bash(rm -rf *)" ], "allow": [ "Read", "Edit", "Bash(npm test)", "Bash(npm run lint)", "Bash(git status)", "Bash(git diff *)" ] } }
Чтобы предотвратить захват кода фронтенда при доработке серверной логики, выделите отдельный локальный файл конфигурации .claude/settings.local.json.
json { "permissions": { "deny": [ "Read(apps/web/**)", "Read(frontend/**)", "Read(public/**)", "Edit(apps/web/**)", "Write(apps/web/**)" ] } }
Также необходимо помешать агенту выводить крупные логи целиком в терминал с помощью таких команд оболочки, как cat или head. Перехватывайте команды заранее, настроив хук PreToolUse в .claude/settings.json.
json { "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "bash", "args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/block-large-reads.sh"] } ] } ] } }
Создайте файл .claude/hooks/block-large-reads.sh и предоставьте права на выполнение с помощью chmod +x.
`bash
#!/usr/bin/env bash
PAYLOAD=(cat)COMMAND=(echo "$PAYLOAD" | jq -r '.tool_input.command // empty')
if echo "$COMMAND" | grep -Eq '(cat|head|tail|less)\s+.*(.log|.map|.lock|dist/|build/)'; then
echo "Обнаружен прямой вывод крупного файла, выполнение прервано." >&2
exit 2
fi
exit 0
`
Возврат кода завершения 2 (Exit code 2) на уровне процессов ОС немедленно останавливает вывод файлов агентом. Блокировка ненужного сканирования файлов снижает потребление токенов на начальных ходах более чем в два раза.
Запрет полного перезаписывания файлов и передача данных на уровне функций
Если позволить агенту заново переписывать целый устаревшй файл размером более 1000 строк ради изменения одной переменной, это приведет к багам и растрате выходных токенов. Внутри Claude Code разделены инструмент Write, перезаписывающий файлы целиком, и инструмент Edit, заменяющий только определенные блоки строк.
Правила модификации должны быть жестко зафиксированы в CLAUDE.md в корне проекта.
`markdown
Code Modification Constraints
- Никогда не переписывайте (Write) файл целиком заново.
- Обязательно заменяйте только минимальную единицу, требующую изменений, с помощью инструмента Edit (old_string -> new_string).
- При исправлении багов не изменяйте произвольно форматирование или пробелы в окружающем коде.
- Перед завершением работы проверьте git diff, чтобы убедиться, что внесены только задуманные изменения.
`
Вместо передачи в агент целых больших файлов лучше извлекать только целевые функции. Вот скрипт оболочки (extract-func.sh), использующий инструмент AST-парсера ast-grep.
`bash
#!/usr/bin/env bash
TARGET_FILE=1FUNCNAME=2
if [ -z "TARGETFILE"]∣∣[−z"FUNC_NAME" ]; then
echo "Использование: ./extract-func.sh <путь_к_файлу> <имя_функции>" >&2
exit 1
fi
if command -v sg &> /dev/null; then
sg run --pattern "function FUNCNAME($$$ARGS)$$$BODY""TARGET_FILE"
else
LINE_START=(ctags−x−−c−kinds=f"TARGET_FILE" 2>/dev/null | grep -w "$FUNC_NAME" | awk '{print 3}')
if [ -n "LINE_START" ]; then
sed -n "LINESTART,((LINE_START + 100))p" "$TARGET_FILE"
else
grep -n -A 60 "function FUNCNAME""TARGET_FILE"
fi
fi
`
Передавайте извлеченную функцию или застейдженный git diff в безголовом режиме (claude -p), запрашивая исправления.
`bash
Запрос кода на замену (new_string) для Edit путем внедрения только определенной функции
./extract-func.sh src/billing.js processRefund | claude -p "Выведи только блок кода на замену для Edit, исправляющий ошибку вычислений в вышеуказанной функции."
Проверка только застейдженных изменений
git diff --staged src/services/OrderService.js | claude -p "Укажи только возможные проблемы с конкурентным доступом или потенциальные null-ссылки в этом diff."
`
Передача в качестве ввода срезов по 50–100 строк вместо исходного кода целиком позволяет сократить потребление токенов на один ход почти на 90%.
Сохранение состояния сеанса и очистка с помощью HANDOFF.md
Нет причин затягивать работу в рамках одного сеанса. По мере накопления истории диалога увеличивается лишь базовая стоимость, которую приходится платить за каждый ход. Модель Claude поддерживает /autocompact, самостоятельно суммирующую историю диалогов при достижении примерно 967 000 токенов, однако в процессе сокращения кода системой часто утрачиваются важные параметры или контекст граничных случаев. Контекст необходимо очищать вручную.
Текущее состояние проверяется в терминале с помощью трех встроенных команд:
/context: отображает процент памяти, занимаемый системным промптом и историей диалога.
/usage: проверяет объем использования токенов за сеанс и процент исчерпания лимита тарифа.
/cost: оценивает реальные затраты в долларах, накопленные за текущий сеанс.
Если количество токенов превысило 100 000 или завершена определенная единица работы, перед закрытием сеанса поручите Claude Code составить HANDOFF.md.
text Запиши рабочее состояние текущего сеанса в HANDOFF.md в корне проекта в следующем формате: Goal: рабочая цель и целевой модуль Current Progress: измененные файлы и конкретные строки What Worked: логика с подтвержденной проверкой и пройденные тесты What Failed: неудачные подходы и меры предосторожности Immediate Next Step: отдельная задача, которую нужно выполнить сразу после начала следующего сеанса
По завершении записей очистите окно контекста командой /clear. Откройте новый сеанс и передайте только сводку предыдущего.
text Прочти файл HANDOFF.md и продолжи работу, начиная с пункта Immediate Next Step. Не пробуй ранее потерпевшие неудачу подходы.
Если вы начнете ходить по кругу из-за одной и той же ошибки 3 и более раз, следует немедленно нажать клавишу Escape для остановки. Если ситуация не располагает к полной очистке сеанса, вернитесь к предыдущему нормально работающему ходу с помощью /rewind. Поскольку /rewind сохраняет уже сформированный кэш системного префиксного промпта, вы вернетесь в нормальную ветку без дополнительных затрат на перезапись кэша.
Уровень контроля по уровням защиты
| Уровень защиты |
Расположение настроек |
Уровень контроля |
Практический эффект экономии токенов |
| Фильтрация файлов обвязки (harness) |
.claude/settings.json (permissions.deny) |
Принудительно для CLI движка |
Блокировка 50%–80% токенов начального сканирования за сеанс |
| Защитный барьер команд оболочки |
Прехук PreToolUse (block-large-reads.sh) |
Блокировка на уровне процессов ОС (Exit 2) |
100% защита от массового вывода логов и файлов бандлов |
| Нарезка контекста (Slicing) |
Конвейеры ast-grep, git diff |
Ограничение диапазона ввода |
Сокращение токенов на ход анализа и правки файлов на 90% |
| Управление временем жизни сеанса |
/context, /clear, HANDOFF.md |
Сохранение состояния вручную |
Снижение накопленных по сложным процентам расходов токенов во второй половине сеанса на 60% и более |
Блокировка ненужных путей через .claude/settings.json и соблюдение правила передачи только нарезанного кода вместо больших файлов позволяют использовать Claude Code в качестве практического инструмента разработки в среде одиночного разработчика.