Как эффективно использовать Claude Code: CLAUDE.md, скиллы, hooks и субагенты
Разбор практик Claude Code, которые работают в продакшене: CLAUDE.md, AGENTS.md, hooks, субагенты, скиллы, MCP и четыре места, где агент ломается незаметно.
Почему эта статья
За год в Claude Code появилось столько всего, что легко утонуть: какой CLAUDE.md писать, когда AGENTS.md, зачем hooks, как делегировать работу субагентам, где подключать MCP, а где нет. Многое звучит как маркетинг — а в рабочем проекте полезна только часть.
Этот материал собирает семь блоков по основным темам: как устроен CLAUDE.md и чем от него отличается AGENTS.md, когда hooks лучше инструкций, как субагенты экономят токены, какой минимум скиллов нужен на каждый день, зачем MCP и когда без него лучше. В конце — четыре места где Claude ошибается незаметно, даже когда результат выглядит рабочим.
Цитаты и примеры — из статей и open-source репозиториев практиков: по ходу будут имена и ссылки, чтобы можно было пойти читать первоисточник.
1. CLAUDE.md — это не мануал, это ограничения
CLAUDE.md — не документация проекта для агента. Это список того, чего Claude не должен делать, и короткие указатели куда смотреть в сложных случаях.
Shrivu Shankar формулирует это так:
«Treat your CLAUDE.md as a high-level, curated set of guardrails and pointers.» («Относись к CLAUDE.md как к высокоуровневому, тщательно отобранному набору ограничений и указателей».)
Четыре правила
1. Пиши по мере ошибок Claude. Пустой CLAUDE.md — нормально. Каждая ошибка → одна строка, чтобы она не повторилась. Boris Cherny (создатель Claude Code) рассказывал: вся команда шарит один CLAUDE.md в git, дописывает несколько раз в неделю — Claude ошибся у одного, поправили для всех.
2. Не встраивай файлы через @. Соблазн написать @docs/architecture.md — не надо. Это съедает токены. Лучше указатель с контекстом: «For complex usage or FooBarError, see path/to/docs.md». Claude сам прочитает файл, если задача требует.
3. Всегда альтернатива. Плохо: Never use --foo-bar. Хорошо: Never use --foo-bar, prefer --baz (it handles edge case X). Первая формулировка блокирует Claude без пути дальше — он начинает искать обходные решения ещё хуже.
4. CLAUDE.md как forcing function. Если инструкция разрастается — проблема не в CLAUDE.md, проблема в инструменте. Если новому разработчику нужно объяснять 10 правил запуска тестов — пусть скрипт bin/test их скроет, в CLAUDE.md остаётся одна строка Run tests: bin/test.
Пример минимального CLAUDE.md
# Monorepo
## Python
- Always use type hints
- Test with `uv run pytest`
## Internal CLI tool (./cli/)
- Usage example: `./cli/tool --help`
- Always validate input with schema X
- Never use --foo-bar, prefer --baz (handles edge case Y)
For complex tool usage, see ./cli/docs.md
10-15 строк по делу, с указателями наружу. Не 1000-строчный мануал.
Альтернатива для больших команд: модульная структура
Nick Saraev в крупных проектах разбивает CLAUDE.md на отдельные файлы-правила (workflow, technical, style). Корневой CLAUDE.md становится одностраничным индексом. Имеет смысл когда над проектом работают 5+ разработчиков и одного файла становится мало.
2. CLAUDE.md или AGENTS.md?
В 2025-2026 появился AGENTS.md — универсальный формат, работает с Claude Code, Cursor, Aider, Codex и будущими агентами. Крупные OSS мигрируют на него.
Примеры из живых репо
OpenAI — в openai/openai-agents-python/CLAUDE.md стоит одна строка: AGENTS.md. Весь контекст вынесен в AGENTS.md, а CLAUDE.md стал простым указателем.
AGENTS.md в cloudflare/workers-sdk — реальный файл в проде
Cloudflare — cloudflare/workers-sdk/AGENTS.md:
- Таблица «WHERE TO LOOK» (задача → где искать → заметки) — карта кодовой базы
- Явная секция Anti-Patterns с перечнем запретов
- В каждом подпакете packages/*/AGENTS.md — свой локальный контекст
Sentry — getsentry/sentry/AGENTS.md:
- Иерархия: корневой + src/AGENTS.md + tests/AGENTS.md
- Жёсткое правило «Never include customer info»
- Скиллы в .agents/skills/
Нужно ли переходить
- Новый проект: сразу пиши
AGENTS.md, аCLAUDE.mdделай указателем (одна строкаAGENTS.md). 30 секунд. - Существующий проект с CLAUDE.md: не срочно. Можно положить
AGENTS.mdрядом, когда появится второй агент или коллега с Cursor. - Крупный репо: иерархия как у Sentry — корневой + подпакеты — решает переполнение контекста.
Привязка к одному инструменту — технический долг. Год назад все писали .cursorrules. Сейчас Cursor читает AGENTS.md. AGENTS.md — попытка не повторить историю с vendor lock-in.
3. Hooks — там, где CLAUDE.md не справляется
CLAUDE.md — совет. Claude может его проигнорировать, особенно когда контекст переполнен. Для критичного (секреты не коммитить, тесты зелёные, линтер чистый) нужны hooks — они срабатывают гарантированно.
Suna идея: CLAUDE.md — вероятностный, hook — детерминированный. Simon Willison в обзоре Claude Skills продвигает эту же логику: механические ограничения работают надёжнее, чем инструкции о поведении.
Валидировать на финальном этапе, не в процессе
Shankar сформулировал чёткий принцип: hook срабатывает когда действие уже пытаются выполнить — коммит, пуш, — а не во время редактирования.
- ✅
PreToolUseс matcherBash+ фильтр поgit commitвнутри скрипта — блокирует коммит, пока verify не пройдёт - ❌
PreToolUseнаEdit/Write— ломает план Claude в процессе, он начинает бороться с ограничениями вместо работы
Matcher в Claude Code пишется как "matcher": "Bash", а фильтрация по конкретной команде (git commit) делается уже в bash-скрипте через jq на tool input. Shankar использует файл-маркер: /tmp/agent-pre-commit-pass создаётся когда тесты прошли. Commit-hook проверяет наличие файла — если нет, блок.
Паттерн защиты секретов
Один из самых полезных hooks — блокировка коммита с потенциальными секретами:
#!/usr/bin/env bash
# .claude/hooks/pre-commit-secrets
if git diff --cached --no-color | \
grep -E '(api_key|secret|password|BEGIN RSA|BEGIN OPENSSH)'; then
echo "🚫 Secret-like pattern found in staged changes"
exit 1
fi
С этим Claude работает автономно: попробует закоммитить API-ключ — получит ошибку, уберёт секрет, попробует снова. До успеха без участия человека.
Минимум что ставить hook'ом
- Линтер (ESLint / RuboCop / ruff)
- Type check (TypeScript / Sorbet / mypy)
- Тесты
- Нет
console.log/puts/printв staged-изменениях - Нет паттернов секретов
Когда НЕ использовать hooks
Для стилистики и предпочтений — именования, комментарии, архитектурные паттерны — hooks не работают. Это слишком субъективно. Это территория CLAUDE.md.
Правило: если нарушение можно проверить автоматически без эвристики — hook. Если требуется суждение — CLAUDE.md.
4. Субагенты для разведки — главный выигрыш по токенам
Контекст — самое дорогое в Claude Code. 200 тысяч токенов окна в Sonnet заполняются быстрее чем кажется. Только MCP-инструменты и системные tool definitions занимают 16-17 тысяч постоянно — Nick Saraev показал это на своём /context.
Grep по репо, чтение документации, разведка кода съедает половину остатка ещё до начала реальной работы. Решение: делегировать разведку субагенту.
В треде r/ClaudeAI «My full Claude Code setup after months of daily use» этот паттерн называют «biggest single quota win». Boris Cherny подтверждает — команда разработки Claude Code использует тот же подход.
Как это работает
Главный агент просит встроенного субагента (Explore, general-purpose) выполнить разведку: «use the Explore agent to find all API endpoints and return a short summary». Субагент уходит со своим контекстом, читает 50 файлов, возвращает сжатое summary в ~500 токенов. Главное окно остаётся чистым.
Субагенты управляются через /agents или вызываются естественным языком в промпте.
Тот же grep: напрямую в главном контексте vs через делегирование субагенту
Когда применять
- Grep по большому репозиторию
- Чтение длинной документации
- Анализ «где это используется» по коду
- Сбор примеров из разных частей проекта
- Параллельные независимые задачи (Nick Saraev показывает кейс с 10 субагентами, генерирующими лендинги одновременно)
Когда НЕ применять
- Имплементация фичи — главный агент должен видеть контекст, чтобы не «забыть стек». В треде
r/ClaudeCodeэто называют «Frankenmonster»: разные субагенты написали разные части → не сочетаются. - Архитектурные решения — всегда в главном окне.
- Рефакторинг связанных файлов — контекст должен быть общим.
Нюанс: Master-Clone вместо жёстких ролей
Ошибка — создавать субагентов с фиксированными ролями («reviewer», «writer», «tester»). Это антипаттерн: главный агент теряет видение картины, жёсткая делегация ограничивает гибкость.
Правильно по Shankar — Master-Clone: в CLAUDE.md описан общий контекст, главный агент сам решает когда и для чего спавнить субагента. Динамически, не по статичному шаблону.
5. Скиллы, команды, режимы: минимальный набор
Встроенных возможностей Claude Code хватает для 80% задач. Свои скиллы писать есть смысл только под повторяющийся workflow.
Batsov в статье о скиллах признаётся:
«I mostly ignored the built-in skills. Everyone online was saying "go make your own skills," so that's what I did.» («Я долго игнорировал встроенные скиллы. В интернете все говорили "пиши свои" — я и писал. Оказалось — зря.»)
Три разные механики
В Claude Code три похожих на вид, но разных по устройству вещей:
- Skills (prompt-based, с аргументами и субагентами):
/simplify,/batch,/debug,/loop,/claude-api - Built-in slash-команды (hardcoded):
/review,/compact,/clear,/context,/memory,/plan - Режимы (состояние сессии): Plan Mode, Auto-Accept — переключаются через Shift+Tab циклически
Нюанс: Shift+Tab в Normal Mode сначала включает Auto-Accept, повторный — Plan Mode. Три состояния по кругу.
Минимальный набор на каждый день
| Что | Когда использовать |
|---|---|
| Plan Mode (Shift+Tab) | Перед крупной фичей — Claude пишет план, согласовываем, затем имплементит |
/review |
Перед коммитом — ищет баги, edge cases, архитектурные проблемы |
/simplify |
После батча AI-кода — убирает unused imports, redundant переменные, чистит дубли |
/batch |
Параллельные однотипные правки на 5-30 файлах (через git worktrees) |
/compact |
Сжать историю между фазами работы, проактивно |
/clear + короткий catch-up |
При смене задачи. Чище чем /compact |
/context |
Проверить что занимает контекст. Раз в сессию минимум |
Правило Batsov: /review для корректности, /simplify для чистоты. Сначала баги, потом мусор. Не наоборот — иначе можешь «убрать» нужный код.
Как писать свои скиллы
Минимальный SKILL.md (пример Batsov):
name: deploy
description: Deploy current branch to staging
disable-model-invocation: true
allowed-tools: Bash
Deploy steps:
1. Run tests: `npm test`
2. Build: `npm run build`
3. Deploy: `./scripts/deploy.sh staging`
Поле disable-model-invocation: true означает: скилл запускается только человеком, Claude его не вызовет автоматически. Нужно для операций с side effects — деплои, удаление данных, отправка писем.
Refinement loop до 98% точности (Nick Saraev)
Для скилла, который должен работать надёжно (не только у тебя):
- Написать наивный прототип.
- Запустить на чистой сессии Claude Code — без контекста твоего проекта.
- Посмотреть где Claude недопонял или сделал не так.
- Дописать скилл, учтя проблемы.
- Повторять, пока на чистой сессии не срабатывает с первой попытки.
3-4 цикла — и скилл работает с точностью ~98% (формулировка Nick Saraev). Медленно, но единственный способ сделать то, что работает «в дикой природе», а не только у автора.
6. MCP — только как шлюз, не как API
Ошибка с MCP (Model Context Protocol) — подключать для всего подряд. MCP должен быть secure gateway с 2-3 высокоуровневыми операциями, а не набором из 40 мелких read_a / read_b / update_c.
Shankar:
MCP manages auth/security, then gets out of the way.
Цена MCP по токенам
Каждый подключённый MCP съедает контекст постоянно, даже когда не вызывается — его описание висит в системном промпте. Nick Saraev показывает на /context: у него на активных MCP-тулзах регулярно уходит ~17 тысяч токенов из 200. Это 8% окна, исчезающих ещё до начала работы.
Меньше MCP → больше контекста для задачи.
Три операции — достаточно
Shankar приводит идеальный минимум MCP-интерфейса:
- download_raw_data(filters…)
- take_sensitive_gated_action(args…)
- execute_code_in_environment_with_state(code…)
Вытащить данные. Сделать одно действие с side effects под контролем. Выполнить код в sandbox. Всё остальное (обработка, промежуточные шаги) — агент скриптит сам поверх этих примитивов и CLI.
Что НЕ надо через MCP
- Git, GitHub —
git,gh pr view,gh issue createработают напрямую через Bash - AWS, Cloudflare —
aws s3 cp,wrangler deployчерез CLI - Базовые HTTP API —
curl | jqкороче и прозрачнее - Чтение файлов — встроенные инструменты Claude Code
Когда MCP действительно нужен
- Работа с auth/токенами/секретами — MCP хранит credentials, агент их не видит
- Sandbox для действий с side effects — тип «execute_code» с ограничениями
- Интеграция с закрытыми системами без CLI — Playwright MCP для браузера
MCP как этап прототипирования (Nick Saraev)
Практичный workflow решения между MCP и skill:
MCP использую, чтобы быстро проверить — возможна ли интеграция. «Можем ли мы сделать X, Y, Z?» Если с первого раза получилось — конвертирую в skill и нахожу API-эндпоинты напрямую.
MCP — инструмент быстрого эскиза. Когда интеграция валидирована — часто выгоднее перенести в skill: работает через прямые API-вызовы и не съедает токены постоянно.
Ориентир для стека
У Shankar подключён один MCP — Playwright для браузера. Всё остальное (Jira, AWS, GitHub) — простые CLI через Bash. Если твой MCP-стек вырос до 10+ серверов, стоит пересмотреть.
7. Где Claude Code ломается
Armin Ronacher (создатель Flask) написал 40 тысяч строк инфраструктурного сервиса на Go с Claude Code. Его вывод в статье «90%»:
«I still treat every line as my responsibility, judged as if I wrote it myself.» («Я по-прежнему отвечаю за каждую строку — как если бы сам её написал.»)
AI пишет большую часть кода. Ответственность остаётся на разработчике. Четыре типа поломок, где Claude ошибается незаметно — результат выглядит рабочим, проблема проявляется в проде.
1. Архитектурная слепота
«They can't keep the whole picture in scope. They will recreate things that already exist.» («Они не удерживают всю картину в поле зрения. Они воссоздают то, что уже существует.»)
Если в репо уже есть утилита http_client.rb, Claude может написать новую в api_helper.rb и не упомянуть существующую. Дубликаты, рассинхронизация, техдолг.
Защита: архитектуру рисует человек. Claude получает готовую схему с явными указателями «используй существующий X, не пиши новый Y».
2. Опасные defaults
Три регулярные ловушки по Ronacher:
- Старые версии библиотек — Claude копирует паттерны из обучения, где они были актуальны
- Глушит ошибки тихо —
rescue => e; nil end,try: except: pass. Выглядит как «работает» — прячет проблему - Пропускает observability — не ставит логи, метрики, трейсы. В проде диагностировать нечем
Конкретный пример Ronacher: реализовал rate limiter. Функционально работал — но без jitter и с плохим storage. Выглядело нормально до нагрузки.
Защита: прописать в CLAUDE.md / AGENTS.md: - «Всегда актуальная версия library (проверять на pypi/npm)» - «Все exceptions логируются, не подавляются тихо» - «Для новых endpoints обязательны log + metric»
3. Конкурентность и состояние
«Claude не схватывает goroutines и threading достаточно хорошо для надёжного кода.»
State machines, race conditions, threading, distributed locks — здесь Claude ломается чаще всего. Не потому что не знает концепций, а потому что не удерживает инварианты достаточно долго.
Защита: эти куски пишет человек. Claude помогает только с unit-тестами и ревью.
4. Ложное «готово»
Самая коварная проблема. Claude говорит «all done» без фактического запуска тестов. На вопрос «прогнал тесты?» отвечает «yes» — но вывода не показывает.
Решение — правило, которое физически мешает заявить готовность без доказательства. Вариант копипасты в CLAUDE.md:
Before claiming "done":
1. Run the verify command (bin/test or equivalent)
2. Show its output in the response
3. Never claim complete without showing passing output
Shankar усиливает это hook'ом с файл-маркером (см. блок 3).
Цифры из того же HN-треда
В обсуждении best practices на Hacker News (тред id=43735550) пользователи сравнили режимы работы:
jasonjmcghee: ~$0.50 за задачу при дисциплине — CLAUDE.md, hooks, Plan Mode,/reviewперед коммитомsagarpatil: $35-40 в день в «yolo»-режиме — авто-accept всего, без проверок
Разница не в умении — в наличии явных правил и автоматических проверок.
TL;DR — чек-лист
- CLAUDE.md = ограничения, не мануал. «Never X, prefer Y». Дописывай по ошибкам.
- Для новых проектов — сразу AGENTS.md. CLAUDE.md делается указателем на него. Не будет lock-in.
- Hooks на commit, не на edit.
PreToolUseс matcherBashблокирует секреты, непрошедшие тесты, лишнийconsole.log. CLAUDE.md для советов, hooks для законов. - Exploration — субагентам.
Explore/general-purposeдля grep, документации, разведки. Главный контекст остаётся чистым. - Минимум на каждый день: Plan Mode,
/review,/simplify,/compact. Свои скиллы — через refinement loop на чистой сессии. - MCP только как gateway. 2-3 высокоуровневых операции, не 40 мелких. CLI (git, gh, aws) для всего остального.
- Архитектура, конкурентность, observability, «готово» — всегда на человеке. AI пишет большую часть кода, ответственность остаётся на тебе.
Собираешь первый реальный проект с Claude Code?