javascript

Миграция AI-agent harness: как перенести rules, skills и MCP между ИИ-агентами

  • суббота, 22 августа 2026 г. в 00:00:04
https://habr.com/ru/articles/1069340/

Смена ИИ-агента может за один день обнулить месяцы настройки рабочего процесса. Новый инструмент откроет тот же репозиторий, но не будет понимать правил проекта, команд проверки, границ доступа к файлам, ролей субагентов и подключений к внешним системам. Вам снова придётся объяснять контекст в каждом запросе.

Проблема возникает потому, что ценность накоплена не только в выбранной модели. Вокруг неё постепенно формируется отдельный инженерный слой: правила проекта, инструкции для повторяемых задач, роли субагентов, MCP-подключения, ограничения доступа и описание репозитория. Этот слой часто называют AI-agent harness, в статье будем определять, какие факты получает модель, что ей разрешено делать и как она должна проверять результат.

Что произойдет если перенести конфигурацию механически? 

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

Простое копирование файлов не подтверждает, что агент ведёт себя так же безопасно и предсказуемо.

Мы расскажем как перенести накопленные настройки между Claude Code, Codex, Cursor, opencode и Veai без повторной сборки рабочего процесса с нуля. Разберём, как провести инвентаризацию rules, skills, субагентов, MCP и AGENTS.md, сопоставить их возможности в пяти средах, проверить доверие к каждому компоненту и испытать новую конфигурацию на реальной задаче. В результате у разработчика будет пошаговый план миграции и проверяемые критерии, по которым можно подтвердить, что правила, инструменты и ограничения действительно работают.

Конфигурация как отдельный слой инженерной системы

ИИ-агент отличается от чата наличием инструментов. Он читает и изменяет файлы, запускает сборку и тесты, вызывает команды, обращается к внешним сервисам. Модель принимает решения на основании контекста, доступного в текущем запуске.

Упрощённая схема выглядит так:

Запрос разработчика
        |
        v
+---------------------------+
| Системный контекст        |
| - правила                 |
| - описание проекта        |
| - описания навыков        |
| - роли субагентов         |
| - схемы инструментов      |
+---------------------------+
        |
        v
+---------------------------+
| Модель                    |
| выбирает действие         |
+---------------------------+
        |
        v
+---------------------------+
| Инструменты               |
| IDE | shell | MCP | файлы |
+---------------------------+
        |
        v
Результат инструмента возвращается в контекст

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

В практической конфигурации удобно выделять пять сущностей.

Сущность

Назначение

Пример содержимого

Частота применения

Rules (правила)

Постоянные ограничения поведения

«Тесты в этом модуле писать на JUnit 5»

В каждом подходящем запросе

Skills (навыки)

Инструкция для повторяемой процедуры

Создание сквозного теста по принятому шаблону

По запросу или выбору агента

Agents (субагенты)

Специализированная роль с ограниченным набором инструментов

Ревьюер без права редактировать файлы

Для отдельной подзадачи

MCP

Подключение к внешнему инструменту

Jira, GitHub или внутренний сервис

При вызове соответствующего tool

AGENTS.md

Контекст конкретного репозитория

Стек, команды, архитектурные границы

При работе с проектом

Эти сущности похожи по форме: многие из них представлены Markdown, JSON, YAML или TOML. По назначению они различаются. Если записать пошаговый процесс в постоянное правило, модель будет получать длинную инструкцию даже в задачах, где процесс не нужен. Если хранить запрет на изменение рабочей конфигурации только внутри навыка, агент может не загрузить навык и пропустить запрет.

Где проходит граница между правилами, навыками и субагентами

Ошибки в структуре harness часто появляются до миграции. Переезд лишь делает их заметнее.

Rules: ограничения, действующие заранее

Rule подходит для требования, которое агент должен знать до выбора первого действия. Хорошее правило отвечает на проверяемый вопрос.

Плохо:
Пиши качественный код.

Лучше:
Для тестов модуля billing используй JUnit 5.
После изменения production-кода запусти конфигурацию billing:test.
Не изменяй snapshots без подтверждения владельца задачи.

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

Skills: процедура с ресурсами

Skill описывает, как выполнить повторяемую работу. Внутри могут находиться:

<skill-name>/
├── SKILL.md
├── scripts/
└── resources/

SKILL.md обычно содержит имя, описание условий применения и саму инструкцию. Скрипты выполняют детерминированные операции, ресурсы хранят шаблоны и справочные материалы. До активации skill агент может видеть только его краткое описание. Значит, описание выполняет роль маршрутизатора: по нему модель решает, относится ли skill к задаче.

Слишком широкая формулировка вроде «помогает писать тесты» приводит к случайному выбору. Полезнее указать тип задачи, стек и ожидаемый результат: «Создаёт e2e-тесты HTTP API проекта X, использует существующие fixtures и запускает конфигурацию Y».

Agents: роль, полномочия и модель

Специализированный agent объединяет системную инструкцию, разрешённые инструменты, skills и выбранную модель. Концептуально его можно представить так:

# ПСЕВДОКОД. Это не готовый файл для конкретного продукта.
name: code-reviewer
description: Проверяет готовый diff после реализации
tools:
  - read_source
  - find_usages
  - run_tests
skills:
  - project-review-checklist
model_profile: review
permissions:
  write_files: false

Такой агент получает меньше полномочий, чем исполнитель. Ограничение записано в конфигурации роли, а не оставлено на усмотрение модели. Для ревью это полезное разделение: проверяющий читает diff, запускает анализ и сообщает проблемы, но не исправляет собственные находки молча.

MCP: инструменты за пределами локальной среды

MCP-сервер предоставляет агенту внешние действия. Подключение может дать доступ к задачам, репозиториям, документации или корпоративным API. Вместе с пользой оно расширяет поверхность риска:

  • описание каждого инструмента попадает в доступный модели набор;

  • сервер может запросить секрет или сетевой доступ;

  • вызов способен изменить внешнее состояние;

  • большое число похожих tools усложняет выбор;

  • несколько серверов могут предлагать пересекающиеся операции.

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

AGENTS.md: контракт репозитория с агентами

AGENTS.md хранится в корне проекта и версионируется вместе с кодом. Это делает его подходящим местом для общей информации:

  • стек и модули;

  • команды сборки и тестов;

  • архитектурные границы;

  • правила изменения критичных частей;

  • завершённые и незавершённые зоны миграции;

  • требования к проверке результата.

Файл не должен дублировать всё дерево каталогов и список зависимостей, если агент может получить их из проекта. Полезная информация отвечает на вопросы, которые невозможно надёжно восстановить из одного чтения кода: какую конфигурацию запуска считать приёмочной, какой модуль владеет контрактом, какие generated-файлы нельзя править вручную.

Одинаковые сущности под разными именами

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

Назначение

Claude Code

Codex

Cursor

opencode

Veai

Правила

CLAUDE.md.claude/rules

AGENTS.md

.cursor/rulesAGENTS.md

AGENTS.md

AGENTS.md.veai/rules

Skills

.claude/skills

.agents/skills

.cursor/skills

.opencode/skills

.veai/skills

Agents

.claude/agents

.codex/agents, конфигурация TOML

.cursor/agents

.opencode/agents

.veai/agents

MCP

.mcp.json

config.toml

.cursor/mcp.json

opencode.json

.veai/mcp_servers.json

Некоторые среды читают каталоги других агентов. В частности, каталог .claude/skills может подхватываться Cursor, opencode и Veai без копирования. Это уменьшает число дубликатов, но совместимость нужно проверять на конкретном skill. Ссылка на скрипт, недоступный tool или продуктовый макрос могут не сработать, даже если Markdown успешно обнаружен.

Главный принцип переноса формулируется так:

совместимость файла != совместимость поведения

Успешное обнаружение skill подтверждает только то, что целевая среда увидела каталог и метаданные. Нужна отдельная проверка выбора skill, доступности ресурсов, выполнения скриптов и результата на типовой задаче.

Персональный и проектный harness

Перед миграцией конфигурацию делят по владельцу и жизненному циклу.

Персональный уровень
~/.<agent>/...
  - личные правила работы
  - личные skills
  - пользовательские MCP-подключения
  - профили моделей

Проектный уровень
<repo>/AGENTS.md
<repo>/.<agent>/...
  - соглашения команды
  - проектные skills
  - разрешённые MCP
  - ограничения чтения и записи
  - память проекта, если среда её поддерживает

Персональная настройка следует за разработчиком между репозиториями. Проектная конфигурация проходит code review и приезжает всей команде. Смешение уровней создаёт две проблемы.

Первая: личный путь или токен случайно попадает в Git. Вторая: обязательное правило остаётся только на машине автора, поэтому остальные участники получают другое поведение агента.

Для каждой записи при инвентаризации полезно фиксировать:

Поле

Вопрос

Владелец

Личный пользователь, команда или платформа?

Область

Один файл, модуль, репозиторий или все проекты?

Секреты

Есть ли токены, адреса внутренних систем, персональные пути?

Зависимости

Какие tools, скрипты и переменные окружения нужны?

Проверка

Каким тестом подтверждается работа настройки?

Срок жизни

Настройка постоянная, временная или уже устарела?

Цена harness измеряется контекстом и числом итераций

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

Однако причинная цепочка сохраняется:

больше постоянных инструкций и tool schemas
                |
                v
меньше места для кода, истории и результатов запусков
                |
                v
выше риск потери релевантного фрагмента или неверного выбора tool
                |
                v
дополнительные чтения, исправления и повторные запросы
                |
                v
рост времени модели и времени разработчика

Расход стоит измерять на полном цикле задачи. Одна короткая инструкция может увеличить исходный промпт и одновременно сократить три повторных попытки. Удаление правила уменьшит стартовый контекст, но приведёт к дорогой переделке. Оптимизировать только размер файла недостаточно.

Для эксперимента фиксируют:

  • объём постоянных правил;

  • число доступных инструментов;

  • сколько skills было обнаружено и сколько загружено полностью;

  • число обращений к модели;

  • число вызовов tools;

  • время работы модели;

  • время проверки разработчиком;

  • количество исправлений после первого результата;

  • долю итогового diff, принятую без ручной переписи.

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

Prompt supply chain: почему конфигурацию нужно ревьюить как код

Публичные реестры позволяют быстро найти готовые skills, agents и MCP-серверы. Это хороший источник заготовок и одновременно цепочка поставки исполняемых инструкций.

Промпт может приказать модели читать дополнительные файлы, запускать скрипты, отправлять данные внешнему tool или игнорировать локальные ограничения. Скрипт внутри skill способен выполнить всё, что разрешено процессу. MCP-сервер добавляет сетевую и операционную границу. Поэтому установка пакета harness требует тех же вопросов, что подключение зависимости:

  1. Кто автор и где исходный репозиторий?

  2. Когда проект обновлялся?

  3. Прочитан ли полный текст инструкции?

  4. Какие scripts и resources подключены?

  5. Какие инструменты и сетевые адреса требуются?

  6. Есть ли запись версии или commit hash?

  7. Как обновление попадёт в команду?

  8. Как откатить изменение?

Минимальная модель угроз:

Внешний реестр
      |
      v
SKILL.md / agent / MCP package
      |
      +--> скрытая инструкция
      +--> скрипт с побочным эффектом
      +--> запрос избыточных полномочий
      +--> подмена при обновлении
      |
      v
Агент с доступом к коду, shell и внешним системам

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

Миграция в семь этапов

Этап 1. Зафиксировать исходное поведение

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

  • локальное изменение production-кода с запуском теста;

  • ревью diff без права записи;

  • обращение к одному разрешённому MCP-серверу;

  • задача, для которой правило запрещает изменение определённой директории.

Для каждой задачи сохраните запрос, ожидаемые действия, запрещённые действия и критерий приёмки. Это baseline для сравнения после переезда.

Сценарий: добавить тест к существующей функции
Ожидается:
  [ ] агент читает AGENTS.md
  [ ] выбирает проектный test skill
  [ ] изменяет только разрешённый модуль
  [ ] запускает нужную конфигурацию
  [ ] сообщает результат запуска
Запрещено:
  [ ] менять production-код
  [ ] читать каталог secrets
  [ ] вызывать внешние MCP

Этап 2. Собрать инвентарь

Проверьте каталоги старых сред и классифицируйте находки по типу. Для миграции в Veai запрос к агенту может быть сформулирован так:

Найди настройки ИИ-агентов в каталогах .claude, .cursor и .codex.
Сначала покажи инвентарь: правила, skills, agents и MCP-конфигурации.
Не копируй секреты и абсолютные пользовательские пути.
Для каждого объекта укажи источник, назначение, зависимости и целевой путь.
После подтверждения перенеси:
- правила в .veai/rules;
- память проекта в .veai/memory;
- MCP-конфигурацию в .veai/mcp_servers.json.
Отдельно перечисли то, что не удалось преобразовать однозначно.

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

Этап 3. Удалить дубли и противоречия

Соберите матрицу правил:

Идентификатор

Источник

Область

Требование

Конфликт

test-framework

.claude/rules/...

/test/

JUnit 5

Нет

autonomous-mode

CLAUDE.md

весь проект

Не задавать вопросов

Да

escalation

.cursor/rules/...

весь проект

Спрашивать при неоднозначности

Да

Конфликт нельзя решать порядком загрузки, если приоритет не закреплён и не проверен. Команда должна выбрать одну политику и удалить вторую. Требования вида «работай автономно» и «при любой неуверенности остановись» без описания границ создают нестабильное поведение.

Этап 4. Перенести смысл, затем формат

Есть три режима миграции:

  1. Reuse: целевая среда читает исходный каталог без изменений.

  2. Copy with adaptation: содержимое сохраняется, метаданные и ссылки преобразуются.

  3. Rewrite: сущность проектируется заново из-за другой модели permissions или tools.

Skills из .claude/skills в некоторых средах подходят для reuse. Правила чаще требуют адаптации из-за разных масок, режимов включения и приоритетов. MCP-конфигурации требуют внимательной проверки полей и секретов. Историю чатов обычно нельзя считать переносимой частью harness, если конкретный агент не хранит её в доступных файлах.

Любой пример преобразованной конфигурации до проверки документацией должен маркироваться как псевдокод:

{
  "_comment": "ПСЕВДОКОД: сверить формат с целевой средой",
  "servers": {
    "issue-tracker": {
      "command": "<local-command>",
      "args": ["<args>"],
      "env": {
        "TOKEN": "${ENV_TOKEN}"
      }
    }
  }
}

Секрет хранится во внешней переменной окружения. Реальное имя поля, способ подстановки и транспорт зависят от реализации MCP-клиента.

Этап 5. Ограничить чтение и запись

Harness должен описывать не только желаемое поведение, но и технические границы. В Veai для этого предусмотрены .veai/tools/.readignore и .veai/tools/.writeignore.

Разделение важно:

  • read ignore закрывает данные, которые агент не должен получать в контекст;

  • write ignore защищает файлы от изменения;

  • запрет записи не мешает чтению;

  • запрет чтения нельзя заменять фразой в промпте, если доступ способен ограничить сам инструмент.

Пример политики, а не готовый универсальный файл:

# ПСЕВДОКОД: пути нужно адаптировать к репозиторию.
# Кандидаты для ограничения чтения:
.env
secrets/**
private-keys/**
customer-exports/**

# Кандидаты для ограничения записи:
prod/**
generated/**
migrations/applied/**

Перед добавлением масок проверьте, не ломают ли они законную задачу. Слишком широкое правило config/** может скрыть схему, нужную для компиляции. Слишком узкое правило пропустит резервную копию секрета с другим расширением.

Проверка должна стимулировать реальную границу:

[ ] Агент пытается прочитать запрещённый тестовый файл и получает отказ.
[ ] Агент пытается изменить защищённый тестовый файл и получает отказ.
[ ] Разрешённый соседний файл читается и изменяется.
[ ] Отказ виден пользователю, а не маскируется пустым результатом.

Используйте искусственные данные, специально созданные для проверки. Не просите агента демонстрировать защиту на рабочем секрете.

Этап 6. Подключить минимальный набор MCP и agents

После миграции не включайте сразу все найденные серверы и роли. Начните с одного сценария и минимальных полномочий.

Для каждого MCP проверьте:

  • запускается ли сервер;

  • какие tools он публикует;

  • какие операции меняют состояние;

  • куда уходят данные;

  • как передаются секреты;

  • существует ли тайм-аут;

  • что получает агент при ошибке;

  • можно ли отключить сервер на уровне проекта.

Для каждого specialized agent проверьте:

  • соответствует ли описание задачам, для которых его должны выбирать;

  • нет ли лишних tools;

  • доступны ли указанные skills;

  • применяются ли проектные ограничения;

  • может ли роль вернуть управление родительскому агенту;

  • не редактирует ли ревьюер проверяемый код.

Этап 7. Повторить baseline и сравнить доказательства

Запустите те же сценарии, которые фиксировали на первом этапе. Сравнивать нужно не стиль ответа, а наблюдаемое поведение.

Проверка

До миграции

После миграции

Статус

Правило тестового фреймворка применилось

Да

Да

Pass

Запрещённая директория не изменена

Да

Да

Pass

Skill выбран по нужной задаче

Да

Да

Pass

Ревьюер работал без записи

Да

Да

Pass

MCP вызван только в разрешённом сценарии

Да

Да

Pass

Приёмочная команда завершилась успешно

Да

Да

Pass

Число лишних чтений файлов

baseline

новое значение

Анализ

Число повторных запросов

baseline

новое значение

Анализ

Миграция считается завершённой после прохождения поведенческих проверок. Наличие каталогов и валидный JSON подтверждают структуру, но не работу harness.

Acceptance checks для CI и ручной приёмки

Часть проверок можно автоматизировать без вызова модели.

Статические проверки

[ ] В корне есть ровно один актуальный AGENTS.md.
[ ] В проектных файлах нет абсолютных домашних путей.
[ ] В MCP-конфигурации нет токенов и паролей.
[ ] Все scripts, на которые ссылаются skills, существуют.
[ ] Ресурсы skills доступны по относительным путям.
[ ] Имена agents и skills не конфликтуют после нормализации.
[ ] Нет двух правил с противоположными требованиями для одной маски.
[ ] Ignore-файлы проходят тест на разрешённых и запрещённых fixtures.

Пример нейтрального скрипта поиска потенциальных секретов:

# Пример проверки. Набор шаблонов нужно согласовать с политикой команды.
grep -RInE '(api[_-]?key|token|password)[[:space:]]*[:=]' \
  AGENTS.md .claude .cursor .codex .opencode .veai

Совпадение не доказывает утечку: это может быть документационный пример. Отсутствие совпадений тоже не гарантирует чистоту. Скрипт служит сигналом для ревью.

Поведенческие проверки

Поведенческий набор запускают в тестовом репозитории или на изолированной ветке:

  1. Запрос, который обязан активировать конкретный skill.

  2. Похожий запрос, который не должен его активировать.

  3. Попытка чтения запрещённого fixture.

  4. Попытка записи в защищённый fixture.

  5. Вызов read-only MCP-операции.

  6. Попытка вызвать изменяющую операцию из роли без разрешения.

  7. Ошибка теста, которую агент должен увидеть и сообщить без сокрытия.

  8. Ревью готового diff специализированной ролью.

Для каждого теста заранее фиксируют ожидаемый след действий. Ответ «готово» не является доказательством. Нужны факты: список изменённых файлов, результат запуска, отказ инструмента, diff и журнал вызовов.

Нагрузочная проверка контекста

Точный размер контекста доступен не во всех средах. Даже без него можно сравнить косвенные показатели:

  • сколько постоянных сущностей подключено;

  • сколько tools доступно модели;

  • сколько файлов агент читает до первого изменения;

  • сколько повторов нужно до принятого результата;

  • растёт ли история из-за объёмных логов;

  • появляются ли обращения к нерелевантным MCP.

Проводите сравнение на одинаковом commit, с одинаковым запросом и сопоставимым профилем модели. Один прогон не отделяет эффект harness от вариативности генерации. Нужна серия повторов и ручная классификация причин отклонений.

Маршрутизация моделей как часть harness

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

Концептуальная конфигурация:

# ПСЕВДОКОД. Имена полей и значения моделей нужно сверить в продукте.
profiles:
  fast:
    description: Чтение файлов и поиск по коду
    model: <fast-model>
    reasoning: low

  balanced:
    description: Анализ и ограниченная реализация по готовому плану
    model: <balanced-model>
    reasoning: medium

  strong:
    description: Архитектурный анализ и сложная отладка
    model: <strong-model>
    reasoning: high

  review:
    description: Независимая проверка готового изменения
    model: <model-from-another-vendor>
    reasoning: medium

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

Разделение исполнителя и ревьюера между моделями разных вендоров снижает риск повторения одного и того же шаблона ошибки, но не гарантирует независимость. Обе модели могут опираться на одинаковое неверное требование или один набор тестов. Независимость усиливают отдельный acceptance test, роль без записи и другой источник фактов, например инспекции IDE или воспроизводимый runtime-сценарий.

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

Почему IDE меняет устройство harness

CLI-агенты часто собирают контекст через текстовый поиск, чтение файлов и команды терминала. AI IDE может добавлять RAG для семантического поиска. Агент внутри JetBrains IDE получает ещё один класс источников: структурные индексы кода, иерархии типов, точные использования, рефакторинги, конфигурации запусков, инспекции и отладчик.

Разница влияет на инструкции. Правило «найди все вхождения имени и замени» подталкивает к текстовой операции. Для IDE-агента корректнее требовать семантический рефакторинг и проверку использований. Запрос «прочитай полный лог» может быть хуже задачи «остановись на исключении, покажи стек и значения переменных».

Текстовый путь
запрос -> grep -> файлы целиком -> модель -> текстовая замена

IDE-путь
запрос -> символ -> объявления/использования -> IDE refactoring
       -> инспекции/запуск/отладчик -> модель получает точные факты

Veai использует возможности JetBrains IDE для навигации, рефакторингов, инспекций, запусков и работы с отладчиком. Это не отменяет rules и skills. Harness должен указывать агенту, какой точный механизм применить и какое доказательство вернуть. Фраза «проверь код» слишком широка. Требование «запусти инспекции изменённых файлов, затем конфигурацию тестов модуля и перечисли оставшиеся ошибки» задаёт наблюдаемую процедуру.

Точность сбора контекста влияет и на расходы. Если использование символа можно получить из индекса, нет нужды отправлять модели десятки файлов с совпадением строки. Но преимущество нужно измерять на своём проекте: неполная индексация, динамические языковые конструкции, generated-код и сломанная конфигурация проекта способны снизить качество структурного поиска.

Что не переносится автоматически

Даже при близкой структуре каталогов останутся потери.

История чатов

История зависит от формата хранения и политики продукта. Если она не представлена переносимыми файлами, включать её в обязательный scope миграции нельзя. Ценные решения лучше вынести в версионируемые rules, AGENTS.md или проектную память с понятной структурой.

Семантика инструментов

Tool с похожим названием может иметь другие полномочия и формат результата. find usages через IDE и строковый поиск дают разные множества. Команда должна проверить не только имя, но и поведение.

Приоритет инструкций

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

Модель permissions

Одна среда ограничивает tool на уровне роли, другая полагается на подтверждение пользователя, третья использует ignore-файлы. Перенос текста «не изменяй X» не эквивалентен техническому запрету записи.

Продуктовые макросы и команды

Команды инициализации, подстановки переменных, ссылки на resources и формат метаданных могут различаться. Неизвестный синтаксис нельзя переносить по аналогии. Его сверяют с целевой средой и проверяют минимальным примером.

Рабочий playbook для platform engineering

Команда платформы может оформить миграцию как короткий проект с владельцами и артефактами.

Подготовка

  • назначить владельца целевого harness;

  • определить репозитории пилота;

  • собрать baseline-сценарии;

  • создать карантин для внешних skills и MCP;

  • определить политику секретов и сетевого доступа;

  • выбрать способ отката.

Инвентаризация

  • найти конфигурации Claude Code, Codex, Cursor, opencode и Veai;

  • разделить персональные и проектные объекты;

  • удалить устаревшие копии;

  • записать зависимости каждого объекта;

  • отметить сущности без владельца.

Проектирование

  • выбрать канонический AGENTS.md;

  • разнести постоянные ограничения и процедуры;

  • сократить описания tools и profiles до различимых формулировок;

  • ограничить роли минимальным набором действий;

  • подготовить read/write ignore;

  • определить, какие каталоги используются напрямую, а какие адаптируются.

Реализация

  • переносить по одному классу сущностей;

  • после каждого шага запускать соответствующий тест;

  • не коммитить секреты и персональные пути;

  • фиксировать источник внешнего компонента и версию;

  • оставлять пометку у временного псевдокода до проверки формата.

Приёмка

  • прогнать baseline;

  • проверить отрицательные сценарии permissions;

  • сравнить число лишних tools и чтений;

  • выполнить независимое ревью harness;

  • проверить diff на секреты;

  • зафиксировать результат и известные ограничения.

Эксплуатация

  • ревьюить изменения harness как production-код;

  • назначить период проверки внешних компонентов;

  • удалять правила, которые больше не соответствуют процессу;

  • обновлять acceptance tests при изменении архитектуры;

  • измерять полный цикл задач после смены модели или тарификации.

Ограничения подхода

Harness не исправляет неясные требования и сломанную сборку. Он способен закрепить плохой процесс так же успешно, как хороший. Если команда не знает, какой тест подтверждает результат, подробный skill лишь автоматизирует последовательность без доказательства корректности.

Совместимый каталог не гарантирует одинаковую интерпретацию. Модели по-разному выбирают tools и следуют длинным инструкциям. Даже в одной среде обновление модели может изменить поведение маршрутизации.

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

Метрики контекста трудно сравнивать между продуктами. Вендоры используют разные окна, кэширование, единицы оплаты и способы загрузки tools. Корректный вывод ограничивается конкретным сценарием, версией среды, профилем модели и состоянием проекта.

Наконец, независимое ревью другой моделью остаётся вероятностной проверкой. Компиляция, тест, статический анализ, IDE inspection и воспроизводимый runtime-сценарий дают более строгие свидетельства, если сами критерии соответствуют требованию.

Подведем итоги

Миграция AI-agent harness состоит из переноса поведения, полномочий и проверок. Копирование Markdown и JSON выполняет лишь структурную часть.

Рабочая последовательность выглядит так:

  1. Зафиксировать типовые сценарии до переезда.

  2. Собрать rules, skills, agents, MCP и AGENTS.md из всех сред.

  3. Разделить личную и проектную конфигурацию.

  4. Проверить источники как цепочку поставки инструкций и кода.

  5. Удалить конфликты и перенести смысл в формат целевого агента.

  6. Ограничить чтение, запись и внешние tools техническими средствами.

  7. Запустить положительные и отрицательные сценарии.

  8. Сравнить полный цикл задачи, включая проверки и переделки.

Veai позволяет собрать проектный harness рядом с кодом, использовать совместимые skills, ограничивать доступ через read/write ignore, подключать специализированные роли и маршрутизировать задачи между моделями. Дополнительный слой JetBrains IDE даёт агенту структурную навигацию, рефакторинги, инспекции, запуски и отладчик. Польза появляется тогда, когда эти механизмы закреплены в проверяемом процессе, а результат подтверждается фактами среды.

Попробовать агент и проверить свой migration playbook можно на veai.ru.