Почему Claude Code ведет себя как нашкодивший стажер?
Вы даете задачу: «Обнови README, добавь секцию про установку». Через 10 минут возвращаетесь — а он переписал половину кода, удалил старые тесты и «улучшил» архитектуру. Знакомо?
Корень зла — отсутствие persistent-памяти и предсказуемого поведения. Каждая сессия Claude Code начинается с чистого листа (ну, почти). Он не помнит, что вы ненавидите табы, что тесты надо писать до кода, и что директорию dist/ нельзя трогать. Он просто берет и делает «как лучше» — по мнению своей базовой модели.
Важно: Это не баг, это фича генеративных моделей. Но мы — инженеры. Мы не терпим непредсказуемость. И у нас есть инструменты, чтобы превратить этого «стажера» в предсказуемого senior-разработчика.
Решение лежит на стыке двух технологий: Skills (файл SKILL.md) и MCP (Model Context Protocol). Первый задает правила поведения и контекст внутри проекта. Второй — подключает внешнюю память и инструменты. Вместе они убивают проблему «забывчивости» и «самовольства».
По пути мы затронем безопасность — читайте наш разбор троянов в SKILL.md, чтобы не наступить на грабли.
Анатомия проблемы: контекст — зыбучий песок
LLM работают с окном контекста. В Claude Code 2.0 (свежий релиз, про который мы писали в обзоре Claude Code 2.0) контекстное окно достигает 200K токенов. Но это не значит, что модель помнит все. Она помнит только то, что было в текущей сессии. Закрыли терминал — всё пропало.
Вторая сторона — поведенческие привычки. Без системы промптов модель действует по умолчанию: пишет verbose-код, использует устаревшие паттерны, игнорирует ваши code style preferences. Это лечится системными инструкциями, но их надо каждый раз загружать руками. Ну уж нет.
Третья сторона — инструментальная память. Хотите, чтобы Claude помнил, какие задачи вы уже сделали, какие баги нашли, какие решения приняли? Ему нужен внешний storage. Тут в игру вступает MCP.
Шаг 1: Skills — пишем конституцию для Claude Code
Skills — это файл SKILL.md в корне проекта или в директории .claude/skills/. Он загружается каждый раз при старте сессии и задает системный промпт. В этом файле вы прописываете правила, которые модель обязана соблюдать.
1 Создайте файл SKILL.md
# для всего проекта
touch SKILL.md
# или для конкретной директории
mkdir -p .claude/skills
nano .claude/skills/kotlin-style.md
2 Пропишите правила поведения
Лучший шаблон — разделить файл на секции: Identity, Rules, Memory. Вот пример для TypeScript-проекта:
# Skill: TypeScript backend engineer
## Identity
Ты — Senior TypeScript разработчик с 10-летним опытом. Предпочитаешь функциональный стиль, immutable data, strict null checks.
## Rules
1. НИКОГДА не редактируй файлы в папке `dist/`, `node_modules/`, `coverage/`.
2. Всегда используй `strict: true` в tsconfig.json.
3. Тесты пиши на vitest, асинхронные — с async/await (не callbacks).
4. Код должен быть покрыт тестами минимум на 80%.
5. Перед коммитом запускай `npm run lint` и `npm run test`.
## Memory (используется с MCP)
Я буду использовать MCP-сервер памяти для хранения facts. Не доверяй своей внутренней памяти — читай facts из MCP при старте.
## Tone
Отвечай кратко, без размышлений вслух. Если нужен рефакторинг — сначала предложи план.
Ошибка: Не пишите слишком длинные Skills. Более 500 строк — и модель начнет их игнорировать (особенно если контекст занят кодом). Оптимально — 30-50 строк.
Подробный разбор создания Skills — в нашей статье Claude Skills: инструкция по созданию переиспользуемых промптов. Там же — примеры для Python, Go, DevOps.
3 Загрузите Skills в проект
Claude Code автоматически подхватывает SKILL.md из корня. Если хотите использовать несколько skills — кладите их в .claude/skills/ и подключайте через флаг --skill:
claude --skill .claude/skills/kotlin-style.md
# можно несколько
claude --skill .claude/skills/code-review.md --skill .claude/skills/testing.md
Совет: создайте bash-алиас, который автоматически подгружает нужный скилл для каждого проекта.
Шаг 2: MCP — внешняя память для Claude Code
Skills задают поведение, но не решают проблему долговременной памяти. Claude не помнит, что вы обсудили 10 минут назад, если контекст сдвинулся. MCP-серверы позволяют сохранять и читать данные из внешних источников: файлов, баз данных, API.
1 Ставим MCP-сервер памяти
Самый простой вариант — Filesystem Memory MCP. Он хранит факты в JSON-файле внутри проекта. Не требует баз данных.
// .claude/mcp.json
{
"mcpServers": {
"memory": {
"command": "npx",
"args": [
"-y",
"@anthropic/mcp-memory-server",
"--file",
".claude/memory.json"
]
}
}
}
Теперь в любой сессии Claude может вызывать инструменты этого сервера: save_fact, read_fact, list_facts. Пропишите в Skills команду автоматически загружать все факты при старте.
2 Используем память осознанно
Не нужно скармливать модели 10 000 фактов за раз. Это убьет контекст. Вместо этого:
- Сохраняйте только важные решения (архитектурные выборы, причины багов).
- Используйте теги для группировки:
decision:cache-strategy,bug:mysql-timeout. - В Skills пропишите: «Перед началом работы прочитай все факты с тегом
active_».
Если используете много MCP-серверов, следите за расходом токенов. Мы замерили и описали оптимизацию в статье Как сократить расход токенов в MCP — рекомендую.
3 Продвинутые сценарии: сессионные отчёты и внешние базы
На маркетплейсе Skills (мы писали обзор Скиллы Claude Code: как сэкономить $1000) есть готовые скиллы для сессионных отчетов. Они после каждой сессии сохраняют summary в MCP-память. На следующей сессии Claude читает отчет и продолжает с того же места.
Еще один трюк — подключить SQLite через MCP. Тогда можно хранить структурированные данные: статусы тасок, метрики, историю ошибок.
Совет: Не пытайтесь хранить весь код в MCP. Используйте его только для мета-информации. Код должен быть в файловой системе — MCP для навигации по проекту можно использовать через list_files и read_file, но не как базу данных кода.
Объединяем: как заставить Claude помнить свои действия между сессиями
Самый частый сценарий: вы работаете с агентом несколько дней, но каждый раз он «забывает» контекст. Решение — комбинация Skills и MCP с сессионными отчетами.
1 Создайте SKILL.md с требованием вести лог
# Skill: Session continuity
## On session start
1. Прочитай файл `.claude/session-log.json` через MCP Filesystem.
2. Выведи summary последней сессии пользователю.
3. Спроси: «Продолжаем с последней задачи или начнем новую?»
## On session end (перед завершением работы)
1. Запиши в `.claude/session-log.json`:
- выполненные задачи
- открытые вопросы
- текущий статус
2. Используй MCP инструмент memory.save_fact({ key: "last_session" }).
2 Автоматизируйте закрытие сессии
В Claude Code есть хуки: можно выполнить команду перед завершением (SIGINT). Используйте trap в терминале, чтобы вызывать Claude с заданием «завершить сессию с сохранением лога».
# в ~/.bashrc или ~/.zshrc
alias cc='claude'
# можно переопределить Ctrl+D или добавить alias для завершения
function end_session() { claude --prompt "Заверши сессию, сохрани лог в MCP" && kill -INT $$; }
Пример реального использования — автономная декомпиляция игр, где сессии длятся часами. Мы описали кейс в статье Автономная декомпиляция игр Claude. Там как раз используется комбинация Skills и MCP для сохранения прогресса.
Типичные ошибки и их решения
На основе собственного опыта и багрепортов с форумов — вот что чаще всего идет не так.
Ошибка 1: Skills конфликтуют между собой
Если подключено несколько навыков, правила могут противоречить. Claude Code 2.0 обрабатывает их последовательно, но если один Skill говорит «пиши на Go», а другой — «используй Python», модель зависает.
Решение: Сделайте один главный Skill, который подключает остальные через !include (эта фича появилась в Claude Code 2.0). Или используйте MCP для выбора активного скилла на основе задачи.
Ошибка 2: MCP-серверов слишком много
Каждый сервер увеличивает время ответа и количество токенов (из-за схем инструментов). Если у вас 5-6 серверов с десятком инструментов каждый, контекст быстро забивается.
Решение: Отключайте неиспользуемые серверы. Используйте динамическое подключение через mcp.json с условиями. Или примените методику из статьи про оптимизацию схем MCP — мы сократили число токенов на 40%.
Ошибка 3: Память забивается мусором
MCP-сервер памяти сохраняет всё подряд. Через месяц в файле memory.json тысячи фактов, большинство неактуальны.
Решение: Введите политику устаревания. Храните дату создания факта и при загрузке фильтруйте по свежести. Пропишите в Skills: «Удаляй факты, которым больше 30 дней, если не помечены как permanent».
Частые вопросы
Q: Skills работают только в Claude Code или в обычном Claude тоже?
A: Фича SKILL.md — эксклюзив Claude Code. В обычном веб-интерфейсе можно использовать Custom Instructions, но это не то же самое. Для полного контроля — только Code.
Q: Может ли Skill навредить проекту?
A: Да, если он содержит вредоносные инструкции. Подробности — в статье Трояны в SKILL.md. Никогда не подключайте Skills из непроверенных источников.
Q: Как проверить, что Skills загрузились?
A: В Claude Code 2.0 добавлена команда /skills list — она показывает активные навыки. Также можно спросить: «Какие у тебя активные правила?».
Что дальше?
Вы теперь умеете управлять поведением и памятью Claude Code. Но это только вершина айсберга. Попробуйте:
- Создать Skill для code review с автоматической записью замечаний в MCP.
- Интегрировать MCP с вашим CI/CD — чтобы Claude знал статус последнего билда.
- Настроить автономные задачи, как в материале про OSU! — Claude Code играет в OSU! — принцип тот же, только вместо игры — тестирование UI.
Не забывайте про горячие клавиши для ускорения — мы составили полный гайд по хоткеям Claude Code.
И главное: не пытайтесь контролировать каждое движение агента. Дайте ему правила и память — и он сам найдет лучший путь. Но если начнет творить дичь — у вас теперь есть рычаги, чтобы это остановить.