Atomic Spec — методология совместной работы PM, разработчика и тестировщика. Один источник правды. Полная история решений. Статус каждого требования — виден без совещания.
git log spec.md — полная история: кто, когда, почему, по чьей инициативеgit diff release/v1..release/v2 — точный список что изменилось в сценарияхКаждое требование — отдельный .spec.md. Содержит намерение, правила домена, Gherkin-сценарии и платформенный контракт. Добавить требование = создать файл.
Файл в корне папки — верифицировано и актуально. В _draft/ — есть открытые вопросы. В _deprecated/ — история. Статус виден без открытия файла.
Кто изменил, когда, почему, по чьей инициативе — в commit message. Diff между тегами релизов — точный список изменений для каждой роли.
Детальные инструкции, примеры файлов, git-команды и сценарии работы — для каждой роли отдельно.
Не «кажется всё согласовали», а точный ответ: что верифицировано, что в работе, что нужно решить прямо сейчас.
Не «кажется так договорились», а точная дельта: что изменилось в требованиях пока ты делал задачу, и кто это решил.
git log spec.md — полная история решений. Decision Log объясняет почему не выбрали альтернативу.git diff main HEAD -- specs/ — убедиться что требование в вашей ветке актуально. Если аналитик внёс изменение в main пока вы работали — вы увидите diff.
Не «протестируй всё», а точный diff сценариев между тегами. Что новое, что изменилось, что блокирует релиз.
git diff release/v1..release/v2 -- specs/ — точный список файлов и дельта сценариев. Ничего лишнего.blocks-release: true + verification.status: none — список именно этих файлов. Всё остальное — второстепенно.§ Acceptance Criteria между релизами показывает не весь файл, а только изменения в поведении.Состояние каждого домена, открытые решения, риски спринта — в любой момент, прямо из репозитория.
Все цифры — из одной команды. Реальное состояние, не то что написано в отчёте.
domain/AUTH/v1.0 → v3.1 — три Breaking, одно Additive.sprint-locked — явный конфликт требования с текущей разработкой.blocks-release: true и verification: none — точный ответ: можно ли выходить.Аналитик — владелец атомов. Он создаёт требования, закрывает открытые вопросы, верифицирует изменения доменной модели. Вся работа аналитика — в .spec.md файлах и PR.
Каждый атом проходит путь через позиции в дереве файлов:
| Тип | Когда | Кто верифицирует | Блокирует спринт |
|---|---|---|---|
ParameterChange | Изменение значения: таймаут, лимит, размер | 1 стейкхолдер | нет |
RuleChange | Новое, изменённое или удалённое доменное правило | Product + Tech | возможно |
FlowChange | Новый шаг в сценарии, изменение ветки | Product | возможно |
ModelChange | Новый агрегат, поле, событие | Product + Tech + Architect | да |
BoundaryChange | Перенос агрегата, разделение домена | CTO + Architect + Product | да, RFC |
Если требование изменилось пока идёт разработка — не правим исходный атом, создаём amendment:
Open Questions — единственная причина находиться в _draft/. Пока есть хоть один status: open, файл не переезжает в корень.
| Статус OQ | Что значит | Действие |
|---|---|---|
open | Вопрос открыт, решение не принято | Файл остаётся в _draft/ |
blocked | Зависит от другого OQ | Файл остаётся в _draft/ |
resolved | Решение принято, зафиксировано | Если все resolved → PR в корень |
AUTH-REG-030_github-oauth-registration.spec.md в _draft/AUTH~MODEL-003~model_identity-aggregate.spec.md в _draft/affects-atoms — все затронутые use-casesРазработчик — потребитель атомов. Он читает требования, реализует платформенный контракт, обновляет implementation.status и сигнализирует о конфликтах между требованием и реализацией.
git diff main HEAD -- specs/. Убедись что требование в твоей ветке актуально. Аналитик мог изменить что-то в main пока ты работал.
Утром нового рабочего дня — три команды:
Разработчик читает секции сверху вниз, останавливаясь на нужном уровне детализации:
| Секция | Что даёт разработчику | Обязательно |
|---|---|---|
§ Intent | Понять зачем эта фича вообще | да |
§ Domain Rules | Инварианты и бизнес-правила — нельзя нарушить | да |
§ Acceptance Criteria | Gherkin — что должно работать (основа тестов) | да |
§ Domain Model Touch | Какие агрегаты создаются/изменяются | да |
§ Platform: Web API | Точный контракт API — endpoint, body, responses | да |
§ Platform Tests | Готовые тест-кейсы для реализации | берём как есть |
§ Decision Log | Почему именно так — контекст решений | при вопросах |
Секция § Platform: Web API — это официальный контракт. Не надо спрашивать аналитика «какой endpoint», не надо смотреть в Swagger. Всё в файле.
Аналитик создал amendment-файл рядом с вашим атомом. Что делать:
conflict.status в amendmentsprint-locked → доделать текущую задачу как есть, amendment — следующий PRpulled → задача возвращена, нужно обновить реализациюamendment-status после своего решенияconflict.resolution.
Создай leaf-атом в _draft/ самостоятельно, открой OQ, попроси аналитика закрыть. Не додумывай поведение самостоятельно — зафиксируй вопрос.
Добавь see-also ссылку, создай OQ в обоих атомах, заблокируй PR до решения. Конфликт должен быть виден аналитику.
Жди пока аналитик смержит ~model_ атом в main. Начинай реализацию только после. ModelChange блокирует спринт — это нормально.
Тестировщик — верификатор атомов. Он проверяет что реализованное соответствует сценариям в § Acceptance Criteria, обновляет verification.status и блокирует релиз при несоответствии.
git diff release/v1..release/v2 -- specs/.
Diff секции § Acceptance Criteria — это и есть список что нужно перепроверить:
Тестировщик видит: старый тест с 20с нужно обновить на 60с. Добавился новый сценарий с блокировкой аккаунта.
| blocks-release | verification | Действие |
|---|---|---|
true | none | 🔴 СРОЧНО — без этого нельзя выходить |
true | in-progress | 🟡 В работе — отслеживать |
true | passed | ✅ Готово — не блокирует |
false | none | ⬜ Можно после релиза |
true | failed | 🔴 СТОП — релиз заблокирован |
Обновить verification.status: failed, добавить комментарий с деталями, создать баг-репорт со ссылкой на атом (spec: AUTH-REG-020). Если blocks-release: true — релиз блокируется автоматически при следующей проверке.
Открыть OQ в атоме (аналитик получает сигнал), не закрывать верификацию как passed. Поведение системы должно соответствовать сценарию — а не наоборот.
Старый тест (20с) нужно обновить на новое значение (60с). Amendment-файл содержит точное was / becomes — используй как инструкцию к изменению теста.
Руководитель — читатель состояния системы. Атомы дают ему полную картину без необходимости собирать статусы с команды: что реализовано, что не проверено, какие решения заблокированы, какие риски несёт текущий спринт.
Три сигнала которые требуют внимания руководителя:
| Сигнал | Что значит | Действие |
|---|---|---|
| sprint-locked в amendment | Требование изменилось в середине спринта | Подтвердить решение: изъять или amendment в следующий |
| HIGH risk в use-case | Фича с высоким риском в текущем спринте | Выделить отдельный PR, дополнительный review |
| ModelChange не смержен | Архитектурное изменение блокирует спринт | Приоритизировать review доменного изменения |
Перед каждым релизом — четыре проверки:
blocks-release: true + verification: none → список пустverification.status: failed → 0amendment-status: pending в Done задачах → 0status: open вне _draft/ → аномалия, требует внимания| Метрика | Как считать | Норма |
|---|---|---|
| Ratio draft/active | Файлов в _draft / всего активных | < 20% — нет долгих неопределённостей |
| Amendment frequency | Amendment-файлов за спринт | 0-1 — требования стабильны до спринта |
| Verification lag | Дней от implementation: done до verification: passed | < 5 дней |
| OQ resolution time | Среднее время от open до resolved | < 3 дней — нет застрявших решений |
| Breaking per quarter | ModelChange + BoundaryChange тегов | < 3 — архитектура стабильна |
Atomic Spec — методология совместной работы над требованиями, которая объединяет четыре подхода в одну систему хранения знаний в git-репозитории.
| Подход | Что берём |
|---|---|
| Domain-Driven Design | Доменную модель (агрегаты, события, bounded context) как источник общего языка команды |
| Test-Driven Development | Критерии приёмки (Gherkin) внутри самого требования — тест и требование неразделимы |
| Use Case Driven | Сценарии использования как атомарная единица функциональности |
| Requirements-Driven | Требования как живые артефакты с историей, не замороженные документы |
Центральная идея: один файл — одна единица знания. Атомы складываются в иерархию, ссылаются друг на друга и содержат всё — от бизнес-намерения до тест-кейсов и платформенного контракта.
git log на *.spec.md файлах? Да → методология применена правильно.
Пять проблем, которые закрывает Atomic Spec:
| Проблема | Как закрывает |
|---|---|
| Требования разбросаны по Confluence, Jira, Slack | Всё в одном .spec.md файле рядом с кодом |
| Непонятно почему принято решение | § Decision Log и git log — полная история |
| Тестировщик не знает что изменилось | git diff release/v1..release/v2 — точная дельта сценариев |
| PM изменил требование в спринте — команда не знает | Amendment-файл с явным conflict.status |
| Руководитель не видит реальный статус | Дерево файлов = живой дашборд без совещаний |
| Уровень | Файл | Цена изменения | RFC |
|---|---|---|---|
| System | system.spec.md | Критическая — затрагивает все домены | обязательно |
| Domain | domain.spec.md | Высокая — 3+ верификатора | желательно |
| Use Case | DOMAIN-TYPE-NNN_slug.spec.md | Средняя — 2 верификатора | нет |
| Scenario | DOMAIN-TYPE-NNN_slug.spec.md | Низкая — 1 верификатор | нет |
Файл = YAML frontmatter + Markdown-секции. Секции идут от абстрактного к конкретному. Каждая роль читает свои секции — никто не вынужден читать всё.
Три позиции определяют состояние требования. Файл всегда находится ровно в одной из них.
| Вопрос | Ответ без открытия файла |
|---|---|
| Можно взять в работу? | Файл в корне папки → да |
| Есть открытые вопросы? | Файл в _draft/ → нет, стоп |
| Требование устарело? | Файл в _deprecated/ → история |
| Сейчас в разработке? | Открытый PR в git |
| Реализовано? | implementation.status: done + merged PR |
| Протестировано? | verification.status: passed |
Каждая директория содержит _index.md — таблицу всех файлов с быстрым статусом. Это живой дашборд директории.
Frontmatter содержит только то, что нельзя узнать из git: структурные связи между атомами, открытые вопросы и статусы по трём осям (смысловой, реализационной, тестовой).
git log и PR description. Дублировать это в файле не нужно.
Каждое изменение требования классифицируется перед внесением. Тип определяет: кто верифицирует, блокирует ли спринт, нужен ли RFC, какой радиус затронутых атомов.
| Тип | Что меняется | Пример | Верификаторы | Блокирует спринт |
|---|---|---|---|---|
| ParameterChange | Значение константы | Таймаут 20с → 60с | 1 стейкхолдер | нет |
| RuleChange | Доменное правило DR | Добавить лимит попыток | Product + Tech | возможно |
| FlowChange | Шаг сценария, ветка | Добавить шаг resend | Product | возможно |
| ModelChange | Агрегат, поле, событие | Новый агрегат Identity | Product + Tech + Arch | да |
| BoundaryChange | Границы домена | Выделить OTP-домен | CTO + Arch + Product | да + RFC |
PlatformChange | API-контракт | Новое поле в response | Tech Lead | нет |
Когда требование изменяется пока атом уже находится в разработке — правка не вносится в исходный файл. Создаётся отдельный amendment-файл с явным указанием конфликта.
Три сценария при конфликте правки со спринтом:
| Ситуация | Действие |
|---|---|
Атом ещё в _draft/ или _ready/ | Обновить файл на месте, записать в changelog commit |
| В разработке, успели изъять | Вернуть в _ready/, обновить, пересмотреть спринт |
| В разработке или уже готово | Создать amendment-файл рядом, conflict.status: sprint-locked |
Разные уровни системы версионируются по-разному, потому что у них разные потребители и разная семантика совместимости.
| Уровень | Схема | Логика |
|---|---|---|
| Domain | vMAJOR.MINOR git-тег | MAJOR = ModelChange/BoundaryChange. MINOR = RuleChange/Additive. Нет PATCH. |
| Use Case / Scenario | Ревизия r1, r2, r3 | Линейная история. Потребитель смотрит diff, не «совместим ли я». |
| Platform (API) | Честный semver | Потребитель — код. Совместимость — техническая. Semver работает идеально. |
| Amendment | Нет версии | Это событие, не артефакт. Живёт в git как commit. |
Git — журнал решений. Commit message несёт всё что не хранится в файле: кто запросил, почему, что затрагивает.
Одни и те же файлы дают разные срезы для разных ролей. Ключевой инструмент — git diff между нужными тегами или ветками.
| Роль | Срез | Инструмент |
|---|---|---|
| Аналитик | Актуальные требования + открытые вопросы | main ветка + файлы в _draft/ |
| Разработчик | Дельта требований в своей ветке | git diff main feat/... |
| Тестировщик | Что изменилось в сценариях релиза | git diff release/v1..release/v2 |
| Руководитель | Полная картина + риски | _index.md + grep-запросы |
1. Атом не удаляется — он устаревает. Файл переезжает в _deprecated/ с указанием deprecated-by и причины. Удалённый атом разрывает историю.
2. Листья добавляются, ветви изменяются минимально. Новый сценарий = новый файл. Изменение use-case = diff с changelog в commit. Чем выше уровень, тем консервативнее.
3. Scope атома не расширяется — создаётся новый. Расширение scope = скрытое изменение контракта. Все кто ссылается на атом молча получают другую семантику.
4. Domain Rules — только append, никогда rewrite. Изменение DR записывается с явной пометкой: [updated: 2024-03, reason: security policy v3].
5. Открытые вопросы блокируют реализацию, не документацию. Атом с открытыми OQ существует и виден. Команда знает что вопрос есть, не додумывает сама.
6. Нет изменения домена без явного решения. ModelChange и BoundaryChange требуют § Decision Log с альтернативами и обоснованием.
7. PR-граница = доменная граница риска. Не смешивать в один PR: доменные изменения + новые сценарии, high-risk + low-risk, изменение домена + изменение платформы.
Пример: система аутентификации прошла 4 итерации. Вот как менялось дерево и что это значило для команды.
Четыре полных кейса — от дерева файлов до примеров атомов, правок и эволюции доменов для разных типов продуктов.
Контекст: продукт интегрирует несколько платёжных провайдеров — Stripe (международные карты), Tinkoff (RU-карты), СБП (QR-код). Команда: 1 PM, 3 разработчика, 1 QA. Спринты двухнедельные.
Главная сложность: у каждого провайдера свои правила, свои webhook-форматы, своя логика возврата. При добавлении нового провайдера нельзя сломать существующие. Доменная модель должна быть независимой от провайдера.
В Sprint-08 СБП вернул QR-таймаут 10 минут, хотя в документации НСПК было 15. После уточнения оказалось 10 минут. Правка пришла пока разработчик уже делал фичу.
Первые два провайдера хранили данные карт в Payment. При добавлении СБП оказалось что модель нужно расширить — СБП работает по-другому. Решение: ProviderSession как отдельный агрегат.
| Роль | Смотрит | Видит |
|---|---|---|
| PM | _draft/refund/ | OQ-1 открыт: СБП возврат неизвестен → не брать в спринт |
| Dev | git diff main feat/sbp | PAY~MODEL-002 добавил ProviderSession — нужен новый репозиторий |
| QA | git diff release/v1..release/v2 -- specs/ | Новые сценарии PAY-INI-030, 031, 032 — все blocks-release: true |
Контекст: медиа-платформа для авторов. Публикации, черновики, категории, комментарии, SEO-метаданные. Начинали как простой блог — за 6 месяцев выросли в редакционную платформу с ролями.
Интересный момент: система кажется простой, но у неё нетривиальная эволюция. Начало с «публикация = статья», потом появились черновики, потом ревизии, потом совместное редактирование. Каждый шаг ломал предыдущие допущения.
| Версия | Что изменилось | Тип | Что сломало |
|---|---|---|---|
v1.0 | Post с content: string напрямую | Initial | — |
v2.0 | Контент вынесен в Revision (история правок) | ModelChange | Все use-cases работавшие с Post.content |
v2.1 | Добавлен статус review в Post | RuleChange | DR-1 в BLOG-PUB-020 обновлён |
v3.0 | SEOMeta как Value Object | Additive | Ничего — новые поля опциональны |
Post.content в § Domain Model Touch перечислены в affects-atoms ModelChange-файла. Команда знала масштаб до начала разработки.
После v3.0 аналитик сделал SEO-title обязательным при публикации. Разработчик уже делал фичу публикации.
Контекст: продукт — AI-ассистент для поддержки клиентов. Чаты с историей, переключение моделей (GPT-4 / Claude / Llama), контекстное окно, memory, инструменты. Команда из 4 человек. Требования меняются каждую неделю — это главный вызов для методологии.
Ключевая сложность: AI-продукты имеют нечёткие требования по умолчанию. «Бот должен отвечать умно» — не DR. Atomic Spec заставляет формализовать то, что кажется очевидным: максимальный размер контекста, поведение при ошибке модели, что считается «хорошим» ответом.
AI-продукты — это 2-3 изменения требований в неделю. Atomic Spec для таких продуктов имеет особую практику:
| Ситуация | Как обработать |
|---|---|
| Изменился timeout модели | ~param amendment — одно поле, один верификатор, один PR |
| Добавили новую модель в enum | Additive в domain.spec.md — одна строка в модели |
| Изменилась логика truncation | ~rule amendment к CHAT-MSG-013 — product + tech верификация |
| Новый тип инструмента | Новый атом в tools/ — создаётся в _draft/ пока OQ открыты |
| Смена LLM-провайдера | ModelChange — требует RFC, блокирует спринт |
Команда решила добавить поддержку Llama-3 как дешёвой альтернативы. При этом у Llama другой API, другой лимит контекста, нет function calling. Это не просто «добавить строку в enum».
Контекст: e-commerce платформа с несколькими командами. Каталог товаров, корзина, заказы, доставка, возвраты. Каждый домен — своя команда (2-3 человека). Это делает межкомандное взаимодействие ключевым вызовом.
Главная сложность: несколько доменов взаимодействуют через события. Изменение в одном домене может неожиданно сломать другой. Atomic Spec делает эти зависимости явными через emits / consumes в frontmatter.
После роста команды управление остатками выделили в отдельный домен INVENTORY. Это BoundaryChange — самое дорогое изменение, требует RFC.
При работе нескольких команд на одном репозитории каждая команда работает со своим поддеревом, но видит зависимости через system.spec.md.
| Команда | Своё поддерево | Следит за событиями | Риск |
|---|---|---|---|
| Team A (Catalog) | specs/catalog/ | Публикует StockChanged | Изменение формата события ломает Team B |
| Team B (Cart + Order) | specs/cart/, specs/order/ | Потребляет StockChanged, публикует CartCheckedOut | Зависит от двух других команд |
| Team C (Delivery) | specs/delivery/ | Потребляет OrderConfirmed | Любое изменение в ORD-010 требует проверки |
emits в любом атоме — это Breaking change для всех команд у которых этот event в consumes. Перед любым изменением события: найти все атомы с этим event в consumes и уведомить их команды.
Четыре разных системы — один подход. Смотрите как выглядит дерево атомов, как эволюционирует домен, как команда работает с реальными требованиями.
Система принимает платежи через несколько провайдеров: Stripe (международные карты), ЮKassa (РФ-карты), СБП (быстрые переводы). Это классический случай когда структура атомов из примера с OAuth-провайдерами применяется к платёжному домену — один абстрактный Provider, несколько конкретных реализаций.
Ключевые особенности этой системы для документирования:
Идемпотентность — не техническая деталь, а бизнес-правило. Оно живёт в доменных правилах use-case, а не в платформенной секции. Это позволяет тестировщику проверять его независимо от реализации.
| Итерация | Что добавляем | Изменение домена | Новых атомов |
|---|---|---|---|
| v1.0 — Stripe | Базовый платёж USD/EUR | domain v1.0 — базовая модель | 7 атомов |
| v2.0 — ЮKassa | RUB карты, двухэтапное подтверждение | domain v2.0 — добавлен Capture | +5 атомов |
| v2.1 — СБП | QR-код, push-уведомление, 24ч timeout | domain v2.1 — Additive, QR flow | +4 атома |
Кажется простой системой — пока не начнёшь разбираться в деталях. Черновики, публикация, редактирование опубликованного, версии, модерация комментариев, SEO-метаданные, теги — каждая из этих фич содержит неочевидные доменные решения. Этот кейс показывает как расти от MVP к полноценной платформе без переписывания атомов.
Ключевые вопросы которые возникнут:
В MVP нет черновиков, нет версий, нет тегов. Просто написать и опубликовать.
Добавляем комментарии. Возникает первый неочевидный вопрос: что происходит с комментариями при удалении поста?
Теги — простая фича с неочевидным краевым случаем: что если удалить тег у которого есть посты?
Это Breaking изменение — добавляется агрегат PostRevision. Меняется модель Post.
| domain v2.0 | domain v3.0 | |
|---|---|---|
| Post.body | string — хранит текст напрямую | удалено — текст в PostRevision |
| Post.title | string | удалено — в PostRevision |
| PostRevision | нет | новый агрегат |
| Редактирование | мутирует Post | создаёт PostRevision |
BLG~MODEL-001~model_post-revision-aggregate.spec.md должен быть смержен и верифицирован до того как разработчик начнёт реализацию BLG-PST-012 и BLG-PST-015. Иначе — конфликт в середине спринта.
| Роль | Может | Не может |
|---|---|---|
| Author | создать, редактировать свои посты, публиковать | модерировать чужие комментарии, удалять теги |
| Editor | всё что Author + редактировать любые посты | удалять пользователей, управлять тегами |
| Admin | всё | — |
| Reader | читать, комментировать | создавать посты |
Каждое ролевое разграничение — отдельный Domain Rule в соответствующем use-case. Не в коде middleware, не в README — в атоме.
Самый нестандартный кейс для Atomic Spec: поведение системы нетерминировано. Один и тот же ввод может дать разный вывод. Как писать требования и тесты для такой системы?
Ответ: документируем не ожидаемый точный ответ, а ожидаемое поведение — классификацию намерения, наличие tool call, структуру ответа, границы допустимого. Acceptance Criteria работают со свойствами ответа, а не с его точным содержанием.
Три уровня тестирования ИИ-системы — каждый отвечает на свой вопрос:
| Уровень | Что тестируем | Как фиксируем в атоме |
|---|---|---|
| Структурный | Правильная последовательность вызовов: сохранить → LLM → сохранить ответ | Обычный Gherkin с Then-шагами на порядок действий |
| Поведенческий | Наличие/отсутствие tool call, тип intent, структура ответа | Then: ответ содержит/не содержит X, tool был/не был вызван |
| Качественный | Тон, точность, соответствие системному промпту | § Quality Criteria — отдельная секция, не Gherkin |
| Итерация | Что добавляем | Изменение домена |
|---|---|---|
| v1.0 — Простой Q&A | Вопрос-ответ без памяти | Conversation без истории |
| v1.1 — История | Контекст предыдущих сообщений | Additive: Message history |
| v2.0 — Tool calls | Поиск погоды, базы знаний | Breaking: Message.toolCalls |
| v2.1 — Эскалация | Передача живому оператору | Additive: escalated status |
| v3.0 — Агент | Многошаговые задачи, планирование | Breaking: Task aggregate |
Самый сложный кейс по числу доменов и их взаимодействию. Интернет-магазин — это несколько независимых Bounded Context, которые взаимодействуют через события, а не прямые вызовы. Atomic Spec здесь решает важнейшую проблему: кто владеет каким требованием и как изменение в одном домене влияет на другой.
Saga — это атом уровня System который описывает межсервисное взаимодействие. Это не use-case одного домена — это оркестрация нескольких.
| Итерация | Что строим | Домены | Ключевые решения |
|---|---|---|---|
| MVP v1.0 | Каталог + Заказ + Оплата (Stripe) | catalog, orders, payments | Нет корзины — прямой переход к заказу |
| v1.1 | Корзина | +cart | Snapshot цены в CartItem — INV-2 |
| v2.0 | Доставка | +delivery | Breaking: OrderConfirmed теперь нужен delivery |
| v2.1 | Уведомления | +notifications | Additive: подписка на события других доменов |
| v3.0 | Возвраты | orders расширен | Breaking: новый Return aggregate, Saga компенсации |
AI-агенты (Claude Code, Cursor, Copilot Workspace и другие) работают эффективно когда контекст структурирован, однозначен и предсказуем. Atomic Spec решает три ключевые проблемы агентной разработки:
| Проблема агента | Как Atomic Spec решает |
|---|---|
| «Откуда мне знать что именно реализовывать?» | Атом содержит § Platform Contract — точный API-контракт без интерпретации |
| «Это моё изменение ничего не ломает?» | emits/consumes явно показывают зависимости между доменами |
| «Правильно ли я понял бизнес-правило?» | § Domain Rules — формализованные DR-N, не prose |
| «Тесты уже написаны?» | § Platform Tests — готовые тест-кейсы, агент только запускает |
| «Как мне обновить статус задачи?» | Frontmatter с явными полями implementation.status |
Агент работает с атомами по чёткому протоколу. Порядок чтения соответствует секциям атома — от абстрактного к конкретному:
Перед тем как агент начинает реализацию, ему передаётся минимальный достаточный контекст. Слишком много — агент теряет фокус, слишком мало — додумывает.
Когда агент получает задачу «добавить фичу X» без готового атома, он должен сначала создать атом, а не писать код. Порядок строгий:
В процессе реализации агент может обнаружить что требование в атоме противоречит другому атому, или что поведение системы предполагает незафиксированное правило. Правильный алгоритм:
Агент может автоматически проверять соответствие кода атомам. Это один из самых ценных сценариев: не ждать человека для базовой проверки.
| Антипаттерн | Симптом | Правильно |
|---|---|---|
| Spec-blind coding | Агент пишет код не прочитав атом | Протокол: сначала прочитать все связанные атомы |
| Silent assumption | Агент заполняет пробел в требованиях своей логикой | Создать OQ, остановиться, передать человеку |
| Draft skip | Агент создаёт атом сразу в корне папки | Всегда через _draft/, перемещение — отдельный PR |
| Mega commit | Атом + код + тесты в одном коммите | Три отдельных коммита: spec / implementation / tests |
| Status drift | Агент реализовал, но не обновил implementation.status | Обновление статуса — часть definition of done |
| Context overload | Агент читает весь specs/ перед задачей | Только целевой атом + domain + children + see-also |
| Rule invention | Агент добавляет DR которого нет в атоме | Только DR явно описанные аналитиком. Остальное — OQ |
Компактный промпт для AI-агента работающего с Atomic Spec репозиторием. Содержит всё необходимое — ничего лишнего.
К базовому промпту добавьте специфику вашего проекта одним блоком:
ИИ-агенты — это новый тип участника команды. Они пишут код, создают тесты, предлагают рефакторинг. Но у них есть фундаментальная проблема: нет памяти между сессиями и нет контекста о решениях команды.
Atomic Spec решает это элегантно: репозиторий .spec.md файлов — это внешняя память агента. Всё что нужно знать об истории, решениях и текущем состоянии — в файлах, которые агент может прочитать в любой момент.
.spec.md файлов перед каждой задачей. Spec-файлы — это интерфейс между людьми и агентами.
| Проблема | Что происходит | Как часто |
|---|---|---|
| Агент не знает «почему» | Переписывает логику которая кажется ему нелогичной, но была принята по бизнес-причинам зафиксированным в Decision Log | Каждая сессия |
| Агент не знает текущий статус | Пишет код для требования которое уже deprecated или ещё в draft | Часто |
| Агент не видит зависимости | Меняет доменную модель не зная что это ломает другие use-cases | При рефакторинге |
| Агент придумывает поведение | При неполном контексте галлюцинирует «разумное» поведение вместо следования спеку | При edge cases |
| Нет версионирования изменений | Агент меняет спек и код вместе без явной классификации что именно изменилось | Постоянно |
Агент выступает в одной из четырёх ролей в зависимости от задачи. Роль определяет какие файлы читать и что создавать.
| Роль агента | Задача | Читает | Создаёт / изменяет |
|---|---|---|---|
| Implementer | Реализация фичи по спеку | § Platform, § Domain Rules | Код, обновляет implementation.status |
| Spec Writer | Создание / дополнение атомов | domain.spec.md, соседние атомы | Новые .spec.md в _draft/ |
| Test Writer | Написание тестов | § Acceptance Criteria, § Platform Tests | Тест-файлы, обновляет verification.status |
| Reviewer | Ревью PR с изменением спека | Весь затронутый поддомен | Комментарии, OQ в атомах при нахождении проблем |
_draft/ и предложить закрыть OQ, но перенести файл в корень (верифицировать) — только человек через PR.
Готовый промпт для вставки в system prompt или .cursorrules / AGENTS.md. Содержит все нюансы методологии в компактной форме.
PAY-REF-012_refund-after-sbp.spec.md в _draft/ с двумя открытыми вопросами:PAY-INI-030a~param_sbp-qr-ttl.spec.md: was=15, becomes=10, conflict.status=sprint-locked.| Антипаттерн | Как выглядит | Правильно |
|---|---|---|
| Тихое расширение | Агент добавляет поля в API response которых нет в спеке «для удобства» | Создать OQ или PlatformChange amendment |
| Самоверификация | Агент создаёт атом и сам же переносит его из _draft/ в корень | Только PR + апрув человека = верификация |
| Молчаливый deprecated | Агент видит что атом устарел и удаляет его «чтобы не мусорить» | Переместить в _deprecated/ с причиной |
| Scope creep | Агент добавляет функциональность в атом потому что «логично тут» | Новая функциональность = новый атом |
| DR override | Агент меняет бизнес-правило в атоме потому что «так лучше технически» | Создать RuleChange amendment с обоснованием |
| Draft bypass | Агент сразу пишет код для фичи которая ещё в _draft/ | Сначала закрыть OQ → верификация → потом код |
Atomic Spec — не просто документация. Для AI-агентов это машиночитаемый контракт: что делать, что нельзя делать, что неизвестно. Агенты не интерпретируют требования — они исполняют их. Это радикально снижает риск галлюцинаций и отклонений от намерения команды.
Ключевое свойство: атом явно разделяет знание и незнание. Если информации нет в атоме — агент не предполагает, он создаёт Open Question и останавливается. Это единственный безопасный способ работы агентов с требованиями.
| Без Atomic Spec | С Atomic Spec |
|---|---|
| Агент получает текст задачи в свободной форме → интерпретирует → делает что-то похожее на нужное | Агент читает атом → следует § Domain Rules → реализует § Platform Contract → запускает § Platform Tests |
| Непонятное требование → агент додумывает | Непонятное требование → агент создаёт OQ → стоп |
| Изменение требования → агент не знает | Изменение требования → amendment файл → агент видит при чтении |
| Граница между доменами → агент угадывает | emits/consumes в frontmatter → граница явная |
Архитектура мультиагентной системы на основе Atomic Spec строится из трёх специализированных агентов, координируемых оркестратором:
Работает со спецификацией. Создаёт и обновляет атомы. Закрывает Open Questions. Классифицирует изменения.
Читает готовые атомы. Реализует платформенный контракт. Обновляет implementation.status. Пишет тесты с @spec.
Читает diff между релизами. Запускает тесты. Сверяет поведение с § Acceptance Criteria. Обновляет verification.status.
Оркестратор не пишет код и не создаёт атомы напрямую. Его работа — управлять потоком: определить какой агент нужен, передать правильный контекст, получить результат, проверить что можно двигаться дальше.
Каждый агент знает три состояния: работаю / стоп-блокер / стоп-эскалация.
| Ситуация | Агент | Действие | Кому сигнал |
|---|---|---|---|
Атом в _draft/ | Разработчик | СТОП | Оркестратор → аналитик |
| Открытый OQ найден | Аналитик | СТОП + зафиксировать OQ | Оркестратор → человек |
| Неоднозначный контракт | Разработчик | СТОП + OQ в атом | Оркестратор → аналитик |
| ModelChange обнаружен | Аналитик | СТОП + создать ~model файл | Оркестратор → человек (архитектор) |
| BoundaryChange | Любой | СТОП немедленно | Оркестратор → CTO + архитектор |
| Verification: failed | Тестировщик | СТОП релиза + отчёт | Оркестратор → разработчик |
| DR противоречат друг другу | Разработчик | СТОП + OQ в оба атома | Оркестратор → аналитик |
| Amendment sprint-locked | Оркестратор | Решить: изъять или следующий PR | Человек (PM) |
Каждая передача задачи — структурированное сообщение. Агент не получает «задачу текстом», он получает пакет контекста:
Скопируйте содержимое в файл SKILL.md в корне репозитория или передайте как системный промпт агенту-оркестратору. Файл спроектирован как самодостаточная инструкция — агент прочитает его один раз и будет работать по методологии.
SKILL.md в корне репозитория. В промпте агента: «Прочитай SKILL.md и следуй этой методологии для всех задач со specs/». Для Claude Code: добавьте в CLAUDE.md. Для Cursor: в .cursorrules. Для Copilot: в системный промпт workspace.
Atomic Spec даёт агенту структуру для управления тремя подагентами — аналитиком, разработчиком и тестировщиком — без потери контекста и без самодеятельности.
Агент-оркестратор — это главный агент который получает задачу от человека и управляет тремя специализированными подагентами. Каждый подагент работает строго в своей зоне ответственности. Оркестратор никогда не делает работу подагентов сам.
| Подагент | Читает | Пишет | Не делает никогда |
|---|---|---|---|
| Аналитик | domain.spec.md, существующие атомы, git log | Новые .spec.md в _draft/, OQ, Decision Log | Код, тесты, изменение implementation.status |
| Разработчик | Атом + domain + children + см. see-also | Код, implementation.status в frontmatter | Создание/изменение атомов, принятие бизнес-решений |
| Тестировщик | § Acceptance Criteria, § Platform Tests, git diff | Тест-файлы, verification.status в frontmatter | Изменение требований, код приложения |
Оркестратор передаёт контекст явно — JSON-объектом. Подагент не должен самостоятельно искать что ему нужно (кроме чтения файлов по переданным путям).
| Ситуация | Оркестратор решает сам | Эскалирует человеку |
|---|---|---|
| OQ с blocking: false | Продолжает, фиксирует для следующей итерации | — |
| OQ с blocking: true | — | Да — формулирует варианты чётко |
| Тесты упали | Передаёт разработчику точный diff | После 2 итераций без прогресса |
| Нужна ModelChange | — | Да — ModelChange только люди принимают |
| Нужен новый домен | — | Да — BoundaryChange RFC |
| Конфликт правки со спринтом | Создаёт amendment, предлагает два варианта | Если sprint-locked — решение за человеком |
| Аналог уже реализован | Указывает разработчику файл-образец | — |
Оркестратор ведёт состояние сессии — текущий статус всех задач в спринте. Это позволяет возобновить работу после прерывания.
SKILL.md — файл который агент (Claude Code, Cursor, Copilot Workspace) читает перед началом работы с репозиторием. Он описывает: что за методология используется, как агент должен себя вести, какие роли существуют и как передавать между ними управление.
Файл написан в машиночитаемом формате с явными разделами. Каждый раздел адресован конкретному режиму работы агента.
SKILL.md в корне репозитория. Заполните раздел «9. Контекст проекта» под ваш стек и команду. При каждом запуске агент прочитает файл и будет работать по методологии без дополнительных инструкций.
| Признак правильной работы | Признак проблемы |
|---|---|
Агент создаёт атом в _draft/ перед кодом | Агент сразу пишет код без атома |
| При неопределённости: OQ + стоп | Агент «угадывает» поведение |
| Три отдельных коммита: spec / impl / tests | Всё в одном коммите |
Каждый тест имеет // @spec ATOM-ID | Тесты без трассировки |
| При конфликте: создаёт amendment + эскалация | Тихо меняет требование в атоме |
| JSON-вывод между подагентами | Неструктурированный текст |