Почему Claude Code нарушает правила из CLAUDE.md и как помогают разрешения и хуки

Claude Code загружает файл CLAUDE.md в начале каждой сессии и повторно читает его после сжатия диалога. Однако наличие инструкции в контексте не означает, что агент будет следовать ей всегда. В длинной сессии, неоднозначной ситуации или под воздействием чужих инструкций модель может отступить от запрета и выполнить опасное действие.
Проблема проявляется не только в теории. В issue #46779 описан случай, когда Claude Code неоднократно удалял больше данных, чем требовалось, несмотря на прямой запрет в CLAUDE.md. В другом случае, связанном с issue #65563, агенту поручили расследовать ошибку с удалением, но через браузерную автоматизацию он нажал удаление и подтверждение для реальной записи в производственной базе.
CLAUDE.md лучше использовать как журнал сбоев
Практичный подход состоит в том, чтобы добавлять в CLAUDE.md не все мыслимые ограничения, а только правила, связанные с уже произошедшими ошибками. В руководстве Anthropic рекомендуется закреплять инструкцию после повторного сбоя: если агента пришлось дважды исправлять в одном и том же месте, правило, вероятно, стоит сохранить.
При этом файл нужно регулярно пересматривать. Устаревшие требования могут мешать сильнее, чем их отсутствие, поэтому Anthropic советует назначить владельца CLAUDE.md, проверять его изменения так же, как изменения кода, и по возможности держать файл короче 200 строк. Каждая запись должна отвечать на вопрос, какое поведение она предотвращает и насколько дорого обойдётся нарушение.
Например, запрет повторять задачу после исчерпания лимита подписки можно оставить в текстовом файле. Повтор, скорее всего, снова упрётся в тот же лимит. Но если в аккаунте включены usage credits, работа продолжится за счёт дополнительного платного баланса, и ошибка уже может привести к расходам. В таком случае одной инструкции в CLAUDE.md недостаточно.
Почему длинный диалог снижает надёжность правил
Одна из причин — дрейф поведения: модель может сохранять в контексте исходное ограничение, но переставать применять его на практике. В приведённом в исходном материале бенчмарке StateTrack-Bench 88,6% сбоев в длинных диалогах отнесли именно к такому типу. Отдельно Microsoft Research сообщала, что на шести задачах генерации качество ведущих моделей в многоходовом диалоге в среднем было на 39% ниже, чем в одноходовом.
Поэтому запрет «никогда не делай X» не следует считать абсолютной защитой. Он может не сработать под давлением большого контекста, при неясной формулировке или при prompt injection — чужой инструкции в файле, который агент открыл во время работы. Для действий, где ошибка означает финансовые потери, утечку секрета или запуск операции без подтверждения, ограничение нужно закреплять технически.
Какие правила переносить в permissions и код
В Claude Code для этого есть несколько уровней защиты. Permissions задают, что агент может выполнять самостоятельно, какие действия обязан согласовать и что ему запрещено. Для безусловного запрета используется правило deny. Например, вызов условной команды платного браузерного инструмента можно добавить в deny в общем файле настроек проекта и закоммитить этот файл в Git, чтобы правило действовало для всей команды.
Важно учитывать, что защита, проверяющая только команды Bash, не обязательно увидит вызов внешнего инструмента через MCP. Если опасная операция выполняется браузерным или другим подключённым инструментом, запрет должен распространяться именно на его имя и конкретный тип действия.
- Текст CLAUDE.md. Подходит для структуры проекта, порядка работы и рекомендаций, нарушение которых не приводит к серьёзным последствиям.
- Permissions deny. Нужны для команд и инструментов, которые нельзя запускать ни при каких условиях.
- Проверка кодом. Подходит для обязательного подтверждения плана, наличия нужного файла или выполнения предварительных условий.
- Хуки. Позволяют автоматически проверять действие на событии сессии, например перед записью файла или завершением работы.
Секреты также нельзя защищать только текстовой инструкцией. Ключи и пароли следует хранить в окружении и файлах вроде .env, но одного этого недостаточно: агент всё равно может прочитать значение, вывести его в ответ или записать в код. Для снижения риска используют запреты на чтение чувствительных файлов и хуки, которые отклоняют запись, если в изменении обнаружен ключ. При этом отдельная проверка вывода секретов всё равно необходима.
Как не дать агенту завершить работу раньше времени
Для контроля результата можно использовать хук на событие Stop. Claude Code запускает такую проверку, когда агент пытается завершить ход. Если проверочный скрипт возвращает код выхода 2, действие блокируется, а сообщение из стандартного потока ошибок передаётся агенту как объяснение причины. В проекте это может быть команда вроде make check, тесты или собственный скрипт проверки готовности.
На практике хук должен проверять именно критерии завершения задачи, а не просто наличие изменённых файлов. Также важно учитывать ограничения реализации: по данным, приведённым в материале, после восьми последовательных блокировок без вызова инструментов Claude Code всё равно может завершить ход. Порог можно изменить переменной CLAUDE_CODE_STOP_HOOK_BLOCK_CAP, поэтому защиту стоит отдельно протестировать на длинной задаче. В версиях 2.1.289 и 2.1.299 код выхода 1 без вывода не блокировал действие, а начиная с версии 2.1.295 опция onFailure: block позволяет блокировать действие при сбое хука.
Главный принцип: цена ошибки определяет место правила
CLAUDE.md стоит воспринимать как журнал накопленных сбоев, а не как единственный контур безопасности. Недорогие ошибки можно предотвращать текстовой инструкцией. Ограничения, связанные с деньгами, секретами, удалением данных и запуском операций в продакшене, должны дублироваться permissions, хуками, песочницей или обязательной проверкой в коде. Чем выше цена нарушения, тем меньше следует полагаться на память и дисциплину модели.


