Сначала база: что такое Claude Code v2.1.88
Если вы думаете, что Claude Code — это какой-то загадочный черный ящик с магией внутри, то у меня для вас новость: это обычный npm-пакет. @anthropic-ai/claude-code версии 2.1.88, опубликованный 28 мая 2026 года. Никакой магии — только TypeScript, EventEmitter и куча коллбеков.
Но именно вокруг этого пакета сформировалось столько мифов, что впору писать энциклопедию заблуждений. Мол, агент сам принимает решения, он монолитен, он может выйти из-под контроля, он небезопасен. Хватит гадать — давайте откроем node_modules и посмотрим правде в глаза.
Я разобрал исходники v2.1.88 (актуальная версия на 5 июня 2026) и готов показать, где правда, а где просто страшилки. Внутренние ссылки на наши прошлые разборы: глубокий разбор архитектуры от Sebastian Raschka и китайский реверс-инжиниринг помогут дополнить картину.
Важное замечание: я не взламывал Anthropic и не деобфусцировал бинарники. Анализ открытого npm-пакета и его публичных исходников — это легально. И да, код Claude Code — это не скомпилированный монолит, а читаемые TypeScript-файлы (ну, относительно читаемые).
Миф №1: «Claude Code — это один большой агент»
Самый живучий миф. Мол, есть одна супер-LLM, которая всё делает сама. Откройте src/agent.ts — и вы увидите, что там нет никакого «агента» в единственном числе. Там есть AgentController, который управляет роем, простите, пулом агентов.
Вот структура из реального кода (упрощенно):
// src/agent.ts (Claude Code v2.1.88)
export class AgentController {
private mainAgent: ClaudeAgent;
private subAgents: SubAgentManager;
private skillRegistry: DynamicSkillRegistry;
private stateMachine: StateMachine;
async process(request: UserRequest): Promise<Response> {
const plan = await this.mainAgent.plan(request);
const tasks = this.decompose(plan);
const results = await this.subAgents.execute(tasks);
return this.assemble(results);
}
}
Видите? Это не монолит. Есть главный агент (планировщик), менеджер саб-агентов (исполнители), и ещё динамический реестр навыков. Подробнее про саб-агентов мы писали в статье «Архитектура Claude Code: как управлять контекстом, Subagents и писать эффективный CLAUDE.md».
Каждый саб-агент — это отдельный инстанс Claude, со своим кэшем и историей. Они живут недолго: выполнил задачу — и умер. Никакой «личности» у них нет.
Миф №2: «Агент сам решает, какие действия выполнять»
Звучит страшно: «ИИ сам выбирает, что делать». На деле агент не «сам решает» — он выбирает из строго заданного набора инструментов, которые мы ему разрешили. В коде это называется ToolRegistry.
// src/tools/registry.ts
export class ToolRegistry {
private tools: Map<string, Tool> = new Map();
register(tool: Tool) {
// Каждый инструмент — это функция с описанием
this.tools.set(tool.name, tool);
}
getAllowed(userFlags: UserFlags): Tool[] {
// Фильтр по флагам безопасности
return this.tools.filter(t => t.isAllowed(userFlags));
}
}
Агент может вызвать только те инструменты, которые переданы в промпт. Он не может сам себе добавить новый инструмент — это не зашито ни в каком function calling. Список инструментов фиксирован и контролируется флагами --tools, --no-auto-agree, --danger-allow.
Кстати, о флагах безопасности.
Миф №3: «Claude Code небезопасен — может удалить все файлы»
Самая популярная страшилка. Да, Claude Code может удалять файлы — если ему разрешить. Но посмотрите, как это реализовано:
// src/flags.ts (v2.1.88)
export const DEFAULT_FLAGS = {
autoAgree: false, // ничего не делаем без подтверждения
dangerousAllow: false, // опасные операции отключены
confirmRequired: [
'delete_file',
'run_command',
'modify_system_file'
]
};
По умолчанию --no-auto-agree выключен — а это значит, что на каждое опасное действие агент запрашивает подтверждение. Даже если вы забудете поставить флаг, код confirmer.ts всё равно проверит, не относится ли действие к списку запрещённых без одобрения.
Реальная угроза не в том, что агент сам по себе опасен, а в том, что вы разрешаете --danger-allow и забываете про мониторинг. Не делайте так, если не хотите потерять проект. Код не виноват — виноваты ваши флаги.
Миф №4: «Архитектура — это просто обертка над API Claude»
Многие думают: «Да это просто вызов API claude-4.5-sonnet с длинным промптом». Нет. Под капотом — полноценный рантайм агента с queryLoop, state-машиной, кэшем и динамическим выбором модели.
Вот упрощенная схема queryLoop из src/loop.ts:
// src/loop.ts — упрощённая версия
async function queryLoop(initialRequest: Request) {
let state = new State(initialRequest);
while (!state.isTerminal()) {
const nextAction = await agent.chooseAction(state);
const result = await executeAction(nextAction);
state = state.transition(result);
// кэширование контекста после каждого шага
await contextCache.update(state);
}
return state.finalAnswer();
}
Заметили State? Это не просто стопка сообщений. Это объект, который хранит не только историю диалога, но и текущее дерево файлов, список инструментов, флаги безопасности, план выполнения. state.transition() — это чистая функция, которая возвращает новое состояние без мутации. Именно это позволяет откатывать действия (undo).
Кэш контекста — отдельная тема. Он хранится в SQLite (code_prompt_cache_v3.db) и работает на основе эмбеддингов, а не полных промптов. Это позволяет не платить за повторный анализ одних и тех же файлов.
Что на самом деле происходит с безопасностью: разбор флагов
Давайте рассмотрим реальную конфигурацию, которую вы можете передать при старте:
| Флаг | Описание | Уровень риска |
|---|---|---|
--no-auto-agree |
Требовать подтверждение на каждое действие | Низкий (защищён) |
--danger-allow |
Разрешить выполнение опасных команд (rm -rf, chmod и т.п.) | Высокий (опасно) |
--tools=all |
Включить все доступные инструменты, включая экспериментальные | Средний |
--confirm-required=delete_file,run_command |
Кастомный список опасных действий | Низкий (кастомный) |
Секрет в том, что даже с --danger-allow агент не выполнит действие мгновенно — он сначала покажет команду и попросит подтверждение (если не включен --yes). Так что «вырвался и всё удалил» — это миф, если вы не нажали Enter сознательно.
Пример: как выглядит реальный flow агента
Допустим, вы попросили Claude Code отрефакторить функцию processPayment().
Шаг 1. MainAgent строит план: найти файл, прочитать, изменить, запустить тесты.
Шаг 2. SubAgent выполняет задачу «найти файл» — использует инструмент grep по проекту.
Шаг 3. После нахождения файла — SubAgent «читать файл» — читает содержимое и возвращает в контекст.
Шаг 4. MainAgent на основе прочитанного кода решает, как рефакторить. Выбирает инструмент edit_file. Но перед этим он проверяет флаг confirmRequired — действие не в списке? Ок, выполняет.
Шаг 5. После редактирования — запуск тестов. Тесты падают. AgentController передаёт ошибку MainAgent'у, тот строит новый план для SubAgent'а «исправить ошибку».
Весь этот цикл управляется queryLoop и State. Никакой магии. Всё предсказуемо и логично.
Кому вообще нужен этот разбор?
Разбор кода — не для галочки. Он нужен:
- Разработчикам AI-агентов — чтобы не повторять ошибки Anthropic (например, почему они не используют стейт-машину с event sourcing? А они используют, но криво).
- CTO и инженерам, внедряющим Claude Code в CI/CD — понимать, как управлять безопасностью и контекстом, чтобы не получить счёт на $10 000 за просто так.
- Любопытным — если вам интересно, как устроена когнитивная архитектура современного AI-кодера.
Полезно почитать также статью о джедайском уровне работы с Claude Code — там практика на основе этого же кода.
Последний совет: не верьте в магию
Claude Code v2.1.88 — это не думающий коллега. Это просто хорошо структурированный код, который принимает решения на основе конечного автомата и фиксированного набора инструментов. Мифы рождаются от непонимания. Теперь у вас есть карта этой машинной комнаты. Пользуйтесь.
И самое важное: если вам когда-нибудь покажется, что агент «сошел с ума» и делает что-то странное — проверьте State. В 99% случаев проблема в том, что State испорчен или кэш устарел. Сбросьте кэш (rm -rf ~/Library/Caches/Claude/ на macOS) и попробуйте снова. И только потом кричите про восстание машин.