Спецификация схемы артефактов
Каноническая схема YAML-фронтматтера и обязательные поля для всех типов артефактов в дереве исходного кода Apothem, с шаблонами по классам и правилами валидации.
Шаблоны YAML-фронтматтера по классам и обязательные поля для всех артефактов экосистемы Apothem.
Источник истины. Машиночитаемый контракт, который применяет шлюз, — это JSON Schema по классам в
src/apothem/schemas/(agent.schema.json,command.schema.json,skill.schema.json, …). Схемы навыков и команд объявляютadditionalProperties: false, поэтому отклоняют неизвестные ключи; схемы агентов, output-стилей и планов объявляютadditionalProperties: true. Эта страница иfrontmatter-schema.mdx— две человекочитаемые проекции этих схем: данная страница содержит шаблоны и разобранные примеры по классам, а frontmatter-schema — краткий указатель обязательных ключей. Если страница расходится с JSON Schema, приоритет у схем.
Обзор
Все артефакты в дереве исходного кода Apothem (в src/apothem/ и на корневой
поверхности конфигурации) должны содержать блок YAML-фронтматтера
(между разделителями ---) с обязательными и необязательными полями,
специфичными для их типа артефакта. Этот документ определяет каноническую
схему для каждого типа.
Универсальные правила:
- Фронтматтер соответствует YAML 1.2
- Все строковые значения записываются в двойных кавычках, а пустая строка записывается как
"" - Порядок полей: сначала обязательные поля, затем необязательные, сгруппированные по смыслу
- Комментарии во фронтматтере записываются через
#с пробелом:# comment - Значения путей должны быть относительными (без ведущего
/) и использовать прямые слеши (/) для кроссплатформенной совместимости
Соглашение о версионировании (версионируемые классы артефактов — команды, помощники, навыки, CLAUDE.md):
version— семантическая версия (MAJOR.MINOR.PATCH). Повышайте MAJOR при ломающих изменениях схемы или контракта; MINOR — при аддитивных изменениях без нарушения совместимости (новые необязательные поля, дополнительные разделы, дополнительные антипаттерны); PATCH — при изменении поведения, которое исправляет существующую директиву, не нарушая контракт.- Исправления опечаток, ссылок, форматирование, а также правки, затрагивающие только комментарии или только документацию, не меняют
version. Версию повышает только изменение поведения. updated— дата ISO 8601 (YYYY-MM-DD) последней правки. Она должна меняться при каждом повышенииversionи меняется также при исправлении опечатки или ссылки, не повышающем версию.- Новые артефакты начинают с
v0.Y.Z. Переход наvX.Y.Zозначает, что контракт артефакта достаточно стабилен, чтобы стать публичным обязательством. - Наборы планов не входят в эту конвенцию. Исправление опечатки в наборе планов повышает номер PATCH версии набора (
vX.Y.Z→vX.Y.(Z+1)) и добавляет строку в таблицу истории ревизий. В руководстве разработчика правило для наборов планов описано в разделе о ревизиях набора планов.
Схема: правила
Шаблон пути: src/apothem/rules/*.md
Назначение: поведенческие мандаты и операционные директивы.
Обязательные поля
---
name: "kebab-case-identifier"
description: "One-line description"
pathFilter: "**/*.py, **/*.toml"
alwaysApply: true | false
---| Поле | Тип | Назначение | Пример |
|---|---|---|---|
name | строка | Машиночитаемый идентификатор | "operational-mandates" |
description | строка | Однострочное описание для реестров | "Operational mandates CM-1–10" |
pathFilter | строка | Список glob-шаблонов через запятую, задающий область правила с фильтрацией по пути; пустая строка ("") у постоянно действующих правил | "**/*.py, **/*.toml" |
alwaysApply | логическое значение | true для постоянно действующих правил (загружаются везде); false для правил с фильтрацией по пути (загружаются, когда совпадает pathFilter) | true |
Необязательные поля
У правил нет необязательных полей фронтматтера и — в отличие от других классов артефактов — нет также полей version / updated / scope / portability. Четыре обязательных поля выше составляют полный контракт фронтматтера правил, который применяет frontmatter_grep.
Пример
---
name: "operational-mandates"
description: "Behavioral definitions for CM-1 through CM-10: violation indicators and recovery actions"
pathFilter: ""
alwaysApply: true
---
# Rule: Operational Mandates
...Схема: команды
Шаблон пути: src/apothem/commands/*.md
Назначение: определения слеш-команд (/plan-execute, /freshify и т. д.).
Обязательные поля
---
name: "command-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this command does"
argument-hint: "[argument-pattern]"
disable-model-invocation: true | false
portability: "universal"
allowed-tools: "Read, Glob, Grep"
---| Поле | Тип | Назначение | Пример |
|---|---|---|---|
name | строка | Имя команды (без ведущего /) | "plan-execute" |
version | строка | Семантическая версия | "X.Y.Z" |
updated | строка (ISO 8601) | Дата последнего обновления | "2026-04-20" |
description | строка | Краткое описание | "Executes a phase with quality gates" |
argument-hint | строка | Шаблон использования или "[args...]", если аргументов нет | "[path/to/plan] [phase-id]" |
disable-model-invocation | логическое значение | Если true, команду запускает только оператор; модель никогда не вызывает её сама | true |
portability | строка | Классификация переносимости между адаптерами окружений | "universal" |
allowed-tools | строка | Инструменты, заранее одобренные на время выполнения команды: инструменты только для чтения, а инструменты с побочными эффектами — только в виде правил с ограниченной областью действия, таких как Bash(git log *). Голый подстановочный знак "*" отклоняется | "Read, Glob, Grep" |
Необязательные поля
У команд нет необязательных полей фронтматтера — восемь обязательных полей выше составляют полный контракт фронтматтера команд, который применяет command.schema.json (additionalProperties: false).
Пример
---
name: "plan-execute"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Executes a specific phase from a Master Plan Suite with conformity checking and quality gates"
argument-hint: "[path/to/plan-suite/] [phase-id] [--dry-run]"
disable-model-invocation: true
portability: "universal"
allowed-tools: "Read, Glob, Grep"
---
# /plan-execute — Execute a Specific Phase
...Схема: помощники
Шаблон пути:
src/apothem/agents/*.mdНазначение: постоянные определения помощников (их также называют делегированными исполнителями) для параллельного исследования, аудита и шлюзов качества.
Обязательные поля
---
name: "agent-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this agent specializes in"
tools: "Tool1, Tool2, Tool3"
disallowedTools: "Write, Edit"
maxTurns: 20
effort: "high" | "medium" | "low"
---| Поле | Тип | Назначение | Пример |
|---|---|---|---|
name | строка | Идентификатор помощника | "codebase-explorer" |
version | строка | Семантическая версия | "X.Y.Z" |
updated | строка (ISO 8601) | Дата последнего обновления | "2026-04-20" |
description | строка | Описание специализации | "Deep codebase exploration" |
tools | строка (через запятую) | Разрешённые инструменты | "Read, Glob, Grep, Bash" |
disallowedTools | строка (через запятую) | Запрещённые инструменты | "Write, Edit, TodoWrite" |
maxTurns | целое число | Максимальное число ходов диалога (обычно 5–20; значения выше 20 требуют встроенного комментария с обоснованием) | 20 |
effort | enum | Вычислительный объём | "high" |
Необязательные поля
permissionMode: "default" # Permission handling
memory: user | project | local # Persistent-memory scope; omit for none
pattern: "Research" | "Audit" | "Implementation" | "Quality" # Agent team pattern
portability: "universal"Пример
---
name: "codebase-explorer"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Deep codebase exploration — find patterns, trace dependencies, discover conventions, map architecture"
tools: "Read, Glob, Grep, Bash"
disallowedTools: "Write, Edit, TodoWrite"
maxTurns: 20
effort: "high"
permissionMode: "default"
portability: "universal"
---
You are a codebase exploration specialist...Схема: навыки
Шаблон пути: src/apothem/skills/*/SKILL.md
Назначение: переиспользуемые определения техник с сигналами обнаружения и процедурами выполнения.
Обязательные поля
---
name: "skill-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this skill teaches"
archetype: "workflow-template"
userInvocable: true | false
disable-model-invocation: true | false
allowed-tools: "Read, Glob, Grep"
---| Поле | Тип | Назначение | Пример |
|---|---|---|---|
name | строка | Идентификатор навыка | "plan-suite" |
version | строка | Семантическая версия | "X.Y.Z" |
updated | строка (ISO 8601) | Дата последнего обновления | "2026-04-20" |
description | строка | Что предоставляет навык | "Master Plan Suite template" |
archetype | строка | Класс формы — идентификатор <class>-template в kebab-case | "workflow-template" |
userInvocable | логическое значение | Если true, пользователь может явно запросить этот навык | false |
disable-model-invocation | логическое значение | Если true, навык доступен только через явный вызов | true |
allowed-tools | строка | Инструменты, заранее одобренные на время выполнения навыка: инструменты только для чтения, а инструменты с побочными эффектами — только в виде правил с ограниченной областью действия, таких как Bash(git log *). Голый подстановочный знак "*" отклоняется | "Read, Glob, Grep" |
Необязательные поля
argument-hint: "[args...]" # Usage pattern if userInvocableПример
---
name: "ecosystem-audit"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Comprehensive blind audit of the apothem ecosystem"
archetype: "audit-template"
userInvocable: true
disable-model-invocation: false
allowed-tools: "Read, Glob, Grep, Agent, TodoWrite"
argument-hint: "[--focus area] [--fix]"
---
## Purpose
...Схема: хуки
Шаблон пути: блок hooks в settings.json плюс реализации на Python
в src/apothem/hooks/.
Назначение: объявлять валидаторы, запускаемые событиями, и обработчики управления состоянием, которые хост вызывает в чётко определённых точках жизненного цикла.
Схема файла настроек
Ключ верхнего уровня hooks сопоставляет имена событий с массивами блоков matcher:
"hooks": {
"<EventName>": [
{
"matcher": "<pattern>",
"hooks": [
{
"type": "command",
"command": "${PYTHON_BIN}",
"args": ["${HARNESS_ROOT}/.apothem/support/hooks/dispatch.py", "<EventName>", "<message-name>"],
"timeout": <seconds>,
"statusMessage": "<short human-readable label>"
}
]
}
]
}Форма -m apothem.hooks.dispatch предназначена для разработки из чекаута исходного кода с PYTHONPATH=src.
| Поле | Тип | Назначение | Пример |
|---|---|---|---|
matcher | строка | Шаблон имени инструмента (или "*" для событий, не зависящих от инструмента) | "Write" |
hooks[].type | литерал "command" | Единственный на сегодня поддерживаемый тип обработчика хука | "command" |
hooks[].command | строка | Исполняемая команда; Apothem использует плейсхолдер ${PYTHON_BIN}, который разрешается при установке | "${PYTHON_BIN}" |
hooks[].args | массив строк | Аргументы в exec-форме: путь к скрипту в ${HARNESS_ROOT}/.apothem/support/, затем его аргументы | ["${HARNESS_ROOT}/.apothem/support/hooks/dispatch.py", "SessionStart"] |
hooks[].timeout | целое число секунд | Максимальное время выполнения, по истечении которого хост завершает хук | 30 |
hooks[].statusMessage | строка | Короткая метка, показываемая в интерфейсе хоста | "Session start" |
Обязательные события
Шаблон Claude Code регистрирует четыре события: SessionStart, PreToolUse, PostToolUse и Stop. scripts/dev/validate_hooks.py проверяет наличие в settings.json пяти событий из таблицы ниже — это другой набор — и сообщает о каждом ненайденном событии как о предупреждении, а не как об ошибке. PostToolUse зарегистрировано, но не входит в число этих пяти. PreCompact и PostCompact входят в число пяти, но в Claude Code не регистрируются (справочник по хукам), поэтому проверка выдаёт предупреждения по обоим.
Значения тайм-аутов повторяют канонические бюджеты событий хуков — таблица ниже воспроизводит их для удобства читателя; определяющим остаётся канонический источник.
| Событие | Типичный тайм-аут | Назначение |
|---|---|---|
SessionStart | 30 секунд | Чтение памяти, проверка состояния плана, сообщение о готовности |
PreToolUse | 10 секунд | Проверка записей на соответствие политикам изоляции содержимого + фронтматтер |
PreCompact | 30 секунд | Проверка того, что состояние вынесено вовне перед сжатием контекста |
PostCompact | 30 секунд | Восстановление рабочего состояния после сжатия контекста |
Stop | 60 секунд | Вынесение состояния вовне в конце сессии — состояние для возобновления, результаты, решения |
dispatch.py также принимает UserPromptSubmit и Notification в своём белом
списке событий ради прямой совместимости; ни одно из них не подключено в
поставляемых шаблонах. Чтобы включить их, добавьте блок matcher с тем же
шаблоном exec-формы.
Слой Python
Каждая команда хука проходит через один и тот же диспетчер на Python:
| Файл | Роль |
|---|---|
src/apothem/hooks/dispatch.py | Направляет SessionStart в session_start_bootstrap.main(), а каждое другое событие из белого списка — в emit_hook_context.main(). Всегда завершается с кодом 0. |
src/apothem/hooks/session_start_bootstrap.py | Скрипт хука начала сессии — выдаёт контекст памяти и сводки набора планов. |
src/apothem/hooks/emit_hook_context.py | Эмиттер хуков по умолчанию — записывает корректный конверт с зарегистрированной полезной нагрузкой --context-file. |
src/apothem/hooks/messages/*.md | Статическая полезная нагрузка контекста, на которую ссылается --context-file. |
Валидация
scripts/dev/validate_hooks.py обеспечивает соблюдение контракта хуков:
settings.jsonразбирается как JSON и объявляет каждое из пяти событий таблицы; отсутствие события — это предупреждение, а не ошибка.- Все три скрипта Python существуют и разбираются как корректный Python.
- Все файлы сообщений, на которые ссылаются аргументы
--context-file, существуют. - В
src/apothem/hooks/**.pyнет жёстко заданных абсолютных пользовательских путей (C:\Users\...и т. п.). - Shell-артефакты в
src/apothem/hooks/иscripts/ограничены одобренными заглушками локатора / начальной загрузки.
Схема: CLAUDE.md
Путь: CLAUDE.md (корень)
Назначение: инструкции Claude Code уровня проекта.
Обязательный YAML-фронтматтер
---
name: "CLAUDE"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "Project-scoped Claude Code instructions for the Apothem source repository"
scope: "project"
portability: "project-local"
---Разделы
CLAUDE.md пишется прозой по разделам; описание приведено в CLAUDE.md. Ни один валидатор не требует фиксированного списка разделов: scripts/dev/validate_ecosystem.py проверяет приведённые выше ключи фронтматтера.
Чек-лист валидации
Каждый артефакт должен проходить следующие проверки:
Валидация фронтматтера
- YAML синтаксически корректен (нет ошибок разбора)
- Присутствуют все обязательные поля для типа артефакта
-
nameследует соглашению kebab-case -
version— семантическая версия (MAJOR.MINOR.PATCH) -
updated— в формате даты ISO 8601 (YYYY-MM-DD) -
description— непустая строка в одну строку - Необязательные поля соответствуют ожидаемым значениям enum (если применимо)
- В именах полей нет опечаток (используйте канонические имена из схемы)
- Нет лишних пробелов и проблем с форматированием
Валидация содержимого
- Содержимое начинается с новой строки после закрывающего
---; в файлах семейства Markdown первым содержимым после него идёт каноническая строка заголовка SPDX - Нет ссылок на внутренние материалы планов (соответствие CM-7)
- Перекрёстные ссылки разрешаются (если перечислены другие артефакты)
- Ссылки используют относительные пути с прямыми слешами
Валидация переносимости
- Нет жёстко заданных абсолютных путей (используйте относительные)
- Нет специфичного для Windows синтаксиса в артефактах с универсальной областью действия
- В качестве разделителей путей используются прямые слеши
- Переменные окружения используют платформенно-независимый формат (
${VAR}или нативный для инструмента)
Примечания
- Согласованность как безопасность: канонический фронтматтер позволяет автоматически проверять артефакты, использовать инструментарий и сверять артефакты между собой. Отклонения быстро накапливаются.
- Декларация переносимости: не все артефакты могут быть универсальными. Объявляйте ограничения явно: лучше задокументировать оговорку, чем поставить незаметную ошибку.
- Kebab-case для имён: удобен в URL, скриптах и контекстах командной строки. Избегайте пробелов, подчёркиваний и camelCase в именах.
- Гигиена повышения версии: каждая правка, меняющая поведение, должна повышать
versionиupdatedодновременно. Исправления опечаток, ссылок и форматирование не меняют версию; новые необязательные разделы или антипаттерны повышают MINOR; структурная реорганизация или изменения контракта повышают MAJOR.
Соглашения о коммитах
Устанавливает формат сообщений коммитов, тегирование релизов, дисциплину исключительно человеческого авторства и каденцию по задачам для git-артефактов и контроля версий.
Реестры артефактов
Полное перечисление артефактов экосистемы Apothem: команды, правила, помощники, хуки, навыки, output-стили, дисциплина эволюции артефактов и объявления пустых классов артефактов.