Этот документ определяет эталонную структуру документации (specs/) для проектов, использующих CodeMemory. Цель этой структуры — быть легко читаемой как для человека, так и для LLM, обеспечивая быструю навигацию без раздувания контекста.
Документация строго разделена на 6 слоев, от бизнеса к коду:
product/(Что и Зачем): Миссия, глоссарий, границы скоупа (v1). Здесь нет технической реализации.domain/(Данные): Форма данных, сущности (Entities), связи в БД. (Без описания жизненного цикла и runtime-состояний).features/(Функции): Детальное описание крупных функциональных блоков (например, RAG, Wizard, Admin UI). Каждая фича — в своей папке с обязательнымREADME.md(картой фичи).system/(Кросс-функциональное): Инфраструктура, внешние сервисы, протоколы API, контракты, развёртывание.code/(Разработка): Правила написания кода, конвенции, дизайн-система.meta/(Будущее): Идеи, отложенные задачи.
Помимо шести слоёв в корне спеки живут два сквозных артефакта: RULES.md
(реестр инвариантов, ниже) и specs/user-stories/ — User Stories, которые
по своей природе пересекают слои и поэтому не помещаются ни в один (см. ниже).
В корне спецификаций (или в code/) должен лежать файл RULES.md. Это машиночитаемый индекс критических архитектурных правил проекта.
- Зачем: LLM загружает этот файл на старте сессии (указано в
CLAUDE.md). Это даёт ей жёсткие рамки до погружения в детали. - Формат: Таблица с ID, кратким описанием правила и ссылкой на деталь.
(Пример:
[R-API-01] Все ответы API через ApiResponse::make() -> system/api.md)
Для предотвращения "слепых зон" (когда LLM меняет бэкенд, но забывает про UI или очереди), спецификации должны явно описывать потоки выполнения.
В features/<feature>/README.md должны быть описаны кросс-модульные связи.
- Не просто: "Есть очередь обработки".
- А как поток: "При загрузке (Admin UI) -> Создается Document (Domain) -> Диспатчится IngestionJob (Features/Ingestion)".
User Story в нашей модели двухуровневая (см. user-stories.md):
бизнес-поведение плюс system_reaction — что крутится под капотом. Из-за
system_reaction история несёт техническую реализацию и потому не помещается
в слой product/, который по определению без неё. Поэтому истории живут в
собственном верхнеуровневом доме specs/user-stories/, сквозном по слоям
(бизнес + системная реакция) — это снимает противоречие слоя product/.
- Формат:
АкторделаетДействие-> ОжидаемыйРезультат(изменения в UI, БД, отправка событий). - Истории описывают наблюдаемое поведение, помогая модели понять, какие слои затронет её изменение.
Истории устроены identity-first — так же, как заметки Code Memory (короткий ID, ссылка по ID, путь не несущий):
- ID, не путь. У истории короткий стабильный глобально-уникальный ID; имя
файла —
<id>-<slug>.md(ID как префикс,<slug>— kebab от goal для читабельности). Все ссылки — по ID, никогда по пути; резолв ссылки — glob**/<id>-*.md. - Свободная переставляемая раскладка. Внутри
specs/user-stories/структура свободная (по фиче, механизму, пакетам) и реорганизуемая без поломки ссылок — путь не несущий. Это снимает и проблему пустых папок под сквозную историю, и угадывание «правильной» иерархии заранее.
- Машиночитаемый Frontmatter: Каждый
.mdфайл должен содержать YAML блок (статус, доменные сущности, теги), чтобы LLM могла быстро понять релевантность файла без полного парсинга. - Один файл — одна тема: Лимит ~150-250 строк. Разросшиеся документы режутся на логические части.
- Не дублируй то, что есть в коде: Каталоги маршрутов, полные схемы таблиц или точные сигнатуры интерфейсов не должны быть в спеке. Модель должна читать их из исходников.
- Явное выделение Инвариантов: В тексте спецификаций жёсткие правила выделяются в отдельную секцию
## Инварианты (Must Hold), чтобы модель могла легко извлечь их при поиске.