Claude Code и Codex — агентные инструменты: они сами читают репозиторий, правят файлы и запускают команды, а не дописывают одну строку. Чтобы агент помогал, а не вредил, нужны три вещи: файл инструкций проекта (AGENTS.md или CLAUDE.md) с командами и запретами, разрешения и песочница, которые технически ограничивают его действия, и задача с проверяемыми критериями готовности. Результат агента проходит те же тесты и ревью, что и код человека.
После материала вы сможете
- написать файл инструкций
AGENTS.mdдля своего проекта и подключить его в Claude Code черезCLAUDE.md - настроить разрешения Claude Code в
.claude/settings.jsonи песочницу Codex в.codex/config.tomlи проверить их командойdoctor - поставить агенту задачу с контекстом, критериями готовности и командой проверки
- провести ревью изменений агента по чек-листу: границы диффа, тесты, секреты, зависимости и лицензии
Проверено на
Claude Code 2.1.296Codex CLI 0.162.1markdownlint-cli2 0.23.3Node.js 24 LTS (24.18)
Сверено с документацией: 12 октября 2026 г.
Содержание
Агент, а не автодополнение
Автодополнение предлагает следующую строку в редакторе, и человек принимает решение на каждом шаге. Агентный инструмент получает задачу целиком: сам находит нужные файлы, планирует, правит несколько файлов, запускает тесты и команды терминала, читает ошибки и исправляет их. Так работают Claude Code от Anthropic и Codex от OpenAI — в терминале, в расширениях IDE, в десктопных приложениях и в облаке.
Вместе с возможностями растёт и цена ошибки. Неудачная подсказка автодополнения — это одна строка, которую вы видите. Агент может изменить двадцать файлов, установить пакет, выполнить миграцию или прочитать файл с ключами. Поэтому работа с агентом держится на трёх опорах: инструкции проекта, технические ограничения и проверяемый результат.
Автодополнение
- Подсказка в текущем файле
- Человек принимает каждую строку
- Не запускает команды
- Контекст — открытый файл и соседние
Агент: Claude Code, Codex
- Задача целиком, несколько файлов
- Действует сам в рамках разрешений
- Запускает тесты, сборку, git и утилиты
- Сам ищет нужный контекст в репозитории
Установка и первый запуск
Оба инструмента ставятся одной командой. Для Claude Code документация рекомендует нативный установщик; есть также Homebrew, WinGet и npm-пакет — ему нужен Node.js 22 или новее. Codex CLI ставится установщиком с chatgpt.com, через npm или Homebrew. Нужен и аккаунт: Claude Code при первом запуске просит войти с подпиской Claude или аккаунтом Anthropic Console, Codex — через ChatGPT или другим доступным способом входа.
# Claude Code: native installer (macOS, Linux, WSL)
curl -fsSL https://claude.ai/install.sh | bash
# Codex CLI: standalone installer (macOS, Linux)
curl -fsSL https://chatgpt.com/codex/install.sh | sh
# Alternative for both: global npm packages
npm install -g @anthropic-ai/claude-code
npm install -g @openai/codex$ claude --version
2.1.296 (Claude Code)
$ codex --version
codex-cli 0.162.1Запускайте агента из корня репозитория командой claude или codex. От рабочей папки зависят и файлы инструкций, которые он прочитает, и граница, внутри которой ему разрешено писать. Перед задачей закоммитьте текущее состояние или создайте ветку: документация Codex советует ставить Git-чекпоинты до и после задачи, чтобы изменения можно было откатить.
Файл инструкций: AGENTS.md и CLAUDE.md
Каждая сессия агента начинается с чистого контекста. То, что вы иначе объясняли бы каждый раз, записывают в файл инструкций проекта. Codex читает AGENTS.md: сначала глобальный из ~/.codex, затем файлы от корня проекта вниз до текущей папки; ближний к рабочей папке читается последним и уточняет общие правила. Суммарный объём по умолчанию ограничен 32 КиБ (project_doc_max_bytes). AGENTS.md — открытый формат, его поддерживают и другие агенты; описание опубликовано на agents.md.
Claude Code читает CLAUDE.md в проекте, ~/.claude/CLAUDE.md с личными правилами и CLAUDE.local.md с настройками, которые не попадают в git. Если в проекте есть только AGENTS.md, свежие версии Claude Code читают его напрямую, но при наличии CLAUDE.md — только его. Надёжный способ держать один источник правил для обоих инструментов — общий AGENTS.md и короткий CLAUDE.md, который импортирует его строкой @AGENTS.md. Черновик можно получить командой /init: Claude Code разберёт проект и предложит команды и соглашения.
Команды сборки, тестов и линтера, которые нельзя угадать
- Не писать
- То, что агент выяснит, прочитав код
Правила кода, которые отличаются от общепринятых
- Не писать
- Общие советы вроде «пиши чистый код»
Где что лежит и архитектурные решения проекта
- Не писать
- Описание каждого файла
Запреты: секреты, применённые миграции, деплой, git push
- Не писать
- Подробную документацию API — лучше ссылку
Критерии готовности задачи
- Не писать
- Сведения, которые часто меняются
# AGENTS.md
## Project
- Online booking for a beauty salon: Next.js (App Router), TypeScript,
PostgreSQL via Prisma.
- Application code is in `src/`, tests are in `tests/`,
migrations are in `prisma/migrations/`.
## Commands
- Install dependencies: `npm ci`
- Type check: `npm run typecheck`
- Lint: `npm run lint`
- All tests: `npm test`
- One test file: `npm test -- tests/bookings.test.ts`
## Conventions
- TypeScript strict mode; no `any` in new code.
- Validate every external input with `zod` at the boundary
(`src/schemas/`).
- Database access only through `src/db/`;
never build SQL by string concatenation.
- New UI strings go to both `messages/ru.json` and `messages/en.json`.
## Workflow
- For changes that touch more than one file, propose a plan first
and wait for confirmation.
- After changes, run type check, lint and the related tests,
and show the output.
- Keep the diff limited to the task: no unrelated refactoring or reformatting.
- Ask before adding a production dependency.
## Security
- Never read, print or commit `.env` files, keys or tokens.
If a new variable is needed, name it in the summary
and leave the value to a human.
- Do not edit applied migrations in `prisma/migrations/`;
create a new migration instead.
- Never run `git push`, deployments or commands
against production databases.
## Definition of done
- Type check, lint and tests pass.
- New behavior is covered by a test.
- The summary lists what changed, how it was verified
and what is still uncertain.markdownlint-cli2# CLAUDE.md
@AGENTS.md
## Claude Code
- Use plan mode for any change under `src/payments/`.
- Before reporting a task as done, review the diff
against the acceptance criteria of the task.CLAUDE.md импортирует общие правила и добавляет то, что относится только к Claude CodeДержите файл коротким. Документация Claude Code рекомендует меньше 200 строк на файл и для каждой строки спрашивать себя, ошибётся ли агент без неё: длинный файл расходует контекст, и важные правила в нём теряются. Повод дописать строку — агент дважды повторил одну ошибку или ревью нашло то, что он должен был знать. Правила для части кода выносят во вложенный AGENTS.md (Codex) или в .claude/rules/ с привязкой к путям (Claude Code).
Разрешения и песочница
Настоящая граница проходит здесь. Режим разрешений Claude Code задаёт, что агент делает без вопроса. С версии 2.1.283 интерактивные сессии в терминале и VS Code по умолчанию стартуют в режиме auto: действия проверяет отдельная модель-классификатор и блокирует рискованные. Режим меняется флагом --permission-mode, клавишами Shift+Tab в сессии или ключом permissions.defaultMode в настройках.
plan
- Что делает без вопроса
- Читает файлы и выполняет команды только для чтения
- Когда уместен
- Разведка, незнакомый код, план до изменений
manual (в настройках — default)
- Что делает без вопроса
- Только чтение; правки и команды — после подтверждения
- Когда уместен
- Чувствительный репозиторий, первые сессии
acceptEdits
- Что делает без вопроса
- Правит файлы и выполняет простые файловые команды в рабочей папке
- Когда уместен
- Понятная задача, дифф смотрите в конце
auto
- Что делает без вопроса
- Действия проверяет классификатор, рискованные блокируются
- Когда уместен
- Длинные задачи с настроенными правилами
dontAsk
- Что делает без вопроса
- Только то, что разрешено заранее; остальное молча отклоняется
- Когда уместен
- Скрипты и CI с узким набором команд
bypassPermissions
- Что делает без вопроса
- Всё, кроме немногих действий, которые не одобряет ни один режим
- Когда уместен
- Только контейнер или VM, где агенту нечего сломать
Поверх режима работают правила allow, ask и deny в .claude/settings.json. Порядок проверки — deny, затем ask, затем allow: широкий запрет не обходится узким разрешением, а правила deny действуют в любом режиме. Файл проекта коммитят, чтобы правила получила вся команда; личные исключения кладут в .claude/settings.local.json.
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"permissions": {
"allow": [
"Bash(npm run typecheck)",
"Bash(npm run lint)",
"Bash(npm test *)"
],
"ask": [
"Bash(git push *)",
"Bash(npm install *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Bash(npx prisma migrate deploy *)"
],
"disableBypassPermissionsMode": "disable"
}
}git push и установка пакетов — с подтверждением, секреты и миграции на проде — под запретом. disableBypassPermissionsMode запрещает режим без проверокВажная оговорка из документации: правила Read и Bash — не абсолютная защита. Запрет Read(./.env) срабатывает для встроенных инструментов и распознанных команд вроде cat, но не для скрипта на Node.js или Python, который сам откроет файл; правило Bash(curl *) не остановит sh -c 'curl …'. Ограничение на уровне ОС даёт песочница (/sandbox), а надёжнее всего — не держать боевые секреты в рабочей копии вовсе.
Codex разделяет два слоя. Режим песочницы sandbox_mode задаёт, что агент может технически: read-only, workspace-write или danger-full-access. Политика подтверждений approval_policy — когда он должен спросить: on-request или never. В пресете Auto (workspace-write и on-request) Codex пишет только в рабочей папке, сеть для команд выключена, папки .git и .codex защищены от записи, а для выхода за эти границы он спрашивает. Флаг --dangerously-bypass-approvals-and-sandbox (он же --yolo) отключает и песочницу, и вопросы — документация оставляет его для окружений, изолированных снаружи.
# Project config: Codex loads it only after you mark the project as trusted
sandbox_mode = "workspace-write"
approval_policy = "on-request"
[sandbox_workspace_write]
network_access = false~/.codex/config.tomlУбедитесь, что настройки поняты так, как вы задумали. У обеих утилит есть команда doctor: она разбирает конфигурацию без запуска сессии и без обращения к модели.
$ codex doctor
✓ config loaded
config.toml parse ok
✓ sandbox restricted fs + restricted network · approval OnRequest
$ claude doctor
Invalid settings
- .claude/settings.json › permissions.defaultMode: Invalid value. Expected one of: "acceptEdits", "auto", "bypassPermissions", "default", "dontAsk", "plan"settings.json раздела Invalid settings нетКак поставить задачу
Агент останавливается, когда работа «выглядит готовой». Если в задаче нет проверки, которую он может запустить сам, проверкой становитесь вы. Хорошая задача отвечает на четыре вопроса: где искать (файлы, модули, связанная задача), что должно получиться (поведение, а не «улучши»), как это проверить (тест, команда, ожидаемый ответ) и чего не трогать.
# Task: limit booking attempts per phone number
## Context
- The booking handler is `src/app/api/bookings/route.ts`.
- A rate limit helper already exists in `src/lib/rate-limit.ts`; reuse it.
- Tests for bookings are in `tests/bookings.test.ts`.
## Goal
Reject more than 3 booking requests from the same phone number
within 10 minutes.
## Acceptance criteria
- [ ] The 4th request for the same phone within 10 minutes returns HTTP 429
with the body `{ "error": "too_many_requests" }`.
- [ ] Requests for other phone numbers are not affected.
- [ ] The limit resets after 10 minutes; the test uses fake timers,
not real waiting.
- [ ] No new dependencies and no changes outside `src/app/api/bookings/`,
`src/lib/` and `tests/`.
## Verification
Run `npm run typecheck`, `npm run lint`
and `npm test -- tests/bookings.test.ts`, then show the output.
## Out of scope
- UI changes.
- Database schema changes.
## How to work
1. Read the files above and propose a plan. Wait for my confirmation.
2. Write a failing test first, then the implementation.
3. Summarize the diff and list anything you were unsure about.- Критерии формулируйте как проверяемые факты — код ответа, тело, граничный случай, — а не «работает корректно».
- Называйте существующий код для переиспользования, иначе агент может написать собственную копию.
- Ограничивайте область: список папок и раздел «вне задачи» защищают от попутного рефакторинга.
- Просите показать вывод проверок, а не фразу «тесты прошли»: по выводу ревью идёт быстрее.
- Одна сессия — одна задача. Документация Claude Code советует очищать контекст командой
/clearмежду несвязанными задачами, а после двух неудачных исправлений — начать заново с уточнённым запросом.
Рабочий цикл: план → изменения → тесты → ревью
План
Включите режим
planв Claude Code илиread-onlyв Codex (команда/permissions). Агент читает код и предлагает, какие файлы изменить. Исправьте план до появления кода: переделать план дешевле, чем дифф. Для правки, которую можно описать одним предложением, план не нужен.Изменения
Переключитесь в рабочий режим и попросите реализовать план, начиная с падающего теста. Работайте в отдельной ветке, параллельные задачи разводите по отдельным worktree.
Тесты
Агент запускает типизацию, линтер и тесты из
AGENTS.mdи исправляет ошибки, пока проверки не пройдут. Требуйте устранять причину, а не отключать проверку или тест.Ревью
Сначала автоматическое: в Codex команда
/reviewпроверяет незакоммиченные изменения или ветку относительно базовой, в Claude Code — встроенный/code-reviewили субагент, который сверяет дифф с критериями задачи. Затем ваше ревью по чек-листу ниже.Pull request
Изменения агента проходят тот же путь, что и код человека: pull request, CI, ревью коллеги, защищённая ветка.
Ревью кода агента и где ему не доверять
Сгенерированный код выглядит уверенно независимо от того, верен ли он. Читайте весь дифф, а не только итоговый отчёт агента: отчёт описывает намерение, дифф — результат.
- Дифф ограничен задачей: нет правок в посторонних файлах, форматирования «заодно» и удалённых тестов
- Тесты проверяют поведение из критериев, а не подогнаны под реализацию; нет пропущенных и ослабленных проверок
- Проверки запущены, их вывод показан, CI зелёный
- Нет секретов в коде, логах, тестовых данных и сообщениях коммитов
- Новые зависимости действительно нужны, существуют под этим именем, поддерживаются, их лицензия совместима с проектом
- Внешний ввод валидируется, SQL параметризован, вывод в HTML экранирован, права проверяются на сервере
- Новые миграции не меняют уже применённые файлы
- Ошибки не проглатываются молча
Безопасность: вход, права, платежи, криптография
- Риск
- Правдоподобный код с дырой: проверка прав только на клиенте, самодельное хеширование
- Что делать
- Ревью человеком, который знает тему, тесты на отказ, сверка с OWASP
Секреты
- Риск
- Ключ в промпте, логе или тестовом файле; агент прочитал
.env - Что делать
- Запрет чтения, секреты вне рабочей копии, сканер секретов в CI
Лицензии и зависимости
- Риск
- Пакет с несовместимой лицензией или с похожим, но чужим именем
- Что делать
- Проверять реестр, репозиторий и лицензию каждого нового пакета
Недоверенный контент
- Риск
- Инструкции в README, issue или на веб-странице меняют поведение агента — prompt injection
- Что делать
- Не давать агенту широкие права при работе с чужим контентом, сеть — по списку разрешённых адресов
Архитектура и незнакомый домен
- Риск
- Локально разумное решение противоречит устройству системы или правилам бизнеса
- Что делать
- Решение принимает человек, агент — исполнитель и разведчик
В архитектуре и незнакомом домене проблема не в синтаксисе, а в недостающем контексте: агент не знает договорённостей, которых нет в коде, и не спросит о них, если вы не попросили. Если вы сами не можете оценить результат, агент не снимает с вас ответственность за проверку. Документация Claude Code формулирует это прямо: то, что нельзя проверить, нельзя выпускать.
Как проверено4 · пройдено1 · не запускалосьсверено 12 октября 2026 г.
- запущено, работает
AGENTS.md, CLAUDE.md, TASK.md (markdown)
markdownlint-cli2 0.23.3 (markdownlint 0.41.1), правила по умолчанию: 0 issues в 3 файлах
- запущено, работает
.claude/settings.json
валидация ajv 8.20 по схеме https://json.schemastore.org/claude-code-settings.json → valid; claude doctor (Claude Code 2.1.296, npm-установка во временную папку) в каталоге с файлом — раздела Invalid settings нет; контрольный файл с defaultMode "yolo" и mcp-правилом в скобках — doctor выдал Invalid settings (фрагмент вывода в статье — реальный, путь сокращён)
- запущено, работает
.codex/config.toml
разбор smol-toml 1.9.1; codex doctor (Codex CLI 0.162.1) с этим файлом как config.toml в изолированном CODEX_HOME: config loaded, parse ok, sandbox restricted fs + restricted network · approval OnRequest (фрагмент в статье — реальный); контрольный файл с недопустимыми значениями — config could not be loaded
- запущено, работает
claude --version / codex --version (shellsession)
npm install @anthropic-ai/claude-code@2.1.296 @openai/codex@0.162.1 в временный проект (не глобально); вывод — реальный; флаги --permission-mode (choices acceptEdits, auto, bypassPermissions, manual, dontAsk, plan), --sandbox (read-only, workspace-write, danger-full-access), --ask-for-approval (on-request, never), --dangerously-bypass-approvals-and-sandbox сверены с --help
- не запускалось
команды установки (bash: нативные установщики и npm -g)
нативные установщики curl | bash и глобальная установка не выполнялись на машине; команды скопированы из официальной документации; npm-пакеты тех же версий установлены локально во временный проект
«Запущено» — код выполнен во временном проекте или контейнере, вывод в статье взят из прогона. «Частично» — проверено с заглушками вместо внешних сервисов. «Не запускалось» — нужны устройство, аккаунт или ключ; шаги сверены с официальной документацией. Файлы проверочного проекта и логи запусков сохранены в архиве InterLAB.