Средний

Оптимизация Claude Code через CLAUDE.md

Алексей Кузнецов
Алексей Кузнецов
Системный администратор25 октября 2026 г.16 мин чтения

Разбираем, как файл CLAUDE.md на основе наблюдений Андрея Карпаты помогает Claude Code избегать типичных ошибок и повышает предсказуемость кодинга.

Оптимизация Claude Code через CLAUDE.md

Разбираем, как файл CLAUDE.md на основе наблюдений Андрея Карпаты помогает Claude Code избегать типичных ошибок и повышает предсказуемость кодинга.

Проблема непредсказуемости LLM в разработке

Проблема непредсказуемости LLM в разработке

Когда я впервые начал использовать Claude Code для автоматизации рутинных задач в своей домашней лаборатории, я столкнулся с классической проблемой: нейросеть работает великолепно, пока контекст проекта не становится слишком глубоким. Как только количество файлов растёт, поведение модели начинает напоминать работу старого сервера с битой памятью — вроде всё работает, но иногда выдаёт совершенно непредсказуемый результат.

Проблема не в качестве самой модели, а в том, что LLM по своей природе стремится к наиболее вероятному продолжению текста, а не к наиболее корректному с точки зрения архитектуры вашего конкретного проекта. Без чётких рамок она начинает «галлюцинировать» стилем кода или использовать библиотеки, которые вы давно решили не использовать.

Типичные ошибки при написании кода нейросетями

С практической точки зрения, я выделил три сценария, которые чаще всего превращают работу с Claude Code в бесконечный цикл правок.

Во-первых, это нарушение консистентности. Представьте, что в вашем проекте на Python принято использовать pydantic для валидации данных, но в какой-то момент Claude решает, что обычные dataclasses будут «проще», и внедряет их в новый модуль. Это ломает предсказуемость системы.

Во-вторых, это игнорирование локальных стандартов окружения. Нейросеть может предложить команду, которая сработает в стандартном Ubuntu, но не сработает в вашем легковесном Alpine-контейнере из-за отсутствия нужных пакетов.

Пример типичного «разброда» в коде:

python
# Как ожидает увидеть код ваш проект (использование pydantic)
from pydantic import BaseModel

class ServerConfig(BaseModel):
    hostname: str
    ip_address: str

# Как может написать Claude без чётких инструкций
class ServerConfig:
    def __init__(self, hostname, ip_address):
        self.hostname = hostname
        self.ip_address = ip_address

В-третьих, это ошибки в управлении зависимостями. Модель может попытаться установить пакет через pip install, забыв, что в вашем проекте используется poetry или что изменения должны быть зафиксированы в requirements.txt.

Почему стандартных инструкций недостаточно

Многие пытаются решить эти проблемы через системный промпт или общие инструкции в интерфейсе чата. Но для CLI-инструментов вроде Claude Code этот подход работает плохо. Системные инструкции — это как глобальные переменные в коде: они влияют на всё сразу, но их трудно локализовать и изменить под конкретную задачу.

Когда вы работаете над микросервисом «Пятачок» (мой сервер для управления очередями), вам нужны одни правила. Когда вы переходите к настройке хранилища на «TrueNAS», правила должны измениться. Глобальный промпт не может обеспечить такую гибкость.

Стандартные инструкции не учитывают специфику проекта:

  • Как именно запускать тесты (например, pytest --cov=app).
  • Какой стиль именования переменных использовать.
  • Какие архитектурные паттерны запрещены.

Именно здесь на помощь приходит концепция, которую популяризировал Андрей Карпата, используя файл CLAUDE.md. Вместо того чтобы пытаться «перевоспитать» нейросеть глобально, мы даём ей локальный контекст прямо в корне репозитория. Это превращает Claude из «умного, но не знающего правил собеседника» в полноценного участника команды, который понимает специфику именно этого кода.

Механика работы файла CLAUDE.md

Структура и назначение конфигурационного файла

Когда вы работаете с Claude Code, основная проблема — это «дрейф» контекста. Модель может отлично писать код в начале сессии, но через час активной правки она начинает забывать о ваших предпочтениях: использовать не те кавычки, игнорировать существующий стиль именования или, что хуже, предлагать архитектурные решения, которые противоречат логике вашего проекта.

Файл CLAUDE.md решает эту проблему, выступая в роли локального «манифеста правил». Это не просто текстовый файл с заметками, а структурированный набор инструкций, который Claude считывает при инициализации сессии. Если проводить аналогию с системным администрированием, то CLAUDE.md — это своего рода ansible-playbook для поведения нейросети в рамках конкретного репозитория.

С практической точки зрения, файл стоит разделить на три логических блока:

  1. Build & Test Commands: конкретные команды для сборки, запуска тестов и линтинга. Это избавляет модель от необходимости гадать, как запустить ваш проект.
  2. Code Style & Patterns: правила оформления кода (например, использование только функциональных компонентов в React или запрет на использование any в TypeScript).
  3. Project Context: краткое описание архитектуры, чтобы модель понимала, где лежат бизнес-логика, а где — инфраструктурный код.

Пример минималистичного, но эффективного CLAUDE.md для Node.js проекта:

markdown
# Project Guidelines

## Build and Test Commands
- Install dependencies: `npm install`
- Build project: `npm run build`
- Run tests: `npm test`
- Lint code: `npm run lint`

## Code Style
- Use TypeScript for all new files.
- Prefer arrow functions for component definitions.
- Use PascalCase for components and camelCase for utility functions.
- Error handling: Always wrap async calls in try/catch blocks and use the custom `AppError` class.

## Architecture
- Services reside in `src/services`.
- Data access layer is strictly limited to `src/repository`.
- Use Dependency Injection for all service classes.

Как инструкции влияют на контекстное окно

Чтобы понять, почему CLAUDE.md работает эффективнее, чем простое промптирование в чате, нужно взглянуть на механику управления контекстным окном.

В любой LLM-сессии есть ограниченный объем «памяти». Если вы будете каждый раз вводить инструкции «пиши на Python, используй type hints и не забудь про docstrings», вы будете тратить ценные токены на дублирование информации. В больших сессиях это приводит к тому, что важные детали реализации вытесняются из оперативной памяти модели.

Использование CLAUDE.md оптимизирует этот процесс за счёт двух факторов:

Во-первых, это предсказуемость. Инструкции из файла подаются в системном контексте. Это значит, что они имеют более высокий приоритет и не «размываются» в ходе долгого диалога. Модель воспринимает их не как совет из чата, а как часть своей внутренней конфигурации.

Во-вторых, это экономия токенов. Вместо того чтобы описывать правила в каждом сообщении, вы один раз фиксируете их в файле. Это позволяет держать контекстное окно чистым для решения текущей инженерной задачи, а не для бесконечного переобсуждения стиля кода.

Если мы посмотрим на то, как это работает на практике, то увидим, что при наличии четких команд в CLAUDE.md, Claude Code может самостоятельно выполнять цикл «правка — проверка — исправление». Например, после изменения функции модель может сама выполнить команду:

bash
npm test -- src/services/user-service.ts

Это происходит потому, что путь к тестам и способ их запуска уже прописаны в конфигурации. Если же инструкций нет, модель может попытаться запустить pytest в проекте на Node.js, что приведет к ошибке и лишней трате вашего времени.

Подобный подход к организации инструкций во многом перекликается с идеями, которые обсуждал Андрей Карпата, подчеркивая важность предоставления модели четких, структурированных и проверяемых правил работы.

Применение методик Андрея Карпаты

Применение методик Андрея Карпаты

Когда мы говорим об использовании Claude Code, важно понимать, что это не просто «умный чат в терминале», а инструмент, который работает в контексте вашего проекта. Андрей Карпата в своих размышлениях о работе с LLM подчёркивает: качество результата напрямую зависит от того, насколько чётко вы задаёте границы дозволенного.

В контексте Claude Code файл CLAUDE.md выступает в роли «инструкции по эксплуатации» вашего репозитория. Без него модель пытается угадать ваши предпочтения, что в инженерной практике равносильно работе по неполным спецификациям. С ним же мы получаем предсказуемость, которая критически важна при автоматизации кодинга.

Устранение галлюцинаций в архитектуре

Одна из главных проблем при работе с ИИ — это архитектурные галлюцинации. Модель может предложить использовать библиотеку, которая не подходит под ваш стек, или, что ещё хуже, внедрить паттерн, который противоречит структуре вашего приложения. Например, если у вас микросервисная архитектура на базе Go, Claude может попытаться навязать подходы из монолитного Python-проекта, просто потому что они чаще встречаются в обучающей выборке.

Чтобы этого избежать, в CLAUDE.md нужно жестко зафиксировать архитектурный фундамент. Мы не просто говорим «пиши на Go», мы описываем правила игры.

Пример секции для файла CLAUDE.md, которая минимизирует архитектурные ошибки:

markdown
## Architecture Guidelines

- **Pattern**: Use Clean Architecture with strict separation between domain, usecase, and infrastructure layers.
- **Concurrency**: Always prefer channels for communication between goroutines; avoid shared memory where possible.
- **Error Handling**: Do not use `panic()`. Wrap errors with context using `fmt.Errorf("context: %w", err)`.
- **Dependency Injection**: Use constructor injection for all services. Avoid global state or `init()` functions for logic.

С практической точки зрения, наличие такого описания заставляет Claude Code перед каждым изменением сверяться с вашим «манифестом». Если модель попытается создать глобальную переменную для хранения состояния сессии, она столкнётся с прямым противоречием в контексте, что снижает вероятность ошибки.

Соблюдение стандартов проекта через инструкции

Даже если архитектура соблюдена, код может превратиться в хаос из-за разного стиля написания. Кто-то использует табы, кто-то — пробелы; кто-то пишет длинные функции, кто-то — дробные. Для автоматизированного инструмента это критично: плохой стиль приводит к тому, что последующие правки ИИ будут выглядеть как «заплатки», а не как естественное продолжение кода.

В CLAUDE.md мы выносим технические стандарты и команды для проверки. Это позволяет Claude Code не только писать код, но и самостоятельно проводить его самоаудит перед тем, как предложить изменения.

Рекомендуемая структура раздела со стандартами:

markdown
## Code Style & Commands

### Style Rules
- **Formatting**: Follow `golangci-lint` standards. Use tabs for indentation.
- **Naming**: Use `camelCase` for internal variables and `PascalCase` for exported symbols.
- **Documentation**: Every exported function must have a docstring following the standard Go convention.

### Development Commands
- **Linting**: `make lint`
- **Testing**: `go test ./... -v`
- **Build**: `make build`

Если вы используете Claude Code в связке с Makefile или задачами в package.json, обязательно пропишите их в этом файле. Когда модель понимает, что для проверки качества кода нужно выполнить make lint, она начинает использовать этот инструмент как часть своего цикла работы.

Вместо того чтобы просто сказать «исправь ошибку», вы получаете процесс: модель видит ошибку, исправляет её, запускает команду линтинга, убеждается, что стиль соблюдён, и только после этого выдаёт результат. Это и есть переход от «решений на коленке» к системному подходу.

Практическое внедрение в рабочий процесс

Пример настройки для существующего репозитория

Когда вы внедряете CLAUDE.md в уже работающий проект, не пытайтесь сразу прописать туда все правила архитектуры. Если вы перегрузите файл избыточными инструкциями, Claude может начать игнорировать важные детали из-за «шума». С практической точки зрения лучше всего двигаться итерациями: сначала зафиксируйте правила запуска и тестирования, а затем добавляйте стилистические нюансы.

Для начала создайте файл в корне репозитория. Если вы работаете над типичным проектом на Python, структура может выглядеть следующим образом:

markdown
# Claude Code Guide

## Build and Test Commands
- Install dependencies: `pip install -r requirements.txt`
- Run tests: `pytest tests/`
- Run linter: `flake8 .`
- Format code: `black .`

## Code Style and Patterns
- Use type hints for all function signatures.
- Prefer list comprehensions over explicit for-loops for simple transformations.
- Follow PEP 8 strictly.
- Error handling: Always wrap I/O operations in try-except blocks with specific exceptions.

## Project Structure
- Logic resides in `src/`
- Tests reside in `tests/`
- Configuration files are in `config/`

С точки зрения предсказуемости, самым важным блоком здесь является раздел с командами. Claude Code активно использует терминал, и если он будет пытаться угадать, как запустить тесты (например, использовать python manage.py test вместо pytest), это неизбежно приведет к ошибкам в контексте.

Если ваш проект использует Docker, обязательно добавьте команды для работы внутри контейнера. Например:

markdown
## Docker Commands
- Build image: `docker compose build`
- Run migrations: `docker compose exec app python manage.py migrate`

Проверка эффективности изменений

После того как вы добавили файл, важно понять: он действительно помогает или просто занимает место в репозитории? Я рекомендую использовать метод «контрольного запроса».

Во-первых, выберите задачу, которую Claude обычно выполняет с ошибками. Например, создание нового эндпоинта с определенным паттерном обработки ошибок. Во-вторых, сравните результат до и после внесения правок в CLAUDE.md.

Чтобы проверить, насколько хорошо модель усвоила инструкции по стилю, можно выполнить команду в интерфейсе Claude Code:

bash
# Запрос на создание нового модуля с проверкой соблюдения правил
/ask Создай новый сервис для обработки платежей в src/services/ в соответствии с правилами из CLAUDE.md

Если вы видите, что Claude проигнорировал типизацию или использовал не тот стиль обработки ошибок, значит, инструкция в файле сформулирована слишком абстрактно. Вместо «Пиши чистый код» лучше использовать конкретное указание: «Используй только асинхронные методы async def для всех функций взаимодействия с базой данных».

Также полезно следить за тем, как часто Claude обращается к этому файлу. Если вы заметили, что модель начинает «галлюцинировать» команды сборки, проверьте, нет ли в CLAUDE.md противоречий с существующими скриптами в Makefile или package.json. Предсказуемость системы напрямую зависит от того, насколько инструкции в Markdown-файле синхронизированы с реальным состоянием кодовой базы.

Заключение

Практический итог

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

С практической точки зрения, внедрение этого файла даёт три ключевых преимущества:

  1. Предсказуемость. Вы точно знаете, что агент не полезет устанавливать npm там, где в проекте используется pnpm.
  2. Скорость. Claude не тратит токены на «раздумья» над тем, как правильно запустить линтер — команда уже прописана в секции Build and Test.
  3. Чистота истории. Меньше правок в Git, вызванных тем, что ИИ переписал рабочий код под свои стандарты.

Если вы только начинаете, не пытайтесь сразу написать идеальный манифест на 100 строк. Начните с минимума, который критически важен для вашего стека.

Рекомендованный стартовый шаблон

Для домашней лаборатории или небольшого пет-проекта я рекомендую использовать структуру, которая покрывает основные операции. Вот пример конфига для типичного Node.js проекта, который можно положить в корень репозитория:

markdown
# CLAUDE.md — Project Guidelines

## Build and Test Commands
- Install dependencies: `pnpm install`
- Build project: `pnpm build`
- Run tests: `pnpm test`
- Run lint: `pnpm lint`
- Run dev server: `pnpm dev`

## Code Style and Patterns
- Use TypeScript for all new files.
- Prefer functional components and hooks in React.
- Use `pnpm` as the package manager; do not use `npm` or `yarn`.
- Error handling: Always use custom error classes from `@/lib/errors`.
- Formatting: Follow Prettier rules (standard configuration).

## Project Structure
- `/src/components` — UI components.
- `/src/lib` — Core logic and utilities.
- `/src/hooks` — Custom React hooks.

Когда CLAUDE.md перестаёт работать

Важно понимать ограничения этого подхода. Файл CLAUDE.md — это контекст, а не жесткое правило исполнения. Если вы дадите противоречивую инструкцию, например, прикажете «использовать только async/await», но при этом в проекте полно старых колбэков, Claude может начать хаотично рефакторить всё подряд, ломая обратную совместимость.

Инструмент работает эффективно только тогда, когда инструкции в файле соответствуют реальности. Если вы изменили способ сборки проекта (например, перешли с Vite на Turbo), первым делом обновите CLAUDE.md. Иначе вы получите ситуацию, когда агент тратит время на попытки выполнить несуществующие команды, что только увеличивает расход токенов и время ожидания.

Для более глубокого понимания того, как ИИ-агенты взаимодействуют с контекстом проекта, рекомендую изучить исследования Андрея Карпаты о работе с LLM в инженерных задачах. Это поможет лучше выстроить архитектуру ваших инструкций.

FAQ

Нужно ли создавать CLAUDE.md для каждого проекта?

Да, если вы хотите добиться предсказуемости. Каждый проект имеет свой контекст: структуру директорий, используемые фреймворки, специфические правила именования и способы запуска тестов. Если вы используете один и тот же CLAUDE.md для микросервиса на Go и для фронтенда на React, модель неизбежно начнет путаться в командах сборки.

С практической точки зрения, файл должен быть максимально сфокусирован на текущем стеке. Для небольшого скрипта на Python достаточно пары строк, но для серьезного проекта я всегда создаю полноценный манифест.

Влияет ли размер файла на скорость работы Claude Code?

Размер файла влияет на объем контекста, который модель потребляет при каждом запросе. Если CLAUDE.md превращается в многостраничную «простыню» с описанием всей архитектуры системы, это может привести к двум проблемам:

  1. Увеличение задержки (latency) при обработке запроса.
  2. Размытие фокуса: модель может начать игнорировать важные инструкции в пользу менее значимых деталей.

Чтобы этого избежать, придерживайтесь принципа минимальной достаточности. Вместо того чтобы описывать, как работает ваш алгоритм сортировки, просто укажите формат тестов и команду для их запуска. Если файл разрастается, лучше разбить инструкции на логические блоки или вынести часть документации в проектный README.md, оставив в CLAUDE.md только оперативные команды и жесткие правила кодинга.

Можно ли использовать эти правила с другими моделями?

Идея использования контекстных файлов, популяризированная в контексте наблюдений Андрея Карпаты, применима к любой продвинутой LLM. Вы можете использовать подобные инструкции в Cursor, Windsurf или при работе через API.

Однако стоит учитывать, что разные модели по-разному реагируют на формат. Claude Code заточен под чтение именно этого файла. Для других инструментов вам может потребоваться адаптировать структуру. Например, в Cursor эффективнее работают .cursorrules. Суть остается прежней: вы создаёте «границы дозволенного» для нейросети, чтобы она не предлагала решения, которые противоречат вашему подходу.

Как обновить инструкции, если модель начала ошибаться?

Если вы заметили, что Claude Code начал предлагать неверные команды или нарушать стиль кода, не пытайтесь исправлять это в чате. Исправление в диалоге — это временная мера, которая забудется при следующем длинном контексте.

Правильный алгоритм действий:

  1. Проанализируйте ошибку. Например, модель постоянно использует npm install вместо pnpm install.
  2. Добавьте конкретное правило в CLAUDE.md.
  3. Проверьте, что команда запуска тестов или сборки указана в секции Commands.

Пример обновления секции команд:

markdown
## Commands
- Build: `pnpm build`
- Test: `pnpm test`
- Lint: `pnpm lint`
- Strict mode: Always use `pnpm` instead of `npm` or `yarn`

Такой подход делает поведение модели системным. Вы не просто «гасите пожар» в чате, а устраняете первопричину ошибки в конфигурации.

Часто задаваемые вопросы

Нужно ли создавать отдельный CLAUDE.md для каждого проекта?

С практической точки зрения, это единственный способ обеспечить предсказуемость. Поскольку CLAUDE.md служит локальным набором инструкций, он должен учитывать специфику конкретного стека: от используемых библиотек до особенностей окружения, например, различия между Debian и Alpine Linux. Если вы используете один и тот же подход для всех репозиториев, вы рискуете получить тот самый «разброд» в коде, о котором я говорил выше.

Как правильно описывать стандарты кодинга в этом файле?

Не стоит писать общие фразы вроде «пиши чистый код». Вместо этого приведите конкретные примеры: укажите предпочтительные библиотеки для валидации, правила именования переменных или требования к обработке ошибок. Если в проекте принято использовать pydantic вместо стандартных dataclasses, это должно быть прописано в разделе правил как жесткое ограничение.

Поможет ли CLAUDE.md, если проект уже большой и запутанный?

Файл поможет структурировать работу модели, но он не заменит полноценный рефакторинг. Если архитектура проекта уже нарушена, Claude Code может продолжать копировать старые ошибки, если они не описаны в инструкциях как недопустимые. Лучше всего внедрять CLAUDE.md постепенно, добавляя в него правила по мере обнаружения типичных ошибок в работе нейросети.

Влияет ли наличие CLAUDE.md на расход токенов?

Да, наличие этого файла увеличивает объем контекста, который передаётся модели при каждом запросе. Однако этот расход оправдан, так как экономит токены в долгосрочной перспективе, избавляя вас от необходимости исправлять некорректный код и запускать повторные циклы генерации. Предсказуемость результата важнее, чем незначительная экономия на объёме контекстного окна.

Поделиться:TelegramX / TwitterVK