Перейти к содержимому

Модель агента

Агент — это именованный субъект с персоной, набором навыков и адаптером для работы. Агенты — такие же субъекты, как и люди: они пишут сообщения, владеют тикетами, оставляют ревью и попадают в тот же список. Именно они выполняют работу.

Каждый агент принадлежит ровно одному рабочему пространству. Это жёсткий инвариант: agent.workspaceId не равен null, именно рабочее пространство агента определяет, в какой файл базы данных попадают его строки, а создание агента без рабочего пространства отклоняется.

Агент — это ещё и каталог. Его определение лежит в agents/<slug>/AGENTS.md в каталоге данных рабочего пространства, а его навыки подключены символическими ссылками в agents/<slug>/.agents/skills. Строка базы данных и файл записываются вместе. Начальное заполнение идемпотентно: если строка агента уже существует, файлы на диске и ссылки на навыки всё равно перезаписываются. В продакшене вызывающей стороной служит создание рабочего пространства, а не каждый запуск сервера.

Атрибут Что делает
name Короткий идентификатор в стиле slug (architect, qa). Он же то, на что разрешаются @mentions
title Название должности, понятное человеку
persona Личные качества и поведенческие инструкции в свободной форме, вставляются как раздел промпта
systemPrompt Необязательные дополнительные инструкции, вставляются как раздел «Agent instructions» — они не заменяют остальную часть собранного промпта
skills Набор имён навыков без учёта регистра, отражается на диске в виде ссылок на навыки
adapterId Раннер, которому агент передаёт работу. Null переключает на встроенный цикл
modelId Какую модель использовать в рамках этого адаптера
effort Уровень рассуждений, берётся из собственного словаря выбранной модели
contextSize Переопределение контекстного окна
silenceTimeoutMinutes Переопределение для отдельного агента (1–240) для сторожа тишины
reportsTo Идентификатор родительского агента — цепочка подчинения, которую рисует оргструктура

Все эти поля вы редактируете в разделе Настройки → Рабочее пространство → Агенты. Новый агент создаёт агента без имени, который вы затем заполняете.

Навыки — это имена на сущности агента, нечувствительные к регистру. С ними происходят две разные вещи:

  • Имена перечисляются в собранном промпте под заголовком «Skills». Это всё, что набор на сущности делает сам по себе: отдельной библиотеки промптов для каждого навыка, привязанной к нему, нет.
  • Каталог каждого названного навыка (skills/<slug>/SKILL.md в рабочем пространстве) связывается с собственным каталогом агента. На встроенном раннере frontmatter связанных навыков автоматически загружается в системный промпт, а тело агент читает по требованию; ввод /skill:<name> в разговоре загружает это тело как директиву для текущего хода.

Навыки, загружаемые извне, между получением и записью проходят проверку цепочки поставок по принципу fail-closed: без вердикта на диск или в промпт не попадает никакое содержимое навыка. Внешний источник — это репозитории GitHub, которые вы сами регистрируете как источники навыков: кураторского каталога нет, поэтому собственные метаданные репозитория (его описание, его звёзды, имя навыка) — недоверенные отображаемые данные, а вердикт проверки — единственный сигнал безопасности. Установка загружает весь каталог навыка и закрепляет его за коммитом, из которого он получен, в skills-lock.json, а последующее обновление заново проходит шлюз, прежде чем что-либо заменить. Инструкция — в разделе Устанавливать и управлять навыками.

Репозиторий может поставлять собственные навыки в любом из общепринятых мест (.agents/skills/, .claude/skills/, .opencode/skills/). Пространство выкладывает каждый подключённый репозиторий рядом с другими в repos/<name>/, но агент работает только с одним репозиторием за раз — поэтому он несёт только навыки этого репозитория, и они сменяются, когда он переходит в другой.

Какой репозиторий активен, выводится из файлов, которых касается агент: запись файла в repos/<name>/ делает этот репозиторий активным, а простое чтение по разным репозиториям — нет, поэтому погоня за символом в соседний сервис никогда не подменяет набор под выполняемой задачей. В пространстве с одним репозиторием ответ известен ещё до первого хода.

Такое ограничение области — решение из бюджета контекста. Индекс навыков находится в промпте на каждом ходу, а тела — нет, поэтому перечисление навыков всех репозиториев сразу непрерывно расходует токены, а навык testing из одного сервиса активно вводит в заблуждение, когда работа идёт в другом. По той же причине индекс агента несёт один репозиторий, а поле ввода сообщения так не ограничено: назвать навык самостоятельно — это одно явное действие, поэтому /skill:<repo>:<name> достаёт до любого репозитория в пространстве.

Навыки репозитория загружаются для каждого адаптера, а не только для встроенного раннера. Навыки активного репозитория материализуются в рабочем каталоге агента — это путь, который Claude Code и так сканирует; тот же индекс собирается в AGENTS.md, который читает встроенный раннер. Навыки репозитория проходят ту же проверку по принципу fail-closed, что и установленный навык, прежде чем происходит что-либо из этого: выложенный репозиторий — это клонированное содержимое, и его frontmatter попадает в промпт.

У агента нет собственных флагов разрешений. Может ли он создать коммит, отправить изменения, открыть pull request, писать во внешний трекер или выходить в сеть, решают ограничения действий — разрешить, спросить сначала или запретить, на уровне рабочего пространства, агента или пространства, — и одни и те же правила действуют независимо от того, какой адаптер его запускает.

То, что запуск получает, от этих правил не меняется. Запуск в worktree GitHub всегда получает токен GitHub только для чтения, а о push спрашивают в момент, когда он происходит: конфигурация git агента отправляет каждый push в GitHub через Control Center, который применяет правило Отправить в удалённый репозиторий, прежде чем передать его дальше.

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

Адаптер определяет, что можно обеспечить принудительно

Заголовок раздела «Адаптер определяет, что можно обеспечить принудительно»

Самое значимое поле агента — его адаптер, потому что транспорт адаптера определяет, какую долю политики Control Center действительно можно обеспечить принудительно.

Транспорт Адаптеры Что Control Center обеспечивает принудительно
Встроенный раннер Control Center (built-in) Всё. Набор инструментов строится исходя из режима, поэтому запрещённый инструмент невидим, а не просто отклоняется; каждый вызов проходит шлюз одобрения и ограничения действий; контракт завершения может подтолкнуть, а затем завалить запуск, который завершается без своего результата
Claude CLI Claude Code Инструменты mcp__*, которые ему передаются, а также его команды Bash, которые хук перед выполнением отправляет в политику действий. Собственные инструменты Claude для чтения, записи и редактирования живут в его процессе и выполняются незаметно — а запускается он с --dangerously-skip-permissions, потому что неинтерактивный claude -p иначе навсегда завис бы на собственном запросе

Конкретно: только встроенный раннер поддерживает субагентов, направление по ходу запуска, паузу и возобновление (а значит, и перехват управления) и структурное применение режима. Ничего из этого Claude Code не умеет.

Агент без адаптера переключается на Control Center (built-in) — цикл внутри сервера, так что устанавливать CLI не нужно, — и в его журнале запусков записывается cc-harness. Каждый агент из начального набора создаётся без адаптера и модели, поэтому все пять агентов нового рабочего пространства работают там, на модели Anthropic по умолчанию, пока вы не зададите адаптер и модель каждому агенту. Выбор «адаптер по умолчанию» при первом запуске — это настройка на стороне клиента, которую сервер никогда не читает, и она не применяется задним числом к уже созданным агентам.

  • Создаются вместе с рабочим пространством. Каждое рабочее пространство — не только первое — получает CEO и четырёх специалистов (qa, architect, engineer, librarian), подчиняющихся ему, которые идемпотентно создаются в фоне при создании рабочего пространства. См. Рабочие пространства и изоляция.
  • Добавляются вручную в разделе Настройки → Рабочее пространство → Агенты. Просьба к агенту нанять коллегу не создаёт строку; используйте этот экран.

У агента нет хранимого столбца состояния. Его текущее состояние выводится из журналов последних запусков при каждом чтении:

Состояние Значение
neverRun Журнала запусков не существует
running Хотя бы один запуск выполняется прямо сейчас
failed Последний запуск завершился ошибкой, либо его liveness равен failed или dead
blocked liveness последнего запуска равен blocked, stalled или looping
idle Всё остальное — агент уже запускался, и у него ничего не выполняется

Ещё два состояния, queued и succeeded, существуют для отдельных запусков в дереве запусков разговора; список агентов их никогда не выдаёт, потому что зелёный цвет завершённого запуска — факт о запуске, а не об агенте.

Список присутствия показывает параллельную, более грубую картину, синтезируемую на сервере из событий запусков в реальном времени, — размышляет, выполняется, ждёт одобрения, готово, — именно поэтому агенты появляются рядом с людьми. См. Совместная работа и присутствие.