Соглашения для многоповерхностных окружений
Каноническая нормативная справка по конфигурации многоповерхностных окружений и их согласованности в средах выполнения чата, автодополнения в IDE и ревью PR.
Каноническая нормативная справка для нижестоящих участников. Этот документ отражает разделы спецификации проекта «Соглашения для многоповерхностных окружений» (Спецификация §0.6 + §2.8 + §4.7); это самостоятельная справка, которая поставляется вместе с опубликованным репозиторием. Архитектурное обоснование зафиксировано в ADR-0003.
1. Почему во множественном числе
Современную инженерную поверхность затрагивают несколько окружений — чат-консоли, движки автодополнения внутри IDE, компаньоны для парного программирования и рецензенты pull request. Каждое из них читает собственный канонический файл конфигурации. Если проект поставляет только один такой файл, остальные среды выполнения молча импровизируют, опираясь на невысказанные соглашения; отсутствие памяти внутри репозитория проявляется сразу же.
Цена недостающей поверхности — скрытый дрейф в машинно-сгенерированном коде, худший класс дефектов, поскольку он накапливается незаметно. Каждый машинно-сгенерированный артефакт усиливает расхождение; к тому моменту, когда рецензент-человек замечает противоречие, кодовая база уже несёт недели несогласованных соглашений.
Конфигурация сред выполнения окружений множественна в силу реальности развёртывания. Опубликованная экосистема ДОЛЖНА поставлять три обязательные поверхности, перечисленные в §3: AGENTS.md, файл поведенческой памяти для среды выполнения чат-консоли (CLAUDE.md) и файл инструкций уровня репозитория для среды автодополнения внутри IDE. Эти поверхности ДОЛЖНЫ быть взаимно согласованы — без противоречий, без дрейфа — и ДОЛЖНЫ совместно кодировать одни и те же дисциплины.
2. Контракт согласованности
Каждая поверхность соглашений, входящая в область действия (§3), — это канал, выражающий единую спецификацию соглашений проекта. Спецификация раскладывается на:
- Общие разделы — дисциплина планов, структурированный запрос (или эквивалент для поверхности), заголовок авторства, именование, антипаттерны, модальная иерархия. Они ДОЛЖНЫ присутствовать в каждой обязательной поверхности и ДОЛЖНЫ быть семантически эквивалентны во всех поверхностях.
- Разделы, специфичные для поверхности — описания возможностей, шаблоны вызова инструментов, различия между генерацией кода и чатом. Они МОГУТ различаться между поверхностями, но НЕ ДОЛЖНЫ противоречить общим разделам.
Валидатор multi-surface-coherence (§7) выполняется при каждом прогоне CI и в pre-commit, проверяя соблюдение контракта.
Поверхности — это разные каналы, выражающие одну спецификацию. Общие разделы ДОЛЖНЫ совпадать во всех поверхностях — семантически и, где возможно, лексически. Разделы, специфичные для поверхности, НЕ ДОЛЖНЫ противоречить общим разделам.
3. Поверхности в области действия
| Поверхность | Путь | Обязательна? | Аудитория |
|---|---|---|---|
AGENTS.md | корень репозитория (и/или .codex/AGENTS.md) | ДОЛЖНА | окружения, поддерживающие AGENTS |
CLAUDE.md | корень репозитория (и/или .claude/CLAUDE.md) | ДОЛЖНА | Claude Code |
| Файл инструкций для IDE | .github/copilot-instructions.md | ДОЛЖНА | среда автодополнения в IDE |
| Манифест помощников | site/content/docs/architecture/agents.mdx | МОЖЕТ (по явному согласию через канал структурированного запроса) | платформы оркестрации нескольких помощников |
.cursorrules | корень репозитория | МОЖЕТ (по явному согласию) | среда выполнения редактора в IDE |
.windsurfrules | корень репозитория | МОЖЕТ (по явному согласию) | среда выполнения компаньона в IDE |
Для этого репозитория поверхности, подключаемые по явному согласию, — это те, которые фикстура списка утверждений (tests/fixtures/multi-surface-claims.yaml) перечисляет под ключом optional-in. Неиспользуемые корневые конфигурации, специфичные для вендоров, намеренно отсутствуют; файл конфигурации, специфичный для инструмента, добавляется только тогда, когда этот инструмент является активной поверхностью редактирования для этого репозитория.
4. Список разделов файла инструкций внутри IDE
Файл инструкций уровня репозитория в .github/ ДОЛЖЕН содержать в указанном порядке следующие разделы (каждый с точным текстом заголовка, приведённым ниже; тела разделов пишутся вручную, а не штампуются по шаблону, но каждый раздел ДОЛЖЕН охватывать перечисленные утверждения):
- Project Context — один абзац: что представляет собой этот репозиторий, кто им пользуется, какова его структура верхнего уровня. Конкретно, без маркетинга.
- Coding Conventions — именование, модальная иерархия, фронтматтер, стиль Markdown, особенности стиля для конкретных языков там, где они отличаются от умолчаний.
- File Headers — каждый файл, который генерирует среда выполнения, ДОЛЖЕН начинаться с канонической единственной строки
SPDX-License-Identifier: MITсогласноsite/content/docs/reference/authorship-header.mdx, в варианте комментария, соответствующем типу файла. Указатель наscripts/inject-header.*иsite/content/docs/reference/authorship-header.mdx.
- Plans Discipline — среда выполнения НЕ ДОЛЖНА генерировать код или скрипты, которые записывают в каталог конфигурации окружения (например,
~/.claude/plans/или~/.codex/.plans/) или в любое другое глобальное расположение планов. Артефакты планирования размещаются в<project-root>/.apothem/plans/(устаревшее дерево<project-root>/.plans/обновляется черезapothem migrate-workspace) согласноsite/content/docs/reference/plans-discipline.mdx. - Structured Inquiry Behavior — когда среда выполнения не уверена, она НЕ ДОЛЖНА молча выдумывать. Вместо этого она вставляет чётко помеченный блок уточнения (например, комментарий
# TODO(clarify): <question>) и выносит вопрос в чат, где это позволяет поверхность. Никаких выдуманных API, выдуманных названий моделей, выдуманных путей к файлам. - Forbidden Patterns — явные запреты: никаких маркетинговых прилагательных, никаких уклончивых слов-заполнителей, никакого отладочного мусора в виде console.log, никаких жёстко заданных абсолютных путей к домашнему каталогу пользователя, никаких коммитов секретов, никаких коммитов файлов в
.apothem/plans/(или в устаревшем.plans/), никаких противоречий каноническому файлу инструкций проекта. - Output Format — сгенерированный код/текст соответствует единым соглашениям о диалоговом выводе: определённость, единообразное разбиение на разделы, плотность, дисциплина резюме, цитирование. Для кода: документированная публичная поверхность, типизация там, где язык поддерживает типы, тесты там, где есть тестовый каркас.
- Review Checklist — что рецензент (человек или среда выполнения в режиме ревью PR) ДОЛЖЕН проверить перед одобрением: заголовок присутствует, именование соответствует соглашениям, нет записей в
.apothem/plans/, нет противоречий с каноническим файлом инструкций проекта, валидаторы локально зелёные. - Pointers — ссылки на
AGENTS.md,CLAUDE.md,site/content/docs/reference/plans-discipline.mdx,site/content/docs/reference/authorship-header.mdx, этот документ соглашений,src/apothem/schemas/иCONTRIBUTING.md.
Файл начинается с канонической SPDX-строки заголовка авторства (вариант для Markdown) согласно site/content/docs/reference/authorship-header.mdx §2 — видимой или невидимой в зависимости от выбранной проектом политики видимости заголовка.
Файл инструкций внутри IDE не является дословной копией AGENTS.md или CLAUDE.md. AGENTS.md — каноническая поверхность инструкций проекта, CLAUDE.md отражает её для Claude Code, а файл инструкций внутри IDE написан для среды автодополнения кода внутри редактора, которая выдаёт предложения, принимаемые или отклоняемые разработчиком. Информация (дисциплины, соглашения, антипаттерны) идентична; различается подача.
5. Справка по списку утверждений
Фикстура tests/fixtures/multi-surface-claims.yaml перечисляет каждое общее утверждение. Примеры записей:
- id: plans.location
claim: "Planning artifacts live at <project-root>/.apothem/plans/, never inside a harness configuration directory."
required-in: [AGENTS.md, CLAUDE.md, .github/copilot-instructions.md]
optional-in: [site/content/docs/architecture/agents.mdx, .cursorrules]
- id: header.canonical
claim: "Every applicable new file begins with the canonical SPDX-License-Identifier: MIT header line, in the comment family matching the filetype."
required-in: [AGENTS.md, CLAUDE.md, .github/copilot-instructions.md]
- id: ambiguity.resolution
claim: "Ambiguity is surfaced via the structured-inquiry channel or a clearly-marked TODO(clarify); never silently invented."
required-in: [AGENTS.md, CLAUDE.md, .github/copilot-instructions.md]
# ... (one entry per shared claim)Валидатор разбирает каждую поверхность, пытается найти присутствие каждого утверждения в поверхности (по иерархии заголовков + извлечению ключевых слов из тела) и завершается с ошибкой при любом пропуске или противоречии.
6. Правило согласования
Когда обнаруживается, что две поверхности противоречат друг другу в общем утверждении, согласование по умолчанию таково:
AGENTS.md— канонический голос проекта. Любая противоречащая поверхность переписывается так, чтобы отражать семантикуAGENTS.mdв подаче, подходящей для этой поверхности.
Переопределение, специфичное для поверхности, допускается только при наличии явного маркера <!-- coherence-override: <claim-id> --> в самом файле, указывающего на ADR, который объясняет намеренное расхождение. Сам маркер переопределения перечислен в списке разрешений валидатора и отображается в отчёте CI.
Для этого репозитория утверждённая стратегия согласования — agents-md-wins: AGENTS.md является каноническим, а каждое активное зеркало для окружений остаётся семантически эквивалентным.
7. Валидаторы
Три валидатора совместно реализуют контракт согласованности:
- in-IDE-instructions-presence (src/apothem/conformity/copilot_instructions_presence_grep.py)
- multi-surface-coherence (src/apothem/conformity/multi_surface_coherence_grep.py)
- license-author-consistency (src/apothem/conformity/license_author_consistency_grep.py)- Первый проверяет, что файл инструкций внутри IDE существует, разбирается, содержит каждый канонический раздел, перечисленный в §4, и начинается с канонической строки
SPDX-License-Identifier: MIT(вариант для Markdown). - Второй разбирает канонические разделы каждой поверхности и проверяет, что общие разделы взаимно согласованы при нормализованном сравнении (без учёта регистра, с допуском различий в пробелах, с разрешением лексического перефразирования, но с требованием семантической эквивалентности по списку утверждений, заданному фикстурой).
- Третий проверяет только то, что корневой LICENSE содержит разбираемую строку
Copyright (c) <name>. Он не читает пофайловые заголовки, которые не содержат имени автора.
8. Жизненный цикл поверхности
- Добавить поверхность. Оператор явно подключает её через канал структурированного запроса. Генератор создаёт поверхность по списку утверждений, запускает валидатор и оформляет ADR, если нужно переопределение, специфичное для поверхности.
- Удалить поверхность. Структурированный запрос подтверждает удаление, ADR фиксирует обоснование, список required-in валидатора изменяется.
- Обнаружение дрейфа. Любой коммит, расходящийся со списком утверждений, отклоняется pre-commit / CI; автор коммита переписывает поверхность, чтобы восстановить согласованность.
См. также
- ADR-0003 — архитектурное обоснование, рассмотренные альтернативы.
tests/fixtures/multi-surface-claims.yaml— каноническая фикстура списка утверждений.AGENTS.md— канонический голос проекта.CLAUDE.md— зеркало для Claude Code.site/content/docs/reference/plans-discipline.mdx— каноническая справка по общему утверждению о дисциплине планов.site/content/docs/reference/authorship-header.mdx— каноническая справка по общему утверждению о заголовке авторства.- Спецификация проекта §0.6 + §2.8 + §4.7 — полный канонический текст, отражённый здесь.
`CLAUDE.md`
Всегда загружаемая конфигурация проекта, которая задаёт базовый контекст каждого взаимодействия: разделы прозы, охватывающие канон поверхности AI, операционный цикл, назначение и дисциплины, с сквозными мандатами, реализованными в группе правил.
Заголовок авторства — пофайловая SPDX-строка лицензии
Определение и применение пофайловых маркеров SPDX-идентификатора лицензии с помощью канонических однострочных заголовков в подходящем синтаксисе комментариев для каждого типа файла.