Коротко
Почему агент может сломать сам себя?
Недавно я разбирал случай, который хорошо показывает механику. Агенту дали задание настроить себе защиту: запретить чтение файлов с ключами. Он дописал правило в свой файл настроек.
Сначала перестали отправляться сообщения. После перезапуска приложение вообще отказалось стартовать с ошибкой «не удалось загрузить конфигурацию, не запустится, пока не будет исправлено».
Попросить агента починить настройки было невозможно: чтобы агент заработал, приложение должно сначала прочитать файл, а прочитать его оно не может. Перезапуск тоже не помогает, он читает тот же сломанный файл. Восстанавливали руками, через Finder и текстовый редактор, по резервной копии.
Разберём простым языком, что пошло не так и какой порядок от этого защищает.
Две типичные поломки в файле настроек
В том случае ошибок было две, и обе типичные.
Неподдерживаемая форма правила. Приложение ответило так:
filesystem glob path `**/*.env` only supports `deny` access;
use an exact path or trailing `/**` for `deny` subtree accessПереводя на человеческий: шаблон «все файлы .env во всех папках» допустим только в одной форме запрета, а агент записал его в форме, которую валидатор отверг. Сам по себе шаблон не запрещён, неправильно было его оформление.
Строка не в своём разделе. Агент сам признал в отчёте, что параметр, который должен стоять в начале файла, попал внутрь раздела. В формате TOML, на котором написаны настройки Codex, раздел начинается с заголовка в квадратных скобках, и все строки ниже принадлежат ему до следующего заголовка. Файл при этом выглядит синтаксически нормальным, но значит уже другое.
| Где живут настройки | Codex | Claude Code |
|---|---|---|
| Для всех проектов на компьютере | ~/.codex/config.toml | ~/.claude/settings.json |
| Для одного проекта | .codex/config.toml в папке проекта | .claude/settings.json в папке проекта |
| Формат | TOML | JSON |
Знать эти адреса стоит заранее. Когда приложение не запускается, искать их в панике сложнее.
Почему один и тот же промпт то работает, то нет?
Здесь ловушка для всех, кто пишет инструкции для команды. У автора инструкции всё работает, потому что его приложение уже настроено, и правка ложится на готовый файл. На чистой установке тот же текст промпта приводит агента к другому решению.
Приложения агентов обновляются часто, и вместе с ними меняется синтаксис настроек. Модель знает формат на момент своего обучения, а у тебя может стоять версия новее. Поэтому проверка актуальной документации должна идти до правки, а не после. В разобранном случае порядок был обратный: сначала правка, потом сверка синтаксиса.
Вывод для тех, кто готовит такие инструкции для коллег: промпт «настрой защиту» лучше заменить готовым, проверенным на чистой установке блоком настроек и командой «вставь этот блок, ничего не меняя». Тогда у всех получится одинаковый файл, и если что-то пойдёт не так, ошибка будет одна на всех и найдётся быстрее. А задачу агента сузить до проверки: сверить блок с документацией установленной версии и сообщить о расхождениях до вставки, а не исправлять их самостоятельно.
Об этом же явлении в более общем виде писал в материале про то, что инструкция устаревает за месяц.
Порядок безопасной настройки за шесть шагов
Сверь синтаксис с документацией твоей версии
Попроси агента сначала открыть официальную документацию по настройкам и проверить, какие формы правил поддерживает установленная версия. Только потом писать правило.
Сделай резервную копию конкретного файла
Скопируй файл настроек рядом с датой в имени. Не «сделай бэкап», а конкретный путь к конкретному файлу, и убедись глазами, что копия появилась.
Пусть агент пишет в черновик
Новые настройки сначала в отдельный файл-кандидат. Рабочий файл не трогаем, пока кандидат не проверен.
Проверь кандидата
Три вопроса: файл читается как TOML или JSON без ошибок; приложение принимает такие правила; корневые параметры стоят в начале файла, а не внутри разделов.
Замени и открой новый чат
Перезапусти приложение и убедись, что новый чат запускается и отвечает. Старый чат для проверки не годится: он может работать на прежних настройках.
Проверь запреты на приманке
Файл с выдуманным содержимым под запретом и новый чат, который пытается его прочитать. До этой проверки защита не считается настроенной.
Найди файл настроек через Finder или проводник, открой его в обычном текстовом редакторе и верни содержимое из резервной копии. Нет копии - удали последние добавленные строки. Терминал для этого не обязателен, хотя с ним быстрее: как перестать его бояться, разбирал в статье про терминал для непрограммиста.
Как проверить, что запрет действительно работает?
В разобранном случае после восстановления был ещё один показательный момент. Агент честно написал в ответе, что запреты он будет соблюдать, но автоматическая блокировка в текущем чате не подтверждена. Это две разные вещи: «агент обещает не читать» и «приложение не даст прочитать».
Обещание агента держится, пока он помнит правило в контексте. Блокировка на уровне приложения работает всегда. Как отличать отчёт агента от результата вообще, разбирал в материале про то, как ловить «готово» без результата.
Проверка на приманке выглядит так:
- Создай в папке проекта файл с именем, которое попадает под запрет. Внутри одна выдуманная строка.
- Открой новый чат и попроси агента показать содержимое этого файла.
- Правильный результат - отказ приложения или явная ошибка доступа. Неправильный - агент выводит «ПРОВЕРКА-123».
- Повтори с поиском по папке: запрет должен срабатывать и тогда, когда агент ищет текст, а не открывает файл напрямую.
- Удали приманку.
Не проверяй запрет на реальном файле с ключами. Если запрет не работает, ключи окажутся в истории чата. Где держать ключи так, чтобы агенту не было нужды их читать, разбирал в материале про хранение ключей своего продукта.
Когда включать режим без подтверждений?
Логика простая. Подтверждения - это ручной фильтр, запреты - автоматический. Убирать ручной фильтр, пока не проверен автоматический, значит остаться без обоих.
Порядок такой: запреты записаны, приложение запускается, приманка не читается, поиск по приманке не работает. Только после этого переключаешь режим. Если работаешь в группе, этот порядок тем более важен: у кого-то из коллег шаг с настройкой мог пройти иначе.
Какие запреты ставить в первую очередь и что агент вообще видит на диске, разбирал в статье о том, что агент делает на твоём компьютере.
Частые вопросы
Частые вопросы
Главный вывод
Самое неприятное в этой истории не поломка, а ложное чувство безопасности после починки. Приложение снова запустилось, агент пишет «правила настроены», и все переходят к следующему шагу, включая режим без подтверждений. Хотя проверки ещё не было.
Практический шаг на сегодня: найди у себя файл настроек агента, сделай его копию с датой в имени и создай приманку test.env. Десять минут, и ты будешь знать, защищён ли ты на самом деле.
Ты уже проверял свои запреты на приманке или пока веришь отчёту агента?
Источники
- Configuration Reference - где лежит config.toml Codex и как устроены его правила, ChatGPT Learn
- Settings files and precedence - где лежат файлы настроек Claude Code и пример запрета на чтение .env, Claude Code Docs
- Configure permissions - как устроены разрешения и запреты в Claude Code, Claude Code Docs
- TOML v1.0.0 - спецификация формата: таблицы и принадлежность строк разделу
