27 марта 2026
Claude Code - агентная система с многоуровневой загрузкой контекста, механизмами расширения и автоматизацией жизненного цикла. Под капотом - не просто вызов API с промптом: при каждом запуске собирается контекст из десятка источников, применяются правила доступа, загружаются skills и описания субагентов. Статья разбирает эту архитектуру: что попадает в контекстное окно, в каком порядке, и как управлять поведением агента через rules, skills, agents и hooks.
Сборка контекста: что видит модель
Claude Code состоит из двух слоёв: harness (TypeScript-приложение) и модель (LLM). Harness управляет жизненным циклом: собирает контекст, проверяет права, запускает hooks, инжектирует инструкции. Модель получает уже собранный контекст и работает внутри него - она не знает, откуда взялись инструкции, и не может управлять их загрузкой.
При запуске сессии harness собирает контекст из нескольких источников. Часть загружается сразу при старте, часть - по мере работы.
Загружается при старте сессии
Harness выполняет всё перечисленное автоматически до первого вызова модели:
- System prompt - встроенный промпт, определяющий идентичность агента, описания инструментов и базовое поведение. Можно полностью заменить через
--system-promptили дополнить через--append-system-prompt. - Managed policy CLAUDE.md - корпоративный уровень. На macOS:
/Library/Application Support/ClaudeCode/CLAUDE.md. Нельзя исключить. - CLAUDE.md из иерархии директорий - harness обходит дерево директорий вверх от текущей рабочей директории. Если запуск из
foo/bar/, загрузятся иfoo/bar/CLAUDE.md, иfoo/CLAUDE.md. - Project CLAUDE.md -
./CLAUDE.mdили./.claude/CLAUDE.md. - User CLAUDE.md -
~/.claude/CLAUDE.md. - Безусловные rules - файлы из
.claude/rules/без frontmatterpaths. - User-level rules -
~/.claude/rules/*.md(загружаются до project rules, с более низким приоритетом). - Auto memory - первые 200 строк или 25KB (что наступит раньше) из
MEMORY.md. - Описания skills - краткие описания доступных skills. Бюджет динамический: 2% контекстного окна с fallback в 16 000 символов. Полное содержимое skill загружается только при вызове.
- Git status snapshot - если включён
includeGitInstructions(по умолчанию).
Инжектируется по мере работы
Эти инжекции тоже выполняет harness, а не модель. Модель вызывает инструмент (например, Read), а harness перехватывает вызов и проверяет, нужно ли добавить дополнительный контекст:
- Path-scoped rules - когда модель вызывает
Readна файл, harness проверяет все rules с frontmatterpaths. Если путь файла совпадает с glob-паттерном, содержимое правила автоматически инжектируется в контекст. Модель не знает о существовании правила до момента инжекции. - Полное содержимое skill - при вызове через
/nameпользователем или через инструментSkillмоделью harness загружает SKILL.md, выполняет подстановки ($ARGUMENTS,!`command`) и инжектирует результат. - Topic-файлы auto memory - модель может прочитать их через
Read, но harness не загружает их автоматически при старте.
При compaction (сжатии контекста, когда окно приближается к лимиту) harness перечитывает CLAUDE.md с диска и инжектирует заново - поэтому инструкции полностью переживают сжатие. Auto memory тоже сохраняется (хранится на диске). Инструкции, данные только в чате без фиксации в файлах, теряются.
CLAUDE.md: иерархия инструкций
CLAUDE.md - основной механизм передачи инструкций агенту. Три уровня с разным охватом:
| Уровень | Расположение | Кто пишет | Область действия |
|---|---|---|---|
| Managed | /Library/Application Support/ClaudeCode/CLAUDE.md |
IT / администраторы | Все пользователи на машине |
| Project | ./CLAUDE.md или ./.claude/CLAUDE.md |
Команда | Текущий проект (коммитится в git) |
| User | ~/.claude/CLAUDE.md |
Разработчик | Все проекты пользователя |
Более специфичный уровень имеет приоритет. Если project CLAUDE.md говорит "используй tabs", а user CLAUDE.md говорит "используй spaces" - для этого проекта победят tabs.
Синтаксис @import
CLAUDE.md поддерживает ссылки на другие файлы через @path/to/file. При загрузке ссылка раскрывается, и содержимое файла подставляется в контекст. Максимальная глубина вложенности - 5 уровней. Работают как относительные, так и абсолютные пути.
# CLAUDE.md
## Архитектура
@docs/architecture.md
## Стандарты кодирования
@docs/coding-standards.md
## API-контракты
@docs/api-contracts.md
Это позволяет держать CLAUDE.md компактным, а детальную документацию - в отдельных файлах, которые полезны и без Claude Code.
Экономия токенов
Блочные HTML-комментарии (<!-- ... -->) в CLAUDE.md вырезаются перед инжекцией. Можно оставлять заметки для людей, которые не тратят токены агента:
<!-- TODO: добавить раздел про миграции после перехода на Rails 8 -->
## Database
Используй `bin/rails db:migrate` для применения миграций.
CLAUDE.md vs Auto Memory
| CLAUDE.md | Auto Memory | |
|---|---|---|
| Кто пишет | Разработчик | Claude |
| Содержит | Инструкции и правила | Наблюдения и паттерны |
| Загрузка | Полностью, каждая сессия | Первые 200 строк / 25KB |
| Compaction | Переживает (перечитывается с диска) | Переживает (на диске) |
Auto memory хранится в ~/.claude/projects/<project>/memory/. Индексный файл MEMORY.md загружается при старте, а topic-файлы (debugging.md, patterns.md) - по запросу. Все worktrees и поддиректории одного git-репозитория разделяют одну директорию auto memory.
Rules: точечные правила для контекста
Rules - это markdown-файлы в .claude/rules/, каждый из которых описывает одну тему: тестирование, API-дизайн, стиль кода. В отличие от монолитного CLAUDE.md, rules позволяют структурировать инструкции по темам и загружать часть из них условно.
Безусловные правила
Файл без frontmatter загружается при каждом старте сессии вместе с CLAUDE.md:
# .claude/rules/testing.md
Все тесты пишутся на RSpec.
Используй `let` вместо instance variables.
Максимум 3 expectation на example.
Не мокай базу данных в интеграционных тестах.
Path-scoped правила
YAML frontmatter с полем paths делает правило условным. Harness сам отслеживает, какие файлы модель читает через инструмент Read. Если путь файла совпадает с glob-паттерном - harness автоматически инжектирует содержимое правила в контекст. Модель не запрашивает загрузку и не знает о существовании правила до момента инжекции.
# .claude/rules/api-versioning.md
---
paths:
- "app/controllers/api/**/*.rb"
- "spec/requests/api/**/*_spec.rb"
---
API-контроллеры наследуют Api::BaseController.
Версионирование через namespace: Api::V1, Api::V2.
Каждый endpoint покрыт request spec.
Когда модель вызывает Read("app/controllers/api/v1/users_controller.rb"), harness видит совпадение с паттерном app/controllers/api/**/*.rb и добавляет правило в контекст вместе с содержимым файла. При работе с фронтенд-файлами правило не загружается. Это экономит контекстное окно и снижает шум.
User-level правила
Файлы в ~/.claude/rules/*.md действуют на все проекты конкретного разработчика. Загружаются до project rules (с более низким приоритетом - project rules переопределяют user-level). Полезны для персональных предпочтений: язык ответов, формат коммитов, стиль комментариев.
Когда rules, а когда CLAUDE.md
| Ситуация | Механизм |
|---|---|
| Общие инструкции для всего проекта | CLAUDE.md |
| Правила для конкретной части кодовой базы | Path-scoped rule |
| Персональные предпочтения разработчика | User-level rule или ~/.claude/CLAUDE.md |
| Детальная документация, на которую ссылается CLAUDE.md | @import в CLAUDE.md |
Skills: расширяемые команды
Skills - markdown-файлы с YAML frontmatter и инструкциями, расширяющие возможности Claude Code. Пользователь вызывает skill как /skill-name, а Claude может вызвать его автоматически, если описание skill совпадает с текущей задачей.
Структура файлов
.claude/skills/
deploy/
SKILL.md # Обязательная точка входа
checklist.md # Вспомогательный файл
review-pr/
SKILL.md
templates/
review.md
SKILL.md: frontmatter
---
name: deploy
description: "Запускает деплой в production с проверкой чеклиста"
allowed-tools:
- Bash(./optimized_deploy.sh)
- Read
model: sonnet
---
# Deploy
1. Прочитай чеклист из deploy/checklist.md
2. Проверь, что все пункты выполнены
3. Запусти ./optimized_deploy.sh
4. Сообщи результат
Ключевые поля frontmatter:
| Поле | Назначение |
|---|---|
name |
Имя, становится /slash-command |
description |
Описание. Claude использует его для автоматического вызова |
allowed-tools |
Инструменты, разрешённые без подтверждения при работе skill |
model |
Модель для выполнения (sonnet, opus, haiku) |
context |
fork - запуск в изолированном контексте субагента |
disable-model-invocation |
true - только пользователь может вызвать |
user-invocable |
false - только Claude может вызвать (фоновые знания) |
paths |
Glob-паттерны, ограничивающие автоматическую активацию |
Подстановки и динамический контекст
В теле SKILL.md работают подстановки:
$ARGUMENTS- все аргументы, переданные при вызове$ARGUMENTS[0]или$1- конкретный аргумент по индексу${CLAUDE_SKILL_DIR}- директория, содержащая SKILL.md${CLAUDE_SESSION_ID}- ID текущей сессии
Синтаксис !`command` выполняет shell-команду до отправки содержимого skill модели. Вывод команды подставляется на место плейсхолдера:
---
name: check-ci
description: "Проверяет статус CI для текущей ветки"
---
# CI Status
Текущая ветка: !`git branch --show-current`
Статус последнего коммита: !`gh run list --limit 1 --json status,conclusion --jq '.[0]'`
Проанализируй результат и предложи действия.
Расположение и приоритеты
| Приоритет | Расположение | Область действия |
|---|---|---|
| 1 (высший) | Enterprise (managed settings) | Все пользователи организации |
| 2 | ~/.claude/skills/<name>/SKILL.md |
Все проекты пользователя |
| 3 | .claude/skills/<name>/SKILL.md |
Текущий проект |
| 4 (низший) | Plugin skills/ |
Где подключён plugin |
Контроль вызова
| Frontmatter | Пользователь | Claude |
|---|---|---|
| (по умолчанию) | Может вызвать | Может вызвать |
disable-model-invocation: true |
Может вызвать | Не может |
user-invocable: false |
Не может | Может вызвать |
Типичный паттерн: деструктивные операции (деплой, миграции) помечаются disable-model-invocation: true, чтобы Claude не запустил их самостоятельно. Фоновые знания (стайл-гайды, доменные справочники) помечаются user-invocable: false.
Субагенты: изолированный контекст
Когда модель вызывает инструмент Agent, harness создаёт отдельное контекстное окно с собственным системным промптом, набором инструментов и правами. Внутри этого окна запускается новый цикл вызовов модели. Результат возвращается обратно в основной контекст как текст. Всё происходит внутри одного процесса Claude Code - отдельного процесса не запускается.
Main agent (context window A)
|
|-- Agent("найди все эндпоинты API")
| \-- Subagent Explore (context window B)
| |-- Grep, Glob, Read...
| \-- return: "найдено 12 эндпоинтов в api/v1/"
|
|-- (результат вернулся в context window A)
\-- продолжает работу
Claude Code поставляется с несколькими предопределёнными субагентами:
| Агент | Модель | Инструменты | Назначение |
|---|---|---|---|
| Explore | Haiku (быстрая) | Только чтение | Поиск и анализ кодовой базы |
| Plan | Наследует | Только чтение | Исследование для режима планирования |
| general-purpose | Наследует | Все | Многошаговые задачи |
| Bash | Наследует | Терминал | Команды в отдельном контексте |
Предопределённые и проектные субагенты работают одинаково - разница только в том, кто написал определение. Проектные субагенты определяются как markdown-файлы в .claude/agents/, пользовательские - в ~/.claude/agents/.
# .claude/agents/code-reviewer.md
---
name: code-reviewer
description: "Ревью кода: стиль, безопасность, производительность"
model: sonnet
tools:
- Read
- Grep
- Glob
- Bash(bundle exec rubocop $FILE)
maxTurns: 15
---
# Code Reviewer
Ты - ревьюер кода. Проверяй:
1. Соответствие стандартам проекта (прочитай .claude/CLAUDE.md)
2. Потенциальные проблемы безопасности (SQL injection, XSS)
3. Производительность (N+1 запросы, отсутствие индексов)
4. Покрытие тестами
Не предлагай стилистические изменения, если код проходит rubocop.
Ключевые поля frontmatter:
| Поле | Назначение |
|---|---|
tools |
Whitelist инструментов |
disallowedTools |
Blacklist инструментов |
model |
sonnet, opus, haiku или inherit |
maxTurns |
Максимум агентных шагов |
skills |
Skills, предзагружаемые в контекст субагента |
memory |
Persistent memory: user, project или local |
isolation |
worktree - работа в изолированной копии репозитория |
background |
true - всегда запускать как фоновую задачу |
Ограничения
- Субагенты не могут порождать других субагентов - вложенность запрещена для предотвращения бесконечных цепочек.
- Субагенты не наследуют skills от родителя - нужные skills перечисляются явно в поле
skills. - Фоновые субагенты автоматически отклоняют запросы прав, не одобренные заранее.
Способы вызова
- Автоматический - Claude делегирует задачу на основе
descriptionсубагента. - Естественный язык - упоминание имени агента в промпте.
- @-mention -
@"code-reviewer (agent)"гарантирует вызов конкретного субагента. - Для всей сессии -
claude --agent code-reviewerили"agent": "code-reviewer"в settings. В этом режиме.md-файл агента заменяет системный промпт основного агента целиком.
Persistent memory субагентов
Субагенты с полем memory получают собственную директорию памяти:
user-~/.claude/agent-memory/<name>/project-.claude/agent-memory/<name>/local-.claude/agent-memory-local/<name>/
При старте загружаются первые 200 строк / 25KB из MEMORY.md. Это позволяет субагенту накапливать знания между сессиями: паттерны проекта, типичные ошибки, предпочтения команды.
Hooks: автоматизация жизненного цикла
Hooks - ещё один механизм, который выполняет harness, а не модель. Harness запускает shell-команды, HTTP-запросы, LLM-промпты или вызовы субагентов в определённые моменты жизненного цикла. Модель не контролирует и не инициирует hooks - она даже не знает, какие hooks сконфигурированы. Конфигурация хранится в settings.json.
Типы событий
| Категория | События | Назначение |
|---|---|---|
| Сессия | SessionStart, SessionEnd, Stop |
Инициализация окружения, очистка ресурсов |
| Инструменты | PreToolUse, PostToolUse, PostToolUseFailure |
Валидация и наблюдаемость вызовов инструментов |
| Ввод | UserPromptSubmit |
Обработка пользовательского ввода до отправки модели |
| Контекст | InstructionsLoaded, PreCompact, PostCompact |
Управление загрузкой инструкций и сжатием |
| Субагенты | SubagentStart, SubagentStop |
Реакция на жизненный цикл субагентов |
| Файлы | FileChanged, CwdChanged |
Отслеживание изменений файловой системы |
| Права | PermissionRequest |
Реакция на запросы подтверждения |
Четыре типа обработчиков
- Command - выполняет shell-команду. Получает JSON на stdin.
- HTTP - POST-запрос с JSON-телом на указанный endpoint.
- Prompt - однократная LLM-оценка (single-turn), без контекста сессии.
- Agent - порождает субагента с доступом к инструментам.
Конфигурация
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "./scripts/validate-edit.sh",
"timeout": 30
}
]
}
],
"SessionStart": [
{
"matcher": "startup",
"hooks": [
{
"type": "command",
"command": "echo 'Session started at $(date)' >> ~/.claude/session.log"
}
]
}
]
}
}
Exit codes и управление решениями
Для command-хуков exit code определяет поведение:
- Exit 0 - успех. Stdout парсится как JSON.
- Exit 2 - блокирующая ошибка. Действие блокируется, stderr передаётся Claude.
- Любой другой - неблокирующая ошибка, stderr выводится в verbose-режиме.
Через JSON-ответ хук может управлять поведением:
{
"decision": "block",
"reason": "Файл .env не должен редактироваться агентом"
}
Для PreToolUse доступно управление правами:
{
"hookSpecificOutput": {
"permissionDecision": "allow"
}
}
PreToolUse хуки выполняются до запроса прав. Хук может вернуть "allow", но это не обходит deny-правила из settings - они проверяются после хука.
Система прав: permissions
Каждый инструмент Claude Code требует определённого уровня подтверждения:
| Тип | Примеры | Подтверждение |
|---|---|---|
| Read-only | Read, Grep, Glob | Не требуется |
| Bash | Shell-команды | Да (запоминается навсегда для проекта + команда) |
| File modification | Edit, Write | Да (до конца сессии) |
Порядок проверки: deny -> ask -> allow
Harness проверяет правила в порядке deny, ask, allow. Первое совпадение побеждает. Deny-правила всегда имеют приоритет. Это enforcement на уровне кода - модель не может обойти deny-правило, даже если CLAUDE.md говорит иное. Правила настраиваются в settings.json:
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(bundle exec rspec *)",
"Read",
"Edit(/src/**/*.ts)"
],
"deny": [
"Bash(rm -rf *)",
"Edit(.env*)",
"Write(.claude/settings.json)"
]
}
}
Синтаксис правил
Bash(npm run *)- glob-подстановкиRead(./.env)- конкретный файлEdit(/src/**/*.ts)- gitignore-style паттерныWebFetch(domain:example.com)- фильтрация по доменуmcp__server__tool- MCP-инструментыAgent(Explore)- субагентыSkill(commit)- skills
Permission modes
| Режим | Поведение |
|---|---|
default |
Стандартные запросы подтверждения |
acceptEdits |
Автоматическое одобрение редактирования файлов |
plan |
Только чтение, без модификаций |
auto |
Фоновый классификатор безопасности (research preview) |
bypassPermissions |
Без подтверждений (кроме записи в .git, .claude, .vscode, .idea) |
Settings: техническое управление
Settings контролируют техническое поведение Claude Code: какие инструменты доступны, как работает sandbox, какие хуки запускаются. В отличие от CLAUDE.md (guidance для модели), settings - enforcement, который Claude не может обойти.
Файлы и приоритеты
| Приоритет | Файл | Назначение |
|---|---|---|
| 1 (высший) | Managed settings (plist/registry/server) | Корпоративные политики. Нельзя переопределить. |
| 2 | CLI-аргументы | Временные переопределения для сессии |
| 3 | .claude/settings.local.json |
Локальные настройки (gitignored) |
| 4 | .claude/settings.json |
Проектные настройки (в git) |
| 5 (низший) | ~/.claude/settings.json |
Пользовательские настройки |
Ключевые параметры
{
"permissions": {
"allow": ["Bash(bundle exec *)"],
"deny": ["Edit(.env*)"]
},
"hooks": { },
"env": {
"RAILS_ENV": "test",
"DATABASE_URL": "postgres://localhost/myapp_test"
},
"model": "sonnet",
"agent": "code-reviewer",
"autoMemoryEnabled": true,
"includeGitInstructions": true,
"claudeMdExcludes": ["packages/legacy/**"]
}
claudeMdExcludes полезен в монорепозиториях: можно исключить CLAUDE.md из нерелевантных пакетов, чтобы не тратить контекст.
Enterprise-only параметры
Managed settings добавляют параметры, недоступные на других уровнях:
allowManagedPermissionRulesOnly- только managed-правила правallowManagedHooksOnly- только managed-хукиallowManagedMcpServersOnly- только managed MCP-серверыdisableBypassPermissionsMode- запретить bypass modedisableAutoMode- запретить auto mode
Кто кого вызывает
Claude Code - агентный цикл: модель получает контекст, решает какой инструмент вызвать, получает результат, решает снова. Ключевой вопрос - кто может инициировать вызов и в каком контексте он выполняется.
Цепочка вызова инструмента
Модель генерирует вызов инструмента (например, Edit("app/models/user.rb", ...)). Дальше управление переходит к harness, который прогоняет вызов через цепочку проверок. Модель не участвует в этих проверках - она ждёт результат.
Модель генерирует tool_use
-> [harness] PreToolUse hooks (могут заблокировать)
-> [harness] Permission rules: deny -> ask -> allow
-> [harness] Запрос подтверждения у пользователя (если нужен)
-> [harness] Выполнение инструмента
-> [harness] Инжекция path-scoped rules (если Read)
-> [harness] PostToolUse hooks (наблюдаемость)
-> Результат возвращается модели
Кто может вызвать кого
| Вызывающий | Может вызвать |
|---|---|
| Пользователь | Основной агент (через промпт), skill (через /name), субагент (через @name или --agent) |
| Основной агент | Любой инструмент, любой субагент, любой skill |
| Субагент | Только инструменты из своего tools списка. Не может вызвать другого субагента |
| Skill | Инструменты из allowed-tools (без подтверждения) + остальные (с подтверждением) |
| Hook | Shell-команду, HTTP-запрос, LLM-промпт или субагента (тип agent) |
Где выполняется вызов
| Механизм | Контекст выполнения | Видит историю чата |
|---|---|---|
| Инструменты (Read, Bash, Edit...) | Основной | Да |
| Skill (по умолчанию) | Основной - содержимое инжектируется в текущий разговор | Да |
Skill с context: fork |
Изолированный (порождается субагент) | Нет |
Субагент (Agent) |
Всегда изолированный | Нет |
| Hook (command / http) | Вне контекста модели (shell-процесс или HTTP-вызов) | Нет - получает JSON о текущем событии |
| Hook (prompt) | Одноразовый LLM-вызов без контекста сессии | Нет |
| Hook (agent) | Изолированный (порождается субагент) | Нет |
--agent name (режим сессии) |
Заменяет основной агент - .md-файл становится системным промптом |
Да (это и есть основной контекст) |
context: fork работает в основном контексте - Claude видит всю историю, CLAUDE.md, rules и память. Это удобно, когда skill должен учитывать текущий разговор. context: fork полезен для тяжёлых или независимых задач: изоляция защищает основное окно от загрязнения большим объёмом промежуточных результатов.
Ограничения вложенности
Пользователь
\-- Основной агент
|-- Субагент A (свой контекст)
| |-- Read, Grep... (инструменты)
| \-- Agent(B) X ЗАПРЕЩЕНО
|
|-- Субагент B (свой контекст)
| \-- Read, Bash... (инструменты)
|
|-- Skill "deploy" (основной контекст)
| \-- Bash, Read... (инструменты)
|
\-- Skill "review" (context: fork -> субагент)
\-- Read, Grep... (инструменты)
Запрет на вложенность субагентов - принципиальное ограничение. Если субагенту нужна помощь другого специалиста, он возвращает результат основному агенту, а тот решает, кого вызвать следующим.
Что видит каждый участник
| Участник | CLAUDE.md | Rules | Auto Memory | Skills | История чата |
|---|---|---|---|---|---|
| Основной агент | Да | Да | Да | Описания + полное содержимое при вызове | Вся |
| Субагент | Нет (только если прочитает файл сам) | Нет | Своя memory (если настроена) | Только из поля skills |
Только своя |
| Hook (command) | Нет | Нет | Нет | Нет | Нет (получает JSON о текущем вызове) |
Agent или определено в его .md-файле.
Как всё связано
Компоненты Claude Code образуют систему с чёткими зонами ответственности.
CLAUDE.md и settings
| CLAUDE.md | Settings | |
|---|---|---|
| Природа | Guidance (рекомендация) | Enforcement (ограничение) |
| Может Claude обойти | Теоретически да | Нет |
| Содержит | Стандарты кода, рабочие процессы | Права, хуки, sandbox, модель |
| Когда использовать | "Пиши тесты на RSpec" | "Запрети редактировать .env" |
Memory и compaction
- CLAUDE.md - полностью переживает compaction (перечитывается с диска).
- Auto memory - переживает (хранится на диске).
- Безусловные rules - перезагружаются после compaction.
- Path-scoped rules - загружаются при следующем обращении к соответствующему файлу.
- Чат-инструкции - теряются при compaction. Если инструкция важна на протяжении всей сессии, она должна быть в файле.
Полная картина
+--------------------------------------------------+
| Claude Code |
| |
| +--------------------------------------------+ |
| | Context Window | |
| | | |
| | System Prompt | |
| | + Managed CLAUDE.md | |
| | + Directory CLAUDE.md (hierarchy) | |
| | + Project / User CLAUDE.md | |
| | + Rules (unconditional) | |
| | + Auto Memory (MEMORY.md, 200 lines) | |
| | + Skill descriptions (2% budget) | |
| | + Git status | |
| | + Conversation history | |
| | + [on demand] Path-scoped rules | |
| | + [on invoke] Full skill content | |
| +--------------------------------------------+ |
| |
| Settings --> Permissions --> deny/ask/allow |
| --> Hooks --> Pre/Post lifecycle |
| --> Sandbox --> FS/network limits |
| |
| Subagents --> Own context window |
| --> Own tools, model, permissions |
| --> Cannot spawn subagents |
| --> Optional persistent memory |
+--------------------------------------------------+
Ментальная модель: сессии работы в SDLC
Техническое понимание архитектуры - половина дела. Вторая половина - как выстроить рабочий процесс, чтобы инструменты из предыдущих секций работали вместе. Ниже - модель, выработанная на практике: какие типы сессий бывают, что в проекте должно быть настроено под каждую, и как это выглядит в повседневной работе.
Типы сессий
Каждая сессия с Claude Code - это одна задача с определённым масштабом. Не монолитный рабочий день, а дискретная единица работы:
| Тип сессии | Пример | Что задействовано |
|---|---|---|
| E2E фича | Добавить endpoint /api/v1/bookmarks с контроллером, моделью, миграцией, спекой |
CLAUDE.md (архитектура, стандарты), path-scoped rules (API, тесты), skills (генерация спек, ревью) |
| Только тесты | Покрыть request spec-ами существующий контроллер | Path-scoped rules (тестирование), skill для генерации спек, CLAUDE.md (тест-фреймворк, покрытие) |
| Рефакторинг | Вынести shared logic в concern или service | CLAUDE.md (паттерны проекта), Explore-субагент (поиск зависимостей), hooks (rubocop post-edit) |
| Баг-фикс | Исправить N+1 в отчёте | CLAUDE.md, auto memory (если похожий баг уже встречался), path-scoped rules (SQL, performance) |
| Code review | Проверить PR коллеги | Субагент code-reviewer с read-only tools, skill для ревью |
| Исследование | Разобраться, как работает legacy-модуль | Plan mode (read-only), Explore-субагент, auto memory (сохранит находки) |
Сессия E2E: как это выглядит
Типичная сессия для добавления фичи от начала до конца:
1. Запуск: claude
-> harness загружает CLAUDE.md, rules, auto memory
-> модель видит архитектуру проекта, стандарты, тест-паттерны
2. Промпт: "Добавь endpoint POST /api/v1/bookmarks..."
-> модель читает routes.rb, существующие контроллеры
-> harness инжектирует path-scoped rule для API
-> модель создаёт миграцию, модель, контроллер, спеку
3. Проверка: модель запускает bundle exec rspec
-> harness проверяет permission (Bash разрешён для bundle exec)
-> тесты проходят или падают
-> модель фиксит то, что упало
4. Линтер: модель запускает bundle exec rubocop
-> фиксит offenses
5. Результат: готовый PR с кодом, тестами, миграцией
В рамках одной сессии контекст накапливается: модель помнит, какие файлы создала, какие тесты упали, какие решения приняла. При переходе к новой сессии (новая задача) контекст сбрасывается, но CLAUDE.md и auto memory сохраняются.
Что добавлять в проект под каждый тип работы
Базовая настройка (один раз)
.claude/
CLAUDE.md # Архитектура, стек, команды, стандарты
settings.json # Permissions: allow bundle exec, deny .env edits
rules/
testing.md # RSpec-конвенции, покрытие, без моков БД
code-style.md # Rubocop, именование, структура файлов
agents/
code-reviewer.md # Read-only агент для ревью
Для E2E фич
.claude/
rules/
api-design.md # paths: app/controllers/api/** - REST-конвенции
migrations.md # paths: db/migrate/** - правила миграций
skills/
new-endpoint/
SKILL.md # Генерирует контроллер + спеку по шаблону
Для тестирования
.claude/
rules/
rspec-patterns.md # paths: spec/** - паттерны, shared examples
skills/
write-spec/
SKILL.md # Генерирует спеку для указанного файла
Для code review
.claude/
agents/
code-reviewer.md # tools: Read, Grep, Glob (без Edit/Write)
skills/
review-pr/
SKILL.md # disable-model-invocation: true
Паттерн: одна сессия - одна задача
Контекстное окно - конечный ресурс. Чем дольше сессия, тем больше в окне накапливается промежуточных результатов, и тем выше вероятность, что модель начнёт путать ранние и поздние решения. Compaction сохраняет CLAUDE.md, но теряет нюансы обсуждений.
Практические следствия:
- Одна задача - одна сессия. Закончил фичу - закрыл сессию. Начал тесты - новая сессия. Не тянуть один разговор на весь день.
- Всё важное - в файлы. Если решение должно пережить сессию, оно должно быть в CLAUDE.md, rule или auto memory. Чат - эфемерный.
- Skills для повторяемых операций. Если каждую неделю генерируешь спеки одинаково - это skill, а не промпт из памяти.
- Субагенты для тяжёлого поиска. Исследование кодовой базы через Explore не загрязняет основной контекст. Результат возвращается как текст.
Эволюция проектной конфигурации
Конфигурация Claude Code растёт вместе с проектом. Типичная траектория:
| Этап | Что добавляется | Зачем |
|---|---|---|
| Неделя 1 | CLAUDE.md с архитектурой и командами | Агент перестаёт спрашивать "какой фреймворк?" каждую сессию |
| Неделя 2 | Settings с permissions (allow/deny) | Не нужно подтверждать bundle exec rspec каждый раз |
| Неделя 3 | Rules для тестов и API | Агент пишет спеки в стиле проекта, а не generic RSpec |
| Месяц 1 | 1-2 skills для повторяемых задач | Генерация endpoint-а или спеки за один /command |
| Месяц 2 | Субагент для code review | Ревью PR-ов без ручной настройки read-only режима |
| По необходимости | Hooks для CI, линтеров, валидации | Автоматические проверки без промпта "запусти rubocop" |