- BrainTools - https://www.braintools.ru -
Claude Code читает CLAUDE.md в начале каждой сессии, но запрет из этого файла агент всё равно может нарушить. По словам автора issue #46779 [1], Claude Code раз за разом удалял данные сверх запроса, хотя запреты в CLAUDE.md были написаны прямо. Мои агенты работают по файлу правил проекта и по проверкам кодом, и правила между ними я делю по цене нарушения. Если ошибка [2] стоит минут, хватит строки в тексте. Если она стоит денег, раскрывает ключи или запускает работу без подтверждения, нужны разрешения, хук или проверка кодом. Правило, которое можно нарушить, со временем нарушается, поэтому важное я переношу из текста в код и разрешения.
CLAUDE.md — файл правил проекта, который Claude Code загружает в начале каждой сессии. По руководству Anthropic [3], после сжатия диалога он перечитывает файл, поэтому текст правил из контекста не пропадает. Записывать туда стоит то, на чём агент уже ошибся. Справка Anthropic [4] советует добавлять запись, когда Claude пришлось поправить в одном и том же второй раз: первый сбой обычно разовый. У меня каждая строка файла тоже появилась после конкретного сбоя.
Так в файле появился запрет автоматически повторять [5] задачу, когда кончился лимит подписки. Поставил его владелец: повтор упирается в тот же лимит. С включёнными usage credits (дополнительным платным балансом, за счёт которого работа идёт сверх лимита подписки) повтор ещё и стоит денег: по справке о лимитах [6], с ними работа на лимите не останавливается и продолжается за счёт кредитов. Поэтому на вопрос, должен ли агент повторять задачу после лимита, мой ответ — нет.
Вычищать файл приходится так же регулярно, как пополнять. По той же справке Anthropic, устаревшая запись вредит сильнее, чем её отсутствие. Anthropic советует держать CLAUDE.md короче 200 строк, назначить ему владельца и проверять правки как код.
Правило из CLAUDE.md агент, скорее всего, помнит, но в какой‑то момент перестаёт применять. Так вышло в бенчмарке StateTrack‑Bench [7] с конференции EMNLP 2026: 88,6% сбоев в длинных диалогах авторы отнесли к дрейфу поведения [8], когда ИИ‑модель помнит ограничение, но больше ему не следует. Это почти девять сбоев из десяти, и перечитывание CLAUDE.md после сжатия диалога от них, скорее всего, не спасает: правило в контексте и так есть.
Microsoft Research [9] показала и общий спад: у всех протестированных топовых моделей качество в многоходовом диалоге ниже, чем в одноходовом, в среднем на 39% по шести задачам генерации. Anthropic пишет о своих правилах прямо: запрет вида никогда не делай X в CLAUDE.md не годится для того, что нельзя допустить ни разу. Claude выполняет такую инструкцию в большинстве случаев, но под давлением, в длинной сессии, в неоднозначной ситуации или из‑за prompt injection может её нарушить. Prompt injection здесь значит чужую инструкцию в файле, который агент открыл по задаче.
Только текстом нельзя держать правила, нарушение которых стоит денег, раскрывает ключи или запускает работу без подтверждения. Для них в Claude Code есть разрешения (permissions): правила allow, ask и deny задают, что агент делает сам, о чём спрашивает и что ему запрещено. Есть хуки (hooks): shell‑команды, которые Claude Code запускает сам на событие сессии, например когда агент собирается записать файл или закончить ход. И есть отдельная проверка кодом перед запуском работы.
|
Правило |
Что идёт не так без него |
Где живёт |
|---|---|---|
|
Не повторять задачу после лимита подписки |
повтор упирается в тот же лимит, с usage credits стоит денег |
текст CLAUDE.md |
|
Не запускать команду браузерного инструмента, которая тратит платные кредиты |
команда тратила платные кредиты |
deny в разрешениях |
|
Брать ключи и пароли только из окружения и.env |
ключ оказывается в коде или выводе |
окружение и.env |
|
Запускать работу только после подтверждённого плана |
запуск держался на договорённости |
проверка кодом перед запуском |
|
Не заканчивать, пока работа не доведена до конца |
агент заканчивает ход, не доделав работу |
хук на остановку (Stop) |
Запрет на повтор после лимита у меня стоит в тексте: без usage credits повтор только упирается в тот же лимит. С кредитами он стоит денег, и тогда одной строки в CLAUDE.md мало.
Ключи и пароли агент берёт только из окружения и.env. Само по себе это не мешает ему прочитать секрет и вывести его или записать в код, поэтому запрет закрепляют кодом: правило deny на чтение.env закрывает агенту файл с ключами, а хук на запись файла отклоняет изменение, в котором есть ключ. Вывод секрета из окружения эти два правила не закрывают. Раскрытый ключ обратно не заберёшь, поэтому держать такое правило одним текстом нельзя; почему хук PreToolUse пропускает ключи в коммиты [10], я разбирал отдельно.
Правило запускать работу только после подтверждённого плана было последней проверкой, которая держалась на договорённости. Теперь его проверяет код: скрипт запуска сначала ищет файл с моим подтверждением плана и без него завершается с ошибкой, так что работа не стартует.
Команду, которую агент не должен запускать ни при каких условиях, вносят в список deny в разрешениях. Так я закрыл команду браузерного инструмента, которая тратила платные кредиты: правилом в разрешениях, без просьбы в тексте. Общий.claude/settings.json проекта документация Claude Code [11] советует коммитить в git, тогда правила получат все участники. Пример иллюстративный, точный синтаксис описан на странице Configure permissions, на которую ссылается та же документация.
{
"permissions": {
"deny": ["mcp__browser__paid_action"]
}
}
deny — список того, что агенту запрещено. По AgentVera [12], всё, чего не должно случиться никогда, переносят в deny‑правила, хуки или песочницу: даже автоматический режим с классификатором рисков только оценивает действие и жёстким правилом не служит.
mcp__browser__paid_action — условное имя команды браузерного инструмента, подключённого через MCP, протокол для внешних инструментов агента. Защита, которая смотрит только на команды Bash, такой вызов не увидит, на это указал комментатор к issue #65563 [13]. В самом issue автор пишет, что агента просили лишь расследовать баг с удалением, а он через автоматизацию браузера нажал удаление и подтверждение на реальной записи в продакшен‑базе.
Чтобы агент не заканчивал ход, пока работа не доведена до конца, на событие Stop вешают хук. Claude Code запускает его, когда агент пытается закончить, и при коде выхода 2 возвращает к работе. JSON кладут в файл настроек Claude Code, скрипт check‑done.sh — в корень проекта, и делают его исполняемым. Пример иллюстративный: вместо make check подставьте команду проверки своего проекта.
{
"hooks": {
"Stop": [
{ "hooks": [{ "type": "command", "command": "./check-done.sh" }] }
]
}
}
#!/bin/sh
# пока проверка не проходит, закончить нельзя
make check >/dev/null 2>&1 || {
echo "Работа не закончена: проверка не прошла" >&2
exit 2
}
exit 2 — блокирующая ошибка: по описанию хуков у Anthropic [14], действие отменяется, а текст из stderr агент получает как сообщение об ошибке.
Код 1 без вывода действие не блокирует: так проверили в Caprock [15] на версиях 2.1.289 и 2.1.299. С версии 2.1.295 опция onFailure: block блокирует действие и при сбое хука.
После восьми блокировок подряд без вызова инструментов Claude Code всё равно завершает ход, по данным AgentVera. Порог поднимает переменная CLAUDE_CODE_STOP_HOOK_BLOCK_CAP, и на длинной задаче стоит проверить, не упирается ли хук в него.
Файл правил для агента — журнал сбоев, а не декларация: каждая строка в нём должна отвечать на случай, который уже произошёл. Если нарушение правила стоит денег, раскрывает секреты или запускает работу без подтверждения, правилу не место в тексте: его закрывают разрешениями, хуком или проверкой кодом. В CLAUDE.md остаётся то, что агент может иногда нарушить без потерь: устройство проекта, порядок работы, стиль. Интересно, какое правило вы первым вынесли из CLAUDE.md в настройки и после какого сбоя.
Автор: ig_novvv
Источник [16]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/38210
URLs in this post:
[1] issue #46779: https://github.com/anthropics/claude-code/issues/46779
[2] ошибка: http://www.braintools.ru/article/4192
[3] руководству Anthropic: https://claude.com/resources/articles/steering-claude-code-skills-hooks-rules-subagents-and-more
[4] Справка Anthropic: https://support.claude.com/en/articles/14552983-models-usage-and-limits-in-claude-code
[5] повторять: http://www.braintools.ru/article/4012
[6] справке о лимитах: https://support.claude.com/en/articles/11647753-how-do-usage-and-length-limits-work
[7] StateTrack‑Bench: https://aclanthology.org/2026.emnlp-main.583/
[8] поведения: http://www.braintools.ru/article/9372
[9] Microsoft Research: https://www.microsoft.com/en-us/research/publication/llms-get-lost-in-multi-turn-conversation/
[10] почему хук PreToolUse пропускает ключи в коммиты: https://habr.com/ru/articles/1087300/
[11] документация Claude Code: https://code.claude.com/docs/en/settings
[12] AgentVera: https://agentvera.dev/en/blog/claude-code-best-practices/
[13] issue #65563: https://github.com/anthropics/claude-code/issues/65563
[14] описанию хуков у Anthropic: https://claude.com/resources/articles/how-to-configure-hooks
[15] Caprock: https://caprock.dev/guides/claude-code-hooks/
[16] Источник: https://habr.com/ru/articles/1105196/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1105196
Нажмите здесь для печати.