ai-setup-apm
Перед существенным изменением публикуемого источника истины получи
ai-work-control/full; продолжай по его результату без повторения контроля.
Переносимость
P0 выполняет настройку и проверку через файловые операции агента и доступные
команды самой целевой задачи. До запуска поставляемого скрипта проверь Python 3
или POSIX-среду по его shebang. Если среда недоступна, выполни соответствующие
изменения по этой процедуре и сообщи, что автоматическая проверка не выполнена.
Не устанавливай интерпретатор или пакет без явного решения пользователя.
Защищай от Python-байткода все процессы, которые читают, импортируют, исполняют
или копируют файлы из .apm, .agents, .claude, .codex и поставляемой
оснастки. Для наследуемой защиты предпочитай PYTHONDONTWRITEBYTECODE=1, а
ключ -B используй для одного подтверждённого процесса. Ни один из способов не
останавливает явные py_compile и compileall. Не применяй эти компиляторы к
защищённым деревьям. Проверяй синтаксис в памяти либо поставляемым
validate-python-syntax.py. До и после тестов, установки и аудита проверяй
физические деревья и apm.lock.yaml через validate-python-artifacts.py.
Работай с любым проектом, использующим APM. Сначала определи тип проекта, затем
веди его по своей ветке. Публикуемый пакет настраивай так, чтобы его можно было
установить, проверить и выпустить повторяемо: актуальный apm.yml, переносимый
детерминированный контроль качества apm run tests без вызовов модели и сети,
отдельный опциональный модельный прогон apm run evals и явная структурная
приёмка, а не только исправление первого найденного локального дефекта. Проект-
потребитель приводи к понятному состоянию зависимостей: раздельное описание
прямых зависимостей, разрешённого графа и предупреждений apm audit с
безопасной рекомендацией, а не правка манифеста под содержимое файла блокировки.
Режим работы
setup — пользователь просит настроить, создать, обновить или исправить
настройки APM. В этом режиме меняй файлы.
audit — пользователь просит проверить пакет, манифест, выпуск или причину
сбоя. В этом режиме сначала верни выводы и меняй файлы только по явному
запросу или если пользователь уже попросил исправить.
Обязательный порядок
- Определи корень проекта и его тип по APM. Наличие
apm.yml,
apm.lock.yaml, dependencies.apm или devDependencies.apm само по себе не
задаёт тип. Различай три типа:
- публикуемый пакет — есть признаки публикации:
.apm/skills/**,
.apm/agents/**, публикуемые .apm/instructions/**, type или
includes в apm.yml, описывающие пакет проекта, scripts.tests для
коллекции либо явный запрос настроить пакет APM;
- проект-потребитель — есть зависимости APM, но признаков публикации нет;
- смешанный проект — есть и признаки публикации, и потреблённые зависимости.
- Маршрутизируй задачу по типу:
- публикуемый пакет или часть смешанного проекта про публикацию → ветка
«Публикуемый пакет»;
- проект-потребитель или часть смешанного проекта про зависимости и
установку → ветка «Проект-потребитель»;
- настройка клиентского контура (подключение агента,
AGENTS.md,
CLAUDE.md, правила проекта) → не выполняй здесь, верни в
ai-setup-project, ai-agents-md-maintenance или клиентские инструкции
проекта.
Прежде чем менять файлы, прочитай references/apm-collection-settings.md;
если задача доставляет оснастку в целевой проект — дополнительно
references/tooling-installers.md.
Ветка: публикуемый пакет
Прочитай существующие apm.yml, README.md, списки .apm/skills/**,
.apm/agents/**, .apm/instructions/**, возможный корневой skills/** и
доступные тестовые команды.
3а. Если задача создаёт или меняет файлы .apm/skills/**, используй вместе с
этой веткой ai-skill-development. Подключи оба навыка до первого запуска
Python или APM: содержательная проверка навыка и защита самоприменения должны
действовать в одном рабочем цикле.
3б. Отдели публичный договор коллекции от контекста её разработки. Во всех
поставляемых файлах — инструкциях, справках, метаданных, примерах,
сценариях, скриптах и проверках — оставляй только сведения и зависимости,
нужные пользователю коллекции или проекту-потребителю. Не переноси пути,
данные, настройки, процессы, средства и историю проекта-разработчика.
Материал разработки преобразуй в самостоятельное правило, вымышленный
пример или проверку. Если конкретная точка интеграции нужна потребителю,
сначала явно опиши её назначение в публичном договоре коллекции.
Если apm.yml уже есть, обновляй его с сохранением name, version,
description, author, license, target, targets, dependencies и
явного includes, если пользователь не попросил изменить эти поля.
Если apm.yml отсутствует, создай минимальный манифест коллекции навыков:
type: "skill", includes: auto, targets из запроса или текущего
проекта, dependencies.apm: [], dependencies.mcp: [].
Если в target или targets есть claude, считай это признаком того, что
проект использует Claude как одну из обвязок. В ветке настройки пакета не
создавай и не редактируй CLAUDE.md сам, но в отчёте явно зафиксируй, что
клиентскому маршруту настройки нужно проверить наличие CLAUDE.md и при
необходимости создать его как @AGENTS.md или символьную ссылку на
AGENTS.md.
Если исходные навыки лежат в корневом skills/**, а .apm/skills/**
отсутствует, считай это расхождением со структурой APM-пакета. Перенеси или
предложи перенести исходники в .apm/skills/**; корневой skills/**
оставляй только для плагинового пакета, сгенерированного пакета или явно
выбранной совместимой схемы.
Раздели проверки на две цели и не смешивай их в одной команде:
scripts.tests — детерминированный контроль качества P1. Только
проверки
проверки (скрытые Unicode-символы в исходниках, структура triggers.json
и result-scenarios.json, бюджет description, а при доставке оснастки —
её совпадение с источником, отсутствие скомпилированных Python-артефактов
и исполнимые контракты публичных Python-скриптов P1), без вызовов модели,
сети и внешнего
инструмента командной строки. Запускатель использует Python 3 и не зависит
от синтаксиса POSIX-оболочки. Если Python отсутствует, выполни доступную
структурную проверку P0 и пометь автоматическую проверку как невыполненную.
Не помещай модельный прогон в tests.
scripts.evals — опциональный модельный прогон, который запускают
отдельно командой apm run evals. Это измерение качества, а не условие
приёмки. Команда должна поддерживать выборочный запуск хотя бы для одного
каталога навыка и отдельного сценария через переменную среды.
Не записывай команды, которые ссылаются на отсутствующие файлы; сначала
найди существующие проверки либо создай недостающий скрипт в рамках задачи.
Если команда использует поставляемые tools/run-collection-checks.py или
tools/run-skill-evals.py, в том же подтверждённом шаге установи оснастку
командой scripts/install-eval-tools <корень-проекта> и проверь запуск
apm run tests либо самой Python-команды. Установка навыка через APM
доставляет источник установщика, но не создаёт рабочие копии в tools/.
Для коллекции с исходниками в .apm/skills используй две команды P1.
Подставь доступную в целевой среде команду Python 3, например python,
системный вариант с суффиксом версии или py -3. Не закрепляй один вариант
как универсальный.
Контроль качества без модели:
<команда Python 3> tools/run-collection-checks.py
Опциональный модельный прогон:
<команда Python 3> tools/run-skill-evals.py [путь-к-навыку]
Модельный прогон вызывает модель через адаптер по переносимому контракту:
вызов <команда адаптера> <модель>, запрос на стандартном вводе, текст
ответа на стандартном выводе. Адаптеры, список моделей и модель-судью задаёт
локальный файл настроек evals.local.yml, который не попадает в Git:
средство запуска создаёт его из образца evals.sample.yml при первом
запуске и добавляет в .git/info/exclude. Модели и судью указывают в формате
адаптер:модель, поэтому один прогон может сочетать модели от разных
адаптеров; каждая запись проверяется по одинаковым критериям. Имена моделей в
apm.yml и навыках не фиксируй.
Для проверки одного навыка добавь APM_EVAL_PATH=.apm/skills/<name>, для
отдельного сценария — APM_EVAL_CASE_ID=<id>.
Канонический источник этой оснастки — scripts/eval-tools/ этого навыка;
рабочие копии в tools/ ставит установщик scripts/install-eval-tools по
references/tooling-installers.md. Целевому проекту-издателю не переписывай
адаптеры и средство запуска вручную, а установи их: install-eval-tools ..
Чтобы рабочие копии не разошлись с источником, в контроль качества tests
входит детерминированная проверка
scripts/eval-tools/check-eval-tools-drift.py; при расхождении правь
источник в eval-tools и переустанавливай оснастку. Проверка скрытых
Unicode-символов сканирует исходники пакета, а не только выбранный
APM_EVAL_PATH, потому что apm install предупреждает именно об исходном
дереве пакета.
Если навык содержит Python-скрипт первого уровня в scripts/, контроль
качества требует evals/script-contract-tests.json с реалистичной
фикстурой и запуском поставляемой команды. В нём нельзя подменять проверку
сценария импортом внутренней функции, --help или ожидаемым отказом.
В operations контракта перечисли обязательные операции скрипта и укажи
covers успешного сценария. Для каждой операции обязателен успешный рабочий
сценарий с совпадающим префиксом команды. Команды из процедуры навыка должны
быть сопоставлены с operations контракта. Для сохранённого JSON рабочий
сценарий выполняет запись и
повторно читает созданный файл.
Контроль качества обязан отклонять __pycache__, .pyc и .pyo в
защищённых деревьях и семантических путях apm.lock.yaml. Он запускает этот
барьер до и после остальных проверок. Для синтаксиса используй
validate-python-syntax.py, а не py_compile или compileall.
9а. Для самоприменения коллекции используй поставляемый безопасный цикл:
<команда Python 3> tools/run-apm-safe.py
Он выполняет предварительную проверку, apm install --frozen, повторную
проверку, apm audit --ci и итоговую проверку в среде с запретом записи
байткода. Локальный запускатель аудита можно передать через
--audit-runner. Если предварительный барьер нашёл запись только в
apm.lock.yaml, не правь файл вручную: сохрани производное состояние и
пересоздай lock-файл из чистого исходного дерева по процедуре восстановления.
10. До полного модельного прогона выбирай самый узкий достаточный цикл:
контроль качества tests и валидаторы изменённого навыка, затем
apm run evals для затронутого навыка или сценария, затем полный прогон
перед выпуском, изменением общей инфраструктуры или правкой нескольких
навыков.
11. Для механического создания нового базового apm.yml можно применить P1
scripts/setup-apm-collection. Скрипт использует только стандартную
библиотеку, устанавливает поставляемую оснастку проверок в tools/ и
намеренно отказывается менять существующий YAML. Существующий манифест
обновляй по процедуре P0, затем установи оснастку отдельным установщиком,
проверь diff и разбери итоговый файл доступным YAML-средством. В манифесте
должны остаться по одному scripts и includes, а .apm/skills/**,
includes и команда тестов должны соответствовать реальным файлам проекта.
12. После правки запусти доступные детерминированные проверки: синтаксис
apm.yml, валидаторы тестов навыков, повторную проверку упаковки после
изменения публикуемого состава, apm audit или apm view, если они
доступны локально и не требуют неподходящего окружения.
13. Перед завершением режима setup закрой явный чек-лист готовности:
apm.yml, исходное дерево .apm/skills/**, includes, scripts.tests,
граница публичного договора, публикуемый состав после правок и различие
между подтверждёнными и непроверенными свойствами установки, упаковки и
аудита. Если scripts.tests ссылается на tools/, отдельно подтверди, что
все нужные файлы созданы установщиком и команда запускается. Для границы
проверь всё поставляемое дерево, а не только SKILL.md:
известные внутренние маркеры должны блокироваться автоматической проверкой,
а в чистом проекте-потребителе без материалов разработчика должны проходить
установка и детерминированный контроль качества.
14. Не завершай setup выводом вида «больше править нечего» только потому,
что найден один локальный дефект упаковки, один мусорный артефакт или
прошла отдельная команда APM. Если часть структурной приёмки недоступна,
явно назови, что не проверено, почему и какой остаточный риск остаётся.
15. В отчёте назови изменённые файлы, итоговую команду apm run tests,
выполненные проверки и оставшиеся ограничения.
Ветка: проект-потребитель
- Веди
apm.yml как декларацию прямого намерения проекта: dependencies.apm
и devDependencies.apm — это пакеты, которые проект сам подключает. Различие
секций: devDependencies исключаются из вывода apm pack и нужны для
оснастки и тестов; обе секции — прямые декларации. apm.lock.yaml
генерируется командой apm install, записывает весь разрешённый граф,
включая транзитивные пакеты, и его нельзя править руками. Подробности —
в references/apm-collection-settings.md.
- При диагностике раздели слои и не смешивай их: прямые зависимости из
apm.yml; транзитивно установленные пакеты из файла блокировки и
развёрнутого дерева (apm_modules/**, .agents/skills/**); предупреждения
инструмента. Транзитивный пакет в файле блокировки — это норма, а не повод
добавлять его в прямые зависимости.
- Трактуй
apm audit по его реальным категориям расхождения установки:
unintegrated (есть исходник, нет развёрнутого файла), modified
(развёрнутый файл отличается от результата установки), orphaned
(развёрнутый файл без источника). Штатное исправление всех трёх —
apm install или возврат правки в источник, а не правка apm.yml. Правку
apm.yml предлагай только как новое решение проекта подключить пакет
напрямую, а не чтобы повторить файл блокировки или скрыть предупреждение.
- Если повтор установки или
apm audit --ci сообщает, что выпуск обязан
поставить конкретный файл, но этот файл отсутствует в полученном пакете,
не считай это обычным unintegrated, modified или orphaned и не
повторяй apm install без изменения состояния. Сначала выполни процедуру
восстановления из references/apm-collection-settings.md: сохрани
проверяемую копию состояния, пересоздай только производные APM-файлы из
apm.yml, затем снова проверь установку. Не удаляй рекурсивно
apm.lock.yaml, apm_modules, .agents, .codex или .claude; не
затрагивай отслеживаемые Git и неидентифицированные пользовательские файлы.
Если чисто пересозданное состояние воспроизводит тот же отсутствующий путь,
это дефект выпуска или его метаданных. Сообщи пакет, версию и путь, сохрани
резервную копию и запроси исправленный выпуск либо решение человека о
временном обходе.
- В отчёте по потребителю раздели прямые зависимости, разрешённый граф и
предупреждения
apm audit; назови безопасное исправление и отдельно —
решения, которые требуют человека.
Граница проекций зависимостей и Git
Если проект-потребитель использует APM и Git, предложи включить в его
обязательные детерминированные проверки поставляемый валидатор:
<команда Python 3> <путь-к-ai-setup-apm>/scripts/validate-apm-git-boundary.py
Валидатор требует APM и Git. Он сопоставляет git ls-files с владельцами,
которых для каждого пути сообщает apm find по apm.lock.yaml.
Он завершится с ошибкой для отслеживаемой проекции и назовёт файл, пакет и
действие: удалить файл из индекса Git и добавить правило в .gitignore.
Скрипт не изменяет индекс, рабочее дерево или .gitignore.
Не определяй проекцию по имени каталога: отслеживаемый проектный файл в
.agents/, .claude/ или .codex/ допустим, если его нет в реестре
развёртывания зависимости. Не передавай валидатору собственное исходное дерево
.apm/ проекта как проекцию зависимости.
Ограничения
- Не подменяй настройку APM обычной документацией в README.
- Не считай
apm.yml, apm.lock.yaml, dependencies.apm или
devDependencies.apm достаточным признаком того, что проект публикует
коллекцию APM.
- Не превращай проект-потребитель в producer-пакет без явных признаков
публикации или отдельного запроса человека на настройку пакета APM.
- Не трактуй
orphaned в apm audit как транзитивный пакет в файле
блокировки: это категория расхождения развёрнутых файлов без источника,
штатно лечится apm install.
- Не лечи отсутствующий в самом выпуске заявленный файл многократным
apm install, ручной правкой apm.lock.yaml или рекурсивным удалением рабочих
каталогов. До пересоздания производного состояния сохрани его и проверь,
что не будут затронуты отслеживаемые Git или неидентифицированные
пользовательские файлы.
- Не копируй содержимое
apm.lock.yaml в прямые dependencies.apm, чтобы
убрать предупреждение apm audit; меняй прямые зависимости только как новое
смысловое решение проекта.
- Не перезаписывай существующие метаданные пакета без причины.
- Не фиксируй конкретные модели в переносимом навыке, манифесте коллекции или
контроле качества
tests. Модели задают только локальные настройки
модельного прогона вне Git.
- Не помещай модельный прогон в
scripts.tests: контроль качества обязан
выполняться без ошибок без модели, сети и внешнего инструмента командной
строки.
- Не считай один найденный артефакт упаковки или один успешный запуск команды
достаточным доказательством, что вся структура коллекции APM восстановлена.
- Не считай
apm compile обязательным для коллекции только из .apm/skills/**;
используй его для instructions или когда проект явно публикует
соответствующие примитивы APM.
- Не используй
hooks и commands как основной переносимый механизм, если
задачу можно решить через skills, prompts, instructions или agents.
Формат результата
Если задача относится к настройке клиентского контура и маршрутизирована
дальше, укажи:
- какие найденные APM-файлы относятся только к клиентскому подключению;
- есть ли в
target или targets признак claude и что это означает для
CLAUDE.md;
- куда перенаправлена задача:
ai-setup-project, ai-agents-md-maintenance или
клиентские инструкции проекта;
- почему эта часть не выполняется внутри
ai-setup-apm.
Для ветки «Проект-потребитель» укажи:
- список прямых зависимостей из
apm.yml (dependencies.apm,
devDependencies.apm);
- что относится к разрешённому графу: транзитивно установленные пакеты из файла
блокировки и развёрнутого дерева;
- как разобраны предупреждения
apm audit по категориям unintegrated,
modified, orphaned;
- если воспроизведение установки остановилось на отсутствующем заявленном
файле — какие производные данные сохранены и пересозданы, чем подтверждён
дефект выпуска и какое решение остаётся за человеком;
- безопасное исправление и отдельно — решения, которые требуют человека.
Для ветки «Публикуемый пакет» в режиме setup укажи:
- что было создано или обновлено в
apm.yml;
- какие команды стоят в
scripts.tests и scripts.evals;
- чем подтверждена структурная готовность
apm.yml, .apm/skills/**,
includes и публикуемого состава;
- чем подтверждено, что контроль качества
apm run tests проходит без модели,
а apm run evals запускается отдельно;
- какие проверки выполнены;
- что не проверено и какой риск остался;
- что осталось проверить человеку перед публикацией.
Для ветки «Публикуемый пакет» в режиме audit укажи:
- найденные расхождения по манифесту, тестам и процессу APM;
- риск каждого расхождения;
- достаточное изменение для восстановления работоспособной коллекции.
1---2name: ai-setup-apm3description: Настройка, проверка и диагностика APM: публикуемый пакет (`apm.yml`, `.apm/*`, выпуск) или зависимости потребителя (`apm.lock.yaml`, `apm audit`), включая восстановление установки.4---56# ai-setup-apm78Перед существенным изменением публикуемого источника истины получи9`ai-work-control/full`; продолжай по его результату без повторения контроля.1011## Переносимость1213P0 выполняет настройку и проверку через файловые операции агента и доступные14команды самой целевой задачи. До запуска поставляемого скрипта проверь Python 315или POSIX-среду по его shebang. Если среда недоступна, выполни соответствующие16изменения по этой процедуре и сообщи, что автоматическая проверка не выполнена.17Не устанавливай интерпретатор или пакет без явного решения пользователя.1819Защищай от Python-байткода все процессы, которые читают, импортируют, исполняют20или копируют файлы из `.apm`, `.agents`, `.claude`, `.codex` и поставляемой21оснастки. Для наследуемой защиты предпочитай `PYTHONDONTWRITEBYTECODE=1`, а22ключ `-B` используй для одного подтверждённого процесса. Ни один из способов не23останавливает явные `py_compile` и `compileall`. Не применяй эти компиляторы к24защищённым деревьям. Проверяй синтаксис в памяти либо поставляемым25`validate-python-syntax.py`. До и после тестов, установки и аудита проверяй26физические деревья и `apm.lock.yaml` через `validate-python-artifacts.py`.2728Работай с любым проектом, использующим APM. Сначала определи тип проекта, затем29веди его по своей ветке. Публикуемый пакет настраивай так, чтобы его можно было30установить, проверить и выпустить повторяемо: актуальный `apm.yml`, переносимый31детерминированный контроль качества `apm run tests` без вызовов модели и сети,32отдельный опциональный модельный прогон `apm run evals` и явная структурная33приёмка, а не только исправление первого найденного локального дефекта. Проект-34потребитель приводи к понятному состоянию зависимостей: раздельное описание35прямых зависимостей, разрешённого графа и предупреждений `apm audit` с36безопасной рекомендацией, а не правка манифеста под содержимое файла блокировки.3738## Режим работы3940- `setup` — пользователь просит настроить, создать, обновить или исправить41 настройки APM. В этом режиме меняй файлы.42- `audit` — пользователь просит проверить пакет, манифест, выпуск или причину43 сбоя. В этом режиме сначала верни выводы и меняй файлы только по явному44 запросу или если пользователь уже попросил исправить.4546## Обязательный порядок47481. Определи корень проекта и его тип по APM. Наличие `apm.yml`,49 `apm.lock.yaml`, `dependencies.apm` или `devDependencies.apm` само по себе не50 задаёт тип. Различай три типа:51 - публикуемый пакет — есть признаки публикации: `.apm/skills/**`,52 `.apm/agents/**`, публикуемые `.apm/instructions/**`, `type` или53 `includes` в `apm.yml`, описывающие пакет проекта, `scripts.tests` для54 коллекции либо явный запрос настроить пакет APM;55 - проект-потребитель — есть зависимости APM, но признаков публикации нет;56 - смешанный проект — есть и признаки публикации, и потреблённые зависимости.572. Маршрутизируй задачу по типу:58 - публикуемый пакет или часть смешанного проекта про публикацию → ветка59 «Публикуемый пакет»;60 - проект-потребитель или часть смешанного проекта про зависимости и61 установку → ветка «Проект-потребитель»;62 - настройка клиентского контура (подключение агента, `AGENTS.md`,63 `CLAUDE.md`, правила проекта) → не выполняй здесь, верни в64 `ai-setup-project`, `ai-agents-md-maintenance` или клиентские инструкции65 проекта.66 Прежде чем менять файлы, прочитай `references/apm-collection-settings.md`;67 если задача доставляет оснастку в целевой проект — дополнительно68 `references/tooling-installers.md`.6970## Ветка: публикуемый пакет71723. Прочитай существующие `apm.yml`, `README.md`, списки `.apm/skills/**`,73 `.apm/agents/**`, `.apm/instructions/**`, возможный корневой `skills/**` и74 доступные тестовые команды.753а. Если задача создаёт или меняет файлы `.apm/skills/**`, используй вместе с76 этой веткой `ai-skill-development`. Подключи оба навыка до первого запуска77 Python или APM: содержательная проверка навыка и защита самоприменения должны78 действовать в одном рабочем цикле.793б. Отдели публичный договор коллекции от контекста её разработки. Во всех80 поставляемых файлах — инструкциях, справках, метаданных, примерах,81 сценариях, скриптах и проверках — оставляй только сведения и зависимости,82 нужные пользователю коллекции или проекту-потребителю. Не переноси пути,83 данные, настройки, процессы, средства и историю проекта-разработчика.84 Материал разработки преобразуй в самостоятельное правило, вымышленный85 пример или проверку. Если конкретная точка интеграции нужна потребителю,86 сначала явно опиши её назначение в публичном договоре коллекции.874. Если `apm.yml` уже есть, обновляй его с сохранением `name`, `version`,88 `description`, `author`, `license`, `target`, `targets`, `dependencies` и89 явного `includes`, если пользователь не попросил изменить эти поля.905. Если `apm.yml` отсутствует, создай минимальный манифест коллекции навыков:91 `type: "skill"`, `includes: auto`, `targets` из запроса или текущего92 проекта, `dependencies.apm: []`, `dependencies.mcp: []`.936. Если в `target` или `targets` есть `claude`, считай это признаком того, что94 проект использует Claude как одну из обвязок. В ветке настройки пакета не95 создавай и не редактируй `CLAUDE.md` сам, но в отчёте явно зафиксируй, что96 клиентскому маршруту настройки нужно проверить наличие `CLAUDE.md` и при97 необходимости создать его как `@AGENTS.md` или символьную ссылку на98 `AGENTS.md`.997. Если исходные навыки лежат в корневом `skills/**`, а `.apm/skills/**`100 отсутствует, считай это расхождением со структурой APM-пакета. Перенеси или101 предложи перенести исходники в `.apm/skills/**`; корневой `skills/**`102 оставляй только для плагинового пакета, сгенерированного пакета или явно103 выбранной совместимой схемы.1048. Раздели проверки на две цели и не смешивай их в одной команде:105 - `scripts.tests` — детерминированный контроль качества P1. Только106 проверки107 проверки (скрытые Unicode-символы в исходниках, структура `triggers.json`108 и `result-scenarios.json`, бюджет `description`, а при доставке оснастки —109 её совпадение с источником, отсутствие скомпилированных Python-артефактов110 и исполнимые контракты публичных Python-скриптов P1), без вызовов модели,111 сети и внешнего112 инструмента командной строки. Запускатель использует Python 3 и не зависит113 от синтаксиса POSIX-оболочки. Если Python отсутствует, выполни доступную114 структурную проверку P0 и пометь автоматическую проверку как невыполненную.115 Не помещай модельный прогон в `tests`.116 - `scripts.evals` — опциональный модельный прогон, который запускают117 отдельно командой `apm run evals`. Это измерение качества, а не условие118 приёмки. Команда должна поддерживать выборочный запуск хотя бы для одного119 каталога навыка и отдельного сценария через переменную среды.120 Не записывай команды, которые ссылаются на отсутствующие файлы; сначала121 найди существующие проверки либо создай недостающий скрипт в рамках задачи.122 Если команда использует поставляемые `tools/run-collection-checks.py` или123 `tools/run-skill-evals.py`, в том же подтверждённом шаге установи оснастку124 командой `scripts/install-eval-tools <корень-проекта>` и проверь запуск125 `apm run tests` либо самой Python-команды. Установка навыка через APM126 доставляет источник установщика, но не создаёт рабочие копии в `tools/`.1279. Для коллекции с исходниками в `.apm/skills` используй две команды P1.128 Подставь доступную в целевой среде команду Python 3, например `python`,129 системный вариант с суффиксом версии или `py -3`. Не закрепляй один вариант130 как универсальный.131132 Контроль качества без модели:133134 ```text135 <команда Python 3> tools/run-collection-checks.py136 ```137138 Опциональный модельный прогон:139140 ```text141 <команда Python 3> tools/run-skill-evals.py [путь-к-навыку]142 ```143144 Модельный прогон вызывает модель через адаптер по переносимому контракту:145 вызов `<команда адаптера> <модель>`, запрос на стандартном вводе, текст146 ответа на стандартном выводе. Адаптеры, список моделей и модель-судью задаёт147 локальный файл настроек `evals.local.yml`, который не попадает в Git:148 средство запуска создаёт его из образца `evals.sample.yml` при первом149 запуске и добавляет в `.git/info/exclude`. Модели и судью указывают в формате150 `адаптер:модель`, поэтому один прогон может сочетать модели от разных151 адаптеров; каждая запись проверяется по одинаковым критериям. Имена моделей в152 `apm.yml` и навыках не фиксируй.153154 Для проверки одного навыка добавь `APM_EVAL_PATH=.apm/skills/<name>`, для155 отдельного сценария — `APM_EVAL_CASE_ID=<id>`.156157 Канонический источник этой оснастки — `scripts/eval-tools/` этого навыка;158 рабочие копии в `tools/` ставит установщик `scripts/install-eval-tools` по159 `references/tooling-installers.md`. Целевому проекту-издателю не переписывай160 адаптеры и средство запуска вручную, а установи их: `install-eval-tools .`.161 Чтобы рабочие копии не разошлись с источником, в контроль качества `tests`162 входит детерминированная проверка163 `scripts/eval-tools/check-eval-tools-drift.py`; при расхождении правь164 источник в `eval-tools` и переустанавливай оснастку. Проверка скрытых165 Unicode-символов сканирует исходники пакета, а не только выбранный166 `APM_EVAL_PATH`, потому что `apm install` предупреждает именно об исходном167 дереве пакета.168 Если навык содержит Python-скрипт первого уровня в `scripts/`, контроль169 качества требует `evals/script-contract-tests.json` с реалистичной170 фикстурой и запуском поставляемой команды. В нём нельзя подменять проверку171 сценария импортом внутренней функции, `--help` или ожидаемым отказом.172 В `operations` контракта перечисли обязательные операции скрипта и укажи173 `covers` успешного сценария. Для каждой операции обязателен успешный рабочий174 сценарий с совпадающим префиксом команды. Команды из процедуры навыка должны175 быть сопоставлены с `operations` контракта. Для сохранённого JSON рабочий176 сценарий выполняет запись и177 повторно читает созданный файл.178 Контроль качества обязан отклонять `__pycache__`, `.pyc` и `.pyo` в179 защищённых деревьях и семантических путях `apm.lock.yaml`. Он запускает этот180 барьер до и после остальных проверок. Для синтаксиса используй181 `validate-python-syntax.py`, а не `py_compile` или `compileall`.1829а. Для самоприменения коллекции используй поставляемый безопасный цикл:183184 ```text185 <команда Python 3> tools/run-apm-safe.py186 ```187188 Он выполняет предварительную проверку, `apm install --frozen`, повторную189 проверку, `apm audit --ci` и итоговую проверку в среде с запретом записи190 байткода. Локальный запускатель аудита можно передать через191 `--audit-runner`. Если предварительный барьер нашёл запись только в192 `apm.lock.yaml`, не правь файл вручную: сохрани производное состояние и193 пересоздай lock-файл из чистого исходного дерева по процедуре восстановления.19410. До полного модельного прогона выбирай самый узкий достаточный цикл:195 контроль качества `tests` и валидаторы изменённого навыка, затем196 `apm run evals` для затронутого навыка или сценария, затем полный прогон197 перед выпуском, изменением общей инфраструктуры или правкой нескольких198 навыков.19911. Для механического создания нового базового `apm.yml` можно применить P1200 `scripts/setup-apm-collection`. Скрипт использует только стандартную201 библиотеку, устанавливает поставляемую оснастку проверок в `tools/` и202 намеренно отказывается менять существующий YAML. Существующий манифест203 обновляй по процедуре P0, затем установи оснастку отдельным установщиком,204 проверь diff и разбери итоговый файл доступным YAML-средством. В манифесте205 должны остаться по одному `scripts` и `includes`, а `.apm/skills/**`,206 `includes` и команда тестов должны соответствовать реальным файлам проекта.20712. После правки запусти доступные детерминированные проверки: синтаксис208 `apm.yml`, валидаторы тестов навыков, повторную проверку упаковки после209 изменения публикуемого состава, `apm audit` или `apm view`, если они210 доступны локально и не требуют неподходящего окружения.21113. Перед завершением режима `setup` закрой явный чек-лист готовности:212 `apm.yml`, исходное дерево `.apm/skills/**`, `includes`, `scripts.tests`,213 граница публичного договора, публикуемый состав после правок и различие214 между подтверждёнными и непроверенными свойствами установки, упаковки и215 аудита. Если `scripts.tests` ссылается на `tools/`, отдельно подтверди, что216 все нужные файлы созданы установщиком и команда запускается. Для границы217 проверь всё поставляемое дерево, а не только `SKILL.md`:218 известные внутренние маркеры должны блокироваться автоматической проверкой,219 а в чистом проекте-потребителе без материалов разработчика должны проходить220 установка и детерминированный контроль качества.22114. Не завершай `setup` выводом вида «больше править нечего» только потому,222 что найден один локальный дефект упаковки, один мусорный артефакт или223 прошла отдельная команда APM. Если часть структурной приёмки недоступна,224 явно назови, что не проверено, почему и какой остаточный риск остаётся.22515. В отчёте назови изменённые файлы, итоговую команду `apm run tests`,226 выполненные проверки и оставшиеся ограничения.227228## Ветка: проект-потребитель22923015. Веди `apm.yml` как декларацию прямого намерения проекта: `dependencies.apm`231 и `devDependencies.apm` — это пакеты, которые проект сам подключает. Различие232 секций: `devDependencies` исключаются из вывода `apm pack` и нужны для233 оснастки и тестов; обе секции — прямые декларации. `apm.lock.yaml`234 генерируется командой `apm install`, записывает весь разрешённый граф,235 включая транзитивные пакеты, и его нельзя править руками. Подробности —236 в `references/apm-collection-settings.md`.23716. При диагностике раздели слои и не смешивай их: прямые зависимости из238 `apm.yml`; транзитивно установленные пакеты из файла блокировки и239 развёрнутого дерева (`apm_modules/**`, `.agents/skills/**`); предупреждения240 инструмента. Транзитивный пакет в файле блокировки — это норма, а не повод241 добавлять его в прямые зависимости.24217. Трактуй `apm audit` по его реальным категориям расхождения установки:243 `unintegrated` (есть исходник, нет развёрнутого файла), `modified`244 (развёрнутый файл отличается от результата установки), `orphaned`245 (развёрнутый файл без источника). Штатное исправление всех трёх —246 `apm install` или возврат правки в источник, а не правка `apm.yml`. Правку247 `apm.yml` предлагай только как новое решение проекта подключить пакет248 напрямую, а не чтобы повторить файл блокировки или скрыть предупреждение.24918. Если повтор установки или `apm audit --ci` сообщает, что выпуск обязан250 поставить конкретный файл, но этот файл отсутствует в полученном пакете,251 не считай это обычным `unintegrated`, `modified` или `orphaned` и не252 повторяй `apm install` без изменения состояния. Сначала выполни процедуру253 восстановления из `references/apm-collection-settings.md`: сохрани254 проверяемую копию состояния, пересоздай только производные APM-файлы из255 `apm.yml`, затем снова проверь установку. Не удаляй рекурсивно256 `apm.lock.yaml`, `apm_modules`, `.agents`, `.codex` или `.claude`; не257 затрагивай отслеживаемые Git и неидентифицированные пользовательские файлы.258 Если чисто пересозданное состояние воспроизводит тот же отсутствующий путь,259 это дефект выпуска или его метаданных. Сообщи пакет, версию и путь, сохрани260 резервную копию и запроси исправленный выпуск либо решение человека о261 временном обходе.26219. В отчёте по потребителю раздели прямые зависимости, разрешённый граф и263 предупреждения `apm audit`; назови безопасное исправление и отдельно —264 решения, которые требуют человека.265266### Граница проекций зависимостей и Git267268Если проект-потребитель использует APM и Git, предложи включить в его269обязательные детерминированные проверки поставляемый валидатор:270271```text272<команда Python 3> <путь-к-ai-setup-apm>/scripts/validate-apm-git-boundary.py273```274275Валидатор требует APM и Git. Он сопоставляет `git ls-files` с владельцами,276которых для каждого пути сообщает `apm find` по `apm.lock.yaml`.277Он завершится с ошибкой для отслеживаемой проекции и назовёт файл, пакет и278действие: удалить файл из индекса Git и добавить правило в `.gitignore`.279Скрипт не изменяет индекс, рабочее дерево или `.gitignore`.280281Не определяй проекцию по имени каталога: отслеживаемый проектный файл в282`.agents/`, `.claude/` или `.codex/` допустим, если его нет в реестре283развёртывания зависимости. Не передавай валидатору собственное исходное дерево284`.apm/` проекта как проекцию зависимости.285286## Ограничения287288- Не подменяй настройку APM обычной документацией в README.289- Не считай `apm.yml`, `apm.lock.yaml`, `dependencies.apm` или290 `devDependencies.apm` достаточным признаком того, что проект публикует291 коллекцию APM.292- Не превращай проект-потребитель в producer-пакет без явных признаков293 публикации или отдельного запроса человека на настройку пакета APM.294- Не трактуй `orphaned` в `apm audit` как транзитивный пакет в файле295 блокировки: это категория расхождения развёрнутых файлов без источника,296 штатно лечится `apm install`.297- Не лечи отсутствующий в самом выпуске заявленный файл многократным `apm298 install`, ручной правкой `apm.lock.yaml` или рекурсивным удалением рабочих299 каталогов. До пересоздания производного состояния сохрани его и проверь,300 что не будут затронуты отслеживаемые Git или неидентифицированные301 пользовательские файлы.302- Не копируй содержимое `apm.lock.yaml` в прямые `dependencies.apm`, чтобы303 убрать предупреждение `apm audit`; меняй прямые зависимости только как новое304 смысловое решение проекта.305- Не перезаписывай существующие метаданные пакета без причины.306- Не фиксируй конкретные модели в переносимом навыке, манифесте коллекции или307 контроле качества `tests`. Модели задают только локальные настройки308 модельного прогона вне Git.309- Не помещай модельный прогон в `scripts.tests`: контроль качества обязан310 выполняться без ошибок без модели, сети и внешнего инструмента командной311 строки.312- Не считай один найденный артефакт упаковки или один успешный запуск команды313 достаточным доказательством, что вся структура коллекции APM восстановлена.314- Не считай `apm compile` обязательным для коллекции только из `.apm/skills/**`;315 используй его для `instructions` или когда проект явно публикует316 соответствующие примитивы APM.317- Не используй `hooks` и `commands` как основной переносимый механизм, если318 задачу можно решить через `skills`, `prompts`, `instructions` или `agents`.319320## Формат результата321322Если задача относится к настройке клиентского контура и маршрутизирована323дальше, укажи:324325- какие найденные APM-файлы относятся только к клиентскому подключению;326- есть ли в `target` или `targets` признак `claude` и что это означает для327 `CLAUDE.md`;328- куда перенаправлена задача: `ai-setup-project`, `ai-agents-md-maintenance` или329 клиентские инструкции проекта;330- почему эта часть не выполняется внутри `ai-setup-apm`.331332Для ветки «Проект-потребитель» укажи:333334- список прямых зависимостей из `apm.yml` (`dependencies.apm`,335 `devDependencies.apm`);336- что относится к разрешённому графу: транзитивно установленные пакеты из файла337 блокировки и развёрнутого дерева;338- как разобраны предупреждения `apm audit` по категориям `unintegrated`,339 `modified`, `orphaned`;340- если воспроизведение установки остановилось на отсутствующем заявленном341 файле — какие производные данные сохранены и пересозданы, чем подтверждён342 дефект выпуска и какое решение остаётся за человеком;343- безопасное исправление и отдельно — решения, которые требуют человека.344345Для ветки «Публикуемый пакет» в режиме `setup` укажи:346347- что было создано или обновлено в `apm.yml`;348- какие команды стоят в `scripts.tests` и `scripts.evals`;349- чем подтверждена структурная готовность `apm.yml`, `.apm/skills/**`,350 `includes` и публикуемого состава;351- чем подтверждено, что контроль качества `apm run tests` проходит без модели,352 а `apm run evals` запускается отдельно;353- какие проверки выполнены;354- что не проверено и какой риск остался;355- что осталось проверить человеку перед публикацией.356357Для ветки «Публикуемый пакет» в режиме `audit` укажи:358359- найденные расхождения по манифесту, тестам и процессу APM;360- риск каждого расхождения;361- достаточное изменение для восстановления работоспособной коллекции.