The Jerusalem PostIran hardliners demand US ‘pays the price’ before war ends, emboldened by GOP defeat - reportPunchNigeria faces 2.2 million-tonne annual fish deficit — FGBBC SportWatch Sportscene highlights of Sunday's Premiership actionDaily MaverickINVESTMENT OUTLOOK: Could a blue wave in the US transform the red wave in local retailers?Collider10 Brilliant Sci-Fi Books You Can Finish in One DayZDF heuteAktuelle Pressemitteilungen des ZDFCBS NewsIran downplays new U.S. task force aimed at disrupting land routesБи-би-сиПрезидент Израиля поручил сформировать новое правительство лидеру оппозиции АйзенкотуWirtualna PolskaByli w Krakowie pięć minut przed zamachem. "Myśleliśmy, że to fake news"سكاي نيوز عربيةالإمارات تتضامن مع مصر وتعزي في حادث تصادم قطارينالشرقأميركا.. نشوة الانتصار تشعل خلافات الديمقراطيين بشأن الطريق إلى انتخابات 2028The Sydney Morning HeraldSupport for Labor plunges
The Daily Newsstand · Free, Always
Sunday, November 8, 2026

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

Translate

Claude Code читает CLAUDE.md в начале каждой сессии, но запрет из этого файла агент всё равно может нарушить. По словам автора issue #46779, Claude Code раз за разом удалял данные сверх запроса, хотя запреты в CLAUDE.md были написаны прямо. Мои агенты работают по файлу правил проекта и по проверкам кодом, и правила между ними я делю по цене нарушения. Если ошибка стоит минут, хватит строки в тексте. Если она стоит денег, раскрывает ключи или запускает работу без подтверждения, нужны разрешения, хук или проверка кодом. Правило, которое можно нарушить, со временем нарушается, поэтому важное я переношу из текста в код и разрешения.

Правила Claude Code попадают в CLAUDE.md после второго одинакового сбоя

CLAUDE.md — файл правил проекта, который Claude Code загружает в начале каждой сессии. По руководству Anthropic, после сжатия диалога он перечитывает файл, поэтому текст правил из контекста не пропадает. Записывать туда стоит то, на чём агент уже ошибся. Справка Anthropic советует добавлять запись, когда Claude пришлось поправить в одном и том же второй раз: первый сбой обычно разовый. У меня каждая строка файла тоже появилась после конкретного сбоя.

Правило проходит два сбоя и один вопрос о цене; только ответ на него решает, останется ли строка в тексте.

Правило проходит два сбоя и один вопрос о цене; только ответ на него решает, останется ли строка в тексте.

Так в файле появился запрет автоматически повторять задачу, когда кончился лимит подписки. Поставил его владелец: повтор упирается в тот же лимит. С включёнными usage credits (дополнительным платным балансом, за счёт которого работа идёт сверх лимита подписки) повтор ещё и стоит денег: по справке о лимитах, с ними работа на лимите не останавливается и продолжается за счёт кредитов. Поэтому на вопрос, должен ли агент повторять задачу после лимита, мой ответ — нет.

Вычищать файл приходится так же регулярно, как пополнять. По той же справке Anthropic, устаревшая запись вредит сильнее, чем её отсутствие. Anthropic советует держать CLAUDE.md короче 200 строк, назначить ему владельца и проверять правки как код.

Почему агент перестаёт выполнять правило из CLAUDE.md в длинной сессии

Правило из CLAUDE.md агент, скорее всего, помнит, но в какой-то момент перестаёт применять. Так вышло в бенчмарке StateTrack-Bench с конференции EMNLP 2026: 88,6% сбоев в длинных диалогах авторы отнесли к дрейфу поведения, когда ИИ-модель помнит ограничение, но больше ему не следует. Это почти девять сбоев из десяти, и перечитывание CLAUDE.md после сжатия диалога от них, скорее всего, не спасает: правило в контексте и так есть.

Microsoft Research показала и общий спад: у всех протестированных топовых моделей качество в многоходовом диалоге ниже, чем в одноходовом, в среднем на 39% по шести задачам генерации. Anthropic пишет о своих правилах прямо: запрет вида никогда не делай X в CLAUDE.md не годится для того, что нельзя допустить ни разу. Claude выполняет такую инструкцию в большинстве случаев, но под давлением, в длинной сессии, в неоднозначной ситуации или из-за prompt injection может её нарушить. Prompt injection здесь значит чужую инструкцию в файле, который агент открыл по задаче.

Какие правила нельзя оставлять только в тексте CLAUDE.md

Только текстом нельзя держать правила, нарушение которых стоит денег, раскрывает ключи или запускает работу без подтверждения. Для них в 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 пропускает ключи в коммиты, я разбирал отдельно.

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

Как запретить агенту команду через permissions в настройках Claude Code

Команду, которую агент не должен запускать ни при каких условиях, вносят в список deny в разрешениях. Так я закрыл команду браузерного инструмента, которая тратила платные кредиты: правилом в разрешениях, без просьбы в тексте. Общий .claude/settings.json проекта документация Claude Code советует коммитить в git, тогда правила получат все участники. Пример иллюстративный, точный синтаксис описан на странице Configure permissions, на которую ссылается та же документация.

{
  "permissions": {
    "deny": ["mcp__browser__paid_action"]
  }
}
  • deny — список того, что агенту запрещено. По AgentVera, всё, чего не должно случиться никогда, переносят в deny-правила, хуки или песочницу: даже автоматический режим с классификатором рисков только оценивает действие и жёстким правилом не служит.

  • mcp__browser__paid_action — условное имя команды браузерного инструмента, подключённого через MCP, протокол для внешних инструментов агента. Защита, которая смотрит только на команды Bash, такой вызов не увидит, на это указал комментатор к issue #65563. В самом 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, действие отменяется, а текст из stderr агент получает как сообщение об ошибке.

  • Код 1 без вывода действие не блокирует: так проверили в Caprock на версиях 2.1.289 и 2.1.299. С версии 2.1.295 опция onFailure: block блокирует действие и при сбое хука.

  • После восьми блокировок подряд без вызова инструментов Claude Code всё равно завершает ход, по данным AgentVera. Порог поднимает переменная CLAUDE_CODE_STOP_HOOK_BLOCK_CAP, и на длинной задаче стоит проверить, не упирается ли хук в него.

Что оставить в CLAUDE.md, а что перенести в разрешения и хуки Claude Code

Файл правил для агента — журнал сбоев, а не декларация: каждая строка в нём должна отвечать на случай, который уже произошёл. Если нарушение правила стоит денег, раскрывает секреты или запускает работу без подтверждения, правилу не место в тексте: его закрывают разрешениями, хуком или проверкой кодом. В CLAUDE.md остаётся то, что агент может иногда нарушить без потерь: устройство проекта, порядок работы, стиль. Интересно, какое правило вы первым вынесли из CLAUDE.md в настройки и после какого сбоя.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.