AI-Native Delivery
SDD на OpenSpec
Регламент, справочник инструментов и план миграции — в одной навигации. Выберите роль в шапке справа, чтобы увидеть, что читать именно вам.
Как это работает — от инициативы до архивации
01
Регламент
Роли · Флоу · Требования · Контроль
02
Справочник
Инструменты · Пример change · Команды
03
План миграции
Фазы · Go/No-Go · Риски
Часто нужно
AI-NATIVE-SDD-REGULATION.MD
AI-Native Delivery — Регламент
Разработка через Spec-Driven Development на OpenSpec
Документ разбит на три файла. Этот — постоянный регламент (Части 0–7): роли, флоу, формат требований, контроль качества. Отдельно — План миграции и Инструменты и справочник.
Часть 0Коротко о подходе
0.1Суть подхода
Мы переводим разработку на модель, в которой спецификация — это исполняемое задание, а не сопроводительный документ. Требования пишутся в структурированном машиночитаемом формате, хранятся в git (в отдельном спек-репозитории, подключённом к кодовому — §5.6), проходят ревью так же, как код, и служат единственным входом для AI-агента, который пишет реализацию.
Формат и жизненный цикл задаёт OpenSpec — open-source CLI (MIT). Сам он код не пишет и агентом не является: он устанавливает в репозиторий набор слэш-команд и навыков для Claude Code (/opsx:propose, /opsx:apply и т. д.), которые ведут агента по стадиям «предложение → спецификация → реализация → архивация». Работает всё это внутри Claude Code — OpenSpec лишь задаёт структуру задания, которую агент выполняет.
0.2Как это работает
Стейкхолдеры формулируют потребность → аналитик описывает её как спецификацию → техлид утверждает спецификацию (Гейт 1) → разработчик реализует её в коде вместе с агентом, отвечая за структуру решения и качество результата → техлид проверяет код (Гейт 2) → QA принимает результат по тем же сценариям, что описаны в спецификации.
Два гейта — единственные места, где процесс может быть остановлен. Гейт 1 — точка управления процессом. Ни одна строка кода не пишется, пока спецификация не утверждена. Расхождение между тем, что задумано, и тем, что реализовано, обнаруживается здесь — до того как написана хоть одна строка кода. Исправление на этом этапе стоит правки абзаца; исправление после того, как код уже написан и прошёл ревью, обходится заметно дороже — вплоть до переписывания модуля в худшем случае.
Полная детализация каждого этапа — Часть 3; полная матрица ролей — Часть 2.
Определяющие свойства процесса:
| Носитель требований | Markdown-файл в спек-репозитории, подключённом к коду |
| Формат требований | Requirement + Scenario (WHEN/THEN), проверяемый валидатором |
| Кто первым видит несоответствие | Ревьюер спецификации, до начала разработки |
| Вход для AI-агента | Утверждённая спецификация |
| Точка управления | Одна: гейт утверждения спецификации |
| Критерий «готово» | Каждый сценарий спецификации покрыт проверкой |
| Что остаётся после фичи | Код и основная спецификация, актуальные на момент мержа |
0.3Кто за что отвечает
| Роль | Отвечает за | Ключевая точка в процессе |
|---|---|---|
| Проектный менеджер | Приоритет, границы и сроки фичи — по запросу стейкхолдеров | Инициация, приёмка результата |
| Аналитик | Полноту и однозначность требований | Автор спецификации |
| Техлид | Архитектурные решения, планку качества, гейты | Гейт 1 и Гейт 2 |
| Разработчик | Инженерную реализацию: структуру решения, качество кода, тесты | Гейт 2 (проверяется) |
| QA | Приёмку по сценариям спецификации | Приёмка |
За каждый шаг флоу отвечает ровно один человек — роли не пересекаются. Полная матрица ответственности (RACI) по всем 15 шагам флоу — §2.2; подробное описание каждой роли — §2.3.
0.4Что это даёт и какие есть риски
Что это даёт. Инженерно — ошибка «требования ↔ реализация» ловится на ревью спецификации, а не в готовом коде. Экономически — эффект двойной: агент пишет код быстрее человека, и это сокращает время самой реализации; вдобавок расхождение дешевле поймать на спецификации, чем чинить в уже написанном коде, — это сокращает переделки. Управленчески — вместо того, чтобы контроль был размазан по каждому этапу, есть один явный момент, где можно остановить или скорректировать фичу до того, как в неё вложено время разработки, — Гейт 1, с одним явным ответственным (техлидом). Организационно — основная спецификация (openspec/specs/) обновляется в момент, когда код попадает в прод: архивация (§3.7) выполняется сразу при мерже PR с кодом, поэтому между «код задеплоен» и «спецификация актуальна» нет паузы, в которую обновление можно забыть.
Риски и ограничения. Главный риск — избыточная спецификация: превращение процесса в водопад, где на однострочное изменение пишется десять страниц. Это основная задокументированная критика SDD. Закрывается правилом применимости (§1.3) и облегчёнными треками (§3.8): спецификация пишется тогда и только тогда, когда меняется внешне наблюдаемое поведение системы.
Второй риск — ёмкость ревью: агент производит код быстрее, чем человек его читает. Подход не решает эту проблему сам по себе; её решают автоматические гейты, риск-тиринг и лимит размера PR (Часть 7).
0.5Что требуется для запуска
| Ресурс | Что нужно |
|---|---|
| Подготовка репозитория | Инженерное время, зависящее от текущего состояния репозитория — см. чеклист готовности (§5.7) |
| Лицензии на инструменты | По существующей подписке на Claude Code; OpenSpec бесплатен (MIT) |
| Пилот | 1 фича, полный состав ролей (Часть 2); 2 недели |
| Полный переход команды | 6 недель с момента старта пилота |
0.6Как мигрируем
| Фаза | Срок | Содержание | Критерий перехода |
|---|---|---|---|
| 0. Подготовка | Неделя 1 | Репозиторий приводится к уровню «готов к агентам»: одна команда установки, одна команда проверки, инструкции для агентов, установка OpenSpec | Чеклист §5.7 пройден на ≥ 80 % |
| 1. Пилот | Недели 2–3 | Одна фича среднего размера проходит полный флоу | Фича в проде; спецификация не расходится с реализацией; ретро проведено |
| 2. Команда | Недели 4–7 | Все новые фичи одного проекта идут через флоу. Старые задачи доигрываются по-прежнему | ≥ 80 % новых изменений имеют утверждённую спецификацию до начала работы |
Подробный план с ролями, рисками и точками Go/No-Go — План миграции.
0.7Быстрый старт: чек-лист на первую фичу
Аналитик
Техлид
Разработчик
QA
Часть 1Принципы
1.1Принцип
Спецификация — единственный источник истины о требуемом поведении системы. Она хранится в репозитории, версионируется вместе с кодом, изменяется тем же pull request'ом и служит прямым входом для реализации.
Из принципа следуют четыре правила, которые определяют всё остальное в этом документе:
- Правило локальности. Спецификация физически присутствует в рабочем дереве, которое читает агент, — кодовый репозиторий подключает её как git submodule на пути
openspec/(§5.6). Агент по-прежнему работает с одним рабочим деревом, а не переключается между носителями; разделены только права доступа людей — аналитик работает в отдельном спек-репозитории, разработчик и агент видят оба. - Правило буквальности. Требование записывается так, чтобы из него однозначно следовала проверка. Если из требования нельзя вывести тест, это не требование, а намерение.
- Правило дельты. Мы не документируем всю систему. Спецификация пишется только на то, что меняется. Полная картина накапливается сама, по мере изменений.
- Правило синхронности. Основная спецификация (
openspec/specs/) обновляется в момент, когда код попадает в основную ветку: архивация (§3.7) выполняется сразу при мерже PR с кодом — автоматически в CI либо ручной командой сразу после мержа, до перехода к следующей задаче. Между «код в проде» и «спецификация актуальна» нет паузы, в которую обновление можно забыть.
1.2Что такое OpenSpec и чем он не является
OpenSpec — open-source инструмент для spec-driven development (лицензия MIT, npm-пакет @fission-ai/openspec). Состоит из двух половин:
- CLI — команда
openspec, которую запускают в терминале. Создаёт структуру, валидирует артефакты, применяет изменения к основным спецификациям, архивирует завершённое. - Набор навыков и слэш-команд для Claude Code (
/opsx:propose,/opsx:applyи т. д.). Устанавливается в репозиторий командойopenspec init.
Чем OpenSpec не является:
| Не является | Пояснение |
|---|---|
| Заменой трекера задач | Не управляет приоритетами, сроками, загрузкой. Jira остаётся |
| Заменой Confluence для бизнес-документации | Продуктовые решения, аналитика рынка, регламенты остаются там |
| Git-инструментом | Не создаёт ветки, не коммитит, не пушит. Работа с git — обычная |
| Генератором кода | Код пишет AI-агент. OpenSpec задаёт формат задания и жизненный цикл |
| Обязательным условием подхода | Подход работает и без него; OpenSpec задаёт дисциплину и снимает ручную работу |
Риск привязки — низкий. Артефакты OpenSpec — обычные Markdown-файлы в вашем репозитории. При отказе от инструмента остаются все спецификации; теряются только слэш-команды и автоматика слияния дельт в основные спецификации.
1.3Границы применимости: когда спецификация нужна, а когда нет
Это самое важное правило документа. Его нарушение — главный способ провалить внедрение.
Спецификация пишется тогда и только тогда, когда меняется внешне наблюдаемое поведение системы.
Внешне наблюдаемое поведение — это то, на что полагается пользователь, мерчант, смежный сервис или интеграция: контракты API, коды ошибок, переходы состояний, формат событий и вебхуков, правила расчёта, ограничения доступа, гарантии производительности и безопасности.
| Тип работы | Спецификация | Обоснование |
|---|---|---|
| Новая функциональность | Да, полная | Появляется новое поведение |
| Изменение контракта API или события | Да, полная | Меняется то, на что полагаются потребители |
| Изменение бизнес-правила или расчёта | Да, полная | Меняется наблюдаемый результат |
| Багфикс, где поведение расходится со спецификацией | Нет | Спецификация уже верна; чинится код |
| Багфикс, где спецификация была неверна или молчала | Да, дельта на 1 требование | Уточняется контракт |
| Рефакторинг без изменения поведения | Нет | Помечается skip_specs: true |
| Инфраструктура, CI, зависимости, документация | Нет | Помечается skip_specs: true |
| Изменение, описываемое одним предложением | Нет | Стоимость спецификации выше пользы |
| Исследование, spike | Нет | Результат — решение, а не поведение |
Проверочный вопрос перед тем, как заводить change: «Может ли реализация полностью измениться без изменения того, что видит потребитель?» Если да — это деталь реализации, ей не место в спецификации.
Симптомы избыточной спецификации (требуют немедленной остановки и пересмотра):
- Спецификация на изменение длиннее, чем сам diff.
- В требованиях фигурируют имена классов, функций, библиотек.
- На однострочное изменение заведено несколько требований.
- Ревьюер говорит «мне проще прочитать код, чем это».
Часть 2Роли и зоны ответственности
2.1Состав ролей
| Роль | Отвечает за | Ключевой артефакт |
|---|---|---|
| Проектный менеджер (ПМ) | Приоритет, границы и сроки фичи; приёмка результата | Инициатива, критерии успеха |
| Аналитик | Полноту и однозначность требований; автор спецификации | proposal.md, specs/**/spec.md |
| Техлид | Архитектурные решения, планку качества, гейты | Решение по Гейту 1 и Гейту 2; design.md, когда он нужен (§2.3) |
| Разработчик | Инженерную реализацию: структуру решения, качество кода, проверяемость | Код, тесты, tasks.md |
| QA | Приёмочную проверку по сценариям спецификации | Результат приёмки |
Потребность и ценность фичи формулируют стейкхолдеры — бизнес-заказчики (владелец продукта или направления, руководитель подразделения, внешний партнёр). Они не входят в ежедневный флоу и не участвуют в RACI ниже: ПМ формализует их запрос в инициативу (§3.2) и держит с ними связь до приёмки результата.
Над операционными ролями этой таблицы стоит CTO — руководитель инженерной организации компании. Он не входит в RACI одной фичи (Части 2–3 описывают процесс на уровне одной команды и одного репозитория) и не участвует в повседневном флоу. Его роль — точка эскалации и решения, когда вопрос выходит за пределы одной команды или одного репозитория: конфликт между техлидом и аналитиком/ПМ о необходимости спецификации (§7.9), владение разворачиванием подхода за пределы пилотного проекта (план миграции, §4), решения Go/No-Go о переходе между фазами (план миграции, §5).
Платформенную инфраструктуру — CI-платформу, SAST-сканирование, dependency-ботов, настройки репозитория на GitHub (branch protection, CODEOWNERS) — ведёт DevOps. Это внешняя по отношению к флоу фичи функция: DevOps не входит в RACI ниже и обслуживает инфраструктуру централизованно для всех репозиториев, а не в рамках отдельной фичи (инструменты — справочник, §1).
2.2Матрица ответственности (RACI)
| # | Этап флоу | ПМ | Аналитик | Техлид | Разработчик | QA |
|---|---|---|---|---|---|---|
| 0 | Инициация: зафиксировать потребность и ценность | A/R | C | C | I | I |
| 1 | Explore: разобрать задачу, изучить систему, снять неопределённость | C | A/R | R | R | C |
| 2 | Решение о необходимости спецификации (§1.3) | C | R | A | I | I |
| 3 | Написание proposal.md (зачем, что меняется, охват) | C | A/R | C | I | I |
| 4 | Написание specs/**/spec.md (требования и сценарии) | C | A/R | C | I | C |
| 5 | Написание design.md — только для архитектурных изменений (§2.3) | I | C | A/R | C | I |
| 6 | Написание tasks.md (декомпозиция работ) | I | I | C | A/R | I |
| 7 | ГЕЙТ 1: утверждение спецификации | C | R | A | I | C |
| 8 | Реализация по спецификации: технические решения на уровне кода | I | I | C | A/R | I |
| 9 | Самопроверка перед PR (тесты, гейты, соответствие сценариям) | I | I | I | A/R | I |
| 10 | Автоматические проверки CI | I | I | A | R | I |
| 11 | ГЕЙТ 2: ревью кода | I | C | A/R | C | I |
| 12 | Приёмка по сценариям спецификации | C | C | I | I | A/R |
| 13 | Слияние дельты в основные спецификации и архивация | I | R | A | R | I |
| 14 | Релиз и уведомление стейкхолдеров | A/R | I | C | I | I |
Правила чтения матрицы:
- В каждой строке ровно один A. Если непонятно, кто останавливает процесс, — смотрите, у кого A.
- R без A означает: делает руками, но за результат отвечает другой.
- C обязателен до принятия решения. Пропустить C — процессное нарушение, а не ускорение.
2.3Что делает каждая роль
Проектный менеджер
Отвечает: формализует потребность стейкхолдеров в инициативу, держит приоритет, границы и сроки, принимает результат.
Делает:
- Забирает у стейкхолдеров проблему, ожидаемый эффект и ограничения по срокам и бюджету и формулирует инициативу.
- Определяет границы: что входит в фичу и что явно не входит.
- Участвует в Гейте 1 как Consulted — подтверждает, что спецификация описывает ту фичу, которую заказали стейкхолдеры.
- Принимает результат по бизнес-критериям и уведомляет стейкхолдеров.
Не делает: не пишет требования уровня сценариев, не принимает технические решения, не согласовывает архитектуру.
Точка отказа ПМ: инициатива без измеримого критерия успеха. Такая инициатива не переходит на этап 1.
Аналитик
Отвечает: за то, что требования полны, однозначны и проверяемы. Это центральная роль нового процесса.
Делает:
- Ведёт discovery с бизнесом и с техлидом.
- Изучает существующие спецификации в
openspec/specs/, чтобы не противоречить действующим требованиям. - Пишет
proposal.md: почему, что меняется, какие способности (capabilities) затрагиваются, на что это влияет. - Пишет
specs/**/spec.md: требования и сценарии в формате §4.2. - Прогоняет
openspec validate <change> --strictдо нуля ошибок и предупреждений. - Заводит PR со спецификацией и проводит его через Гейт 1.
- После реализации подтверждает, что дельта корректно слита в основные спецификации.
Не делает: не выбирает технологии, не проектирует внутреннюю структуру кода, не оценивает трудоёмкость реализации.
Техлид
Отвечает: за архитектурные решения и за планку, через которую проходит всё, что попадает в кодовую базу. Владелец обоих гейтов.
Техлид не диктует детали реализации и не переписывает решения разработчика построчно — его инструменты влияния: утверждение спецификации (Гейт 1), архитектурные ограничения (design.md, когда он нужен) и ревью на Гейте 2 (§7.3). Всё, что не относится к архитектуре, — зона ответственности разработчика.
Делает:
- Участвует в explore: приносит ограничения системы, показывает существующие решения, отсекает нереализуемое.
- Принимает решение о необходимости спецификации (§1.3) и об уровне риска изменения (§7.4).
- Пишет
design.mdтолько когда изменение сквозное, затрагивает архитектуру, вводит новую зависимость, меняет модель данных или несёт риски безопасности/производительности/миграции. Для большинства измененийdesign.mdне нужен вовсе — технические решения на уровне кода разработчик принимает сам. - Проводит Гейт 1 — единственная точка, где процесс поставки требований управляем (§7.2).
- Проектирует автоматические гейты: какие проверки должны быть зелёными, чтобы PR был вообще пригоден к чтению человеком.
- Проводит Гейт 2 — ревью кода с глубиной, определяемой риск-тиром (§7.3, §7.4).
- Владеет
CLAUDE.mdи политикой изменения его правил.
Не делает: не принимает решения, которые по своей природе принадлежат разработчику (структура функции, выбор внутреннего паттерна в рамках конвенций). При росте объёма его работа смещается от построчного чтения к проектированию проверок и выборочному контролю (§7.7).
Разработчик
Отвечает: за инженерную реализацию — за то, что она соответствует спецификации, технически обоснована и доказана проверками. Это его инженерная зона ответственности: он ведёт агента, отвечает за структуру решения, качество кода и прохождение ревью, а не просто отправляет запрос и проверяет результат.
Делает:
- Читает
proposal.md,specs/,design.md(если он есть) до начала работы. Полностью, а не по диагонали. - Самостоятельно принимает все технические решения на уровне реализации: структуру кода, разбиение на функции и модули, выбор паттернов в рамках существующих конвенций и (если есть) ограничений
design.md. Это его решения, а не техлида. - Уточняет
tasks.md: разбивает работу так, чтобы каждая задача имела явный способ проверки. - Ведёт реализацию с агентом по циклу §6.2 — направляет, проверяет промежуточные результаты, останавливает и перезапускает при отклонении от намеченного решения.
- Пишет тесты, покрывающие каждый сценарий спецификации, с явной привязкой имени теста к имени сценария.
- Прогоняет полный набор локальных проверок до открытия PR.
- Останавливается и формулирует конкретный вопрос, если спецификация неполна, противоречива или расходится с реальностью системы. Не додумывает.
Не делает: не расширяет объём молча, не «улучшает» поведение сверх спецификации, не пишет код по устному согласованию в обход спецификации.
Разработчик не переводит требования в промпт вручную — этот шаг выполняет спецификация. Его вклад — инженерные решения, декомпозиция, проверяемость и контроль качества результата агента.
QA
Отвечает: за приёмку по сценариям.
Делает:
- Участвует в ревью спецификации как Consulted: проверяет, что каждый сценарий приёмопригоден и что покрыты негативные пути.
- Проводит приёмку строго по списку сценариев спецификации.
- Заводит дефект с явной ссылкой на нарушенный сценарий (
capability/Requirement/Scenario).
Не делает: не изобретает критерии приёмки в момент тестирования. Если критерия нет в спецификации, это дефект спецификации, а не кода.
2.4Где находится точка управления
Точка управления процессом поставки требований — Гейт 1 (утверждение спецификации). Одна точка, один ответственный (техлид), один явный артефакт (PR со спецификацией), одно бинарное решение (утверждено / возвращено).
Всё, что находится до Гейта 1, — управляемо и дёшево в изменении. Всё, что после, — дорого. Поэтому весь управленческий вес процесса сосредоточен здесь, а не в ревью кода.
Техлид управляет результатом четырьмя рычагами, применяемыми именно в этом порядке:
| # | Рычаг | Что регулирует | Где описан |
|---|---|---|---|
| 1 | Планка спецификации | Что вообще допускается к реализации | §7.2 |
| 2 | Автоматические гейты | Что допускается к чтению человеком | §7.6 |
| 3 | Риск-тиринг ревью | Куда тратится дефицитное внимание | §7.4 |
| 4 | Правила агентной работы | Как агент ведёт себя в репозитории по умолчанию | §5.3, §7.8 |
Рычаги 1 и 2 — превентивные и масштабируемые: их стоимость не растёт с объёмом кода. Рычаг 3 — способ удержать постоянную стоимость контроля при растущем объёме кода (детально — §7.7). Рычаг 4 — снижение вероятности проблемы до её появления.
Если результат подхода расходится с ожиданиями не разово, а систематически — это уже не вопрос одного гейта, а вопрос эскалации (§7.9) и, на масштабе всей миграции, критериев Go/No-Go (план миграции, §5).
Часть 3Сквозной флоу фичи
3.1Карта этапов
| Этап | Название | Ответственный (A) | Вход | Выход | Артефакт в git |
|---|---|---|---|---|---|
| 0 | Инициация | ПМ | Потребность бизнеса | Инициатива с критерием успеха | — (Jira) |
| 1 | Explore | Аналитик | Инициатива | Понимание задачи и системы | — (обсуждение) |
| 2 | Спецификация | Аналитик | Результат explore | Утверждаемый набор артефактов | openspec/changes/<name>/ |
| 3 | ГЕЙТ 1 | Техлид | PR со спецификацией | Утверждено / возвращено | Merge PR спецификации |
| 4 | Реализация | Разработчик | Утверждённая спецификация | Код + тесты | Ветка реализации |
| 5 | ГЕЙТ 2 | Техлид | PR с кодом | Утверждено / возвращено | Merge PR кода |
| 6 | Приёмка и архивация | QA / Техлид | Код в среде | Принято, спецификация обновлена | openspec/specs/, changes/archive/ |
3.2Этап 0 — Инициация
Кто: ПМ (A/R), Стейкхолдеры (C).
Стейкхолдеры формулируют потребность; ПМ формализует её в инициативу и заводит задачу в Jira. Обязательный минимум:
- Проблема: что не работает или чего не хватает, у кого.
- Ожидаемый эффект: что изменится и как это будет видно.
- Границы: что явно не входит в эту работу.
- Срочность и её обоснование.
Выход этапа: задача в Jira в статусе, допускающем разбор. Задача без измеримого критерия успеха на разбор не берётся.
3.3Этап 1 — Explore (разбор)
Кто: Аналитик (A/R), Техлид (R), Разработчик (R), ПМ и QA (C).
Цель — снять неопределённость до того, как что-то будет написано. Explore идёт в двух отдельных сессиях с Claude Code: аналитик — в спек-репозитории, читает действующие спецификации и отвечает на вопросы про требования; техлид или разработчик — в кодовом репозитории, читает код, тесты и конфигурацию и отвечает на вопросы про систему. Аналитик не имеет доступа к коду (справочник, §2), поэтому факты о коде ему приносит техлид или разработчик, а не наоборот.
/opsx:explore
Режим explore не пишет код и не создаёт артефакты без явного подтверждения — это исследовательская стадия.
Что должно быть выяснено к концу этапа:
| Вопрос | Кто отвечает |
|---|---|
| Какое поведение системы меняется с точки зрения потребителя? | Аналитик |
| Какие действующие спецификации затрагиваются? | Аналитик + агент |
| Какие ограничения системы делают часть вариантов невозможными? | Техлид |
| Есть ли уже похожее решение в кодовой базе? | Техлид/разработчик + агент |
| Что происходит на негативных путях и границах? | Аналитик + QA |
Требуется ли design.md? | Техлид |
| Требуется ли вообще спецификация (§1.3)? | Техлид |
Выход этапа: согласованное понимание объёма и решение техлида о том, нужна ли спецификация и нужен ли design.md.
Типовая длительность: от 30 минут до половины дня. Если разбор занимает больше дня, фича слишком большая — её нужно разделить.
3.4Этап 2 — Спецификация
Кто: Аналитик (A/R) — proposal.md и specs/; Техлид (A/R) — design.md, когда он нужен (§2.3); tasks.md — Разработчик (A/R), Техлид (C).
Аналитик работает в спек-репозитории (не в кодовом — справочник, §2): создаёт change и наполняет артефакты, работая с агентом.
/opsx:propose "автоматический ретрай выплат при временной ошибке провайдера"
Команда создаёт директорию изменения и последовательно строит артефакты в порядке зависимостей. Итоговая структура:
openspec/changes/add-payout-retry/
├── .openspec.yaml # метаданные этого изменения: используемая схема, дата создания
├── proposal.md # зачем, что меняется, какие capabilities, на что влияет
├── specs/
│ └── payout-retry/
│ └── spec.md # ДЕЛЬТА: только то, что добавляется/меняется/удаляется
├── design.md # техническое решение (условный артефакт)
└── tasks.md # чеклист реализации
Важно: файлы в changes/<name>/specs/ — это дельта, а не полная спецификация способности. Полные спецификации живут в openspec/specs/ и обновляются автоматически при архивации.
Порядок работы аналитика:
- Прочитать действующие спецификации затрагиваемых способностей.
- Заполнить
proposal.md, в том числе раздел## Capabilities— он определяет, какие файлы спецификаций будут созданы или изменены. - Написать дельты требований в
specs/<capability>/spec.mdпо формату §4.2. - Прогнать валидацию до нуля замечаний:
openspec validate add-payout-retry --strict - Передать техлиду для
design.md, если он требуется (§2.3). - Согласовать с разработчиком черновую декомпозицию
tasks.md— детали разработчик уточняет сам перед стартом реализации (§6.2).
Выход этапа: pull request в спек-репозитории, содержащий только директорию changes/<name>/. Без кода.
Почему спецификация идёт отдельным PR: это делает утверждение требований явным событием с датой, автором и обсуждением, отделяет спор о требованиях от спора о реализации и позволяет начать реализацию с зафиксированной базы.
3.5Этап 3 — ГЕЙТ 1: ревью спецификации
Кто: Техлид (A), Аналитик (R), ПМ и QA (C).
Это главная контрольная точка процесса. Подробный чеклист — §7.2.
| Исход | Действие |
|---|---|
| Утверждено | PR со спецификацией мержится. Разработка может начинаться |
| Возвращено с замечаниями | Аналитик дорабатывает. Повторное ревью |
| Отклонено | Изменение не проходит по §1.3 или по технической невозможности. Возврат на этап 1 |
| Разделено | Изменение слишком велико. Разбивается на несколько change |
Норматив: ревью спецификации проводится в течение одного рабочего дня с момента открытия PR. Спецификация, ожидающая ревью дольше, — организационный дефект, который эскалируется ПМ.
3.6Этап 4 — Реализация
Кто: Разработчик (A/R), Техлид (C).
Реализация ведётся строго по утверждённой спецификации:
/opsx:apply add-payout-retry
Агент читает все артефакты изменения, идёт по задачам tasks.md, отмечает выполненные и останавливается при неясности или расхождении. Детальный порядок работы разработчика — Часть 6.
Жёсткое правило: если в ходе реализации выясняется, что спецификация неверна, неполна или противоречит устройству системы, — работа останавливается, спецификация правится, изменение проходит сокращённое повторное ревью. Реализация «как правильнее» в обход спецификации запрещена: она возвращает нас ровно к той проблеме, ради которой вводится процесс.
Для правки артефактов уже существующего изменения:
/opsx:update add-payout-retry
Выход этапа: pull request с кодом, тестами и отмеченными задачами в tasks.md.
3.7Этап 5 — ГЕЙТ 2 и этап 6 — приёмка
Гейт 2 (Техлид, A/R) — ревью кода. Глубина определяется риск-тиром изменения (§7.4), содержание — чеклистом §7.3. Обязательное предусловие: все автоматические проверки зелёные (§7.6). PR с красным CI на человеческое ревью не выносится.
Приёмка (QA, A/R) — проверка строго по списку сценариев спецификации. Дефект оформляется со ссылкой на нарушенный сценарий.
Архивация (Техлид A, Аналитик и Разработчик R) — сразу после мержа кода, до перехода к следующей задаче:
/opsx:archive add-payout-retry
При архивации дельты сливаются в основные спецификации specs/<capability>/spec.md, а директория изменения переносится в changes/archive/YYYY-MM-DD-<name>/. С этого момента основная спецификация отражает актуальное поведение системы.
Как это ложится на git (спек-репозиторий и кодовый репозиторий разделены, §5.6): у фичи два PR и один служебный коммит. PR №1 — только спецификация, открывается и мержится в спек-репозитории, проходит Гейт 1. Разработчик обновляет указатель submodule в кодовом репозитории на этот коммит и открывает PR №2 — код (плюс обновлённый указатель), в кодовом репозитории, проходит Гейт 2. Сразу после мержа PR №2 разработчик выполняет openspec archive в спек-репозитории (коммит туда, обычно без повторного Гейта — это техническая операция, а не новое требование) и следом обновляет указатель submodule в кодовом репозитории на архивный коммит. Порядок — не на усмотрение: без финального обновления указателя кодовый репозиторий продолжит ссылаться на неархивированную версию specs/, и openspec/specs/ в нём будет отставать от реального состояния.
Выход этапа: фича в продакшене; openspec/specs/ актуален; изменение в архиве.
3.8Облегчённые треки
Не всякая работа проходит полный флоу. Треки выбирает техлид на этапе 1.
| Трек | Когда | Что делается | Гейты |
|---|---|---|---|
| Полный | Новое поведение, изменение контракта, изменение бизнес-правила | Все артефакты | Гейт 1 + Гейт 2 |
| Дельта | Точечное изменение поведения существующей способности | Только proposal.md + дельта на 1–2 требования; design.md не пишется | Гейт 1 (сокращённый, до 30 минут) + Гейт 2 |
| Без спецификации | Рефакторинг, инфраструктура, зависимости, документация, багфикс, где спецификация уже верна | .openspec.yaml с skip_specs: true либо обычная задача без change | Только Гейт 2 |
| Инцидент | Продакшен-инцидент | Фикс идёт немедленно. Спецификация оформляется постфактум в течение 2 рабочих дней, если контракт изменился | Гейт 2 постфактум |
| Spike | Исследование без обязательства поставки | Результат — решение и, при необходимости, design.md. Код спайка не мержится | Обсуждение результата |
Правило одного предложения. Если изменение полностью описывается одним предложением и его diff читается за минуту — спецификация не пишется. Стоимость процесса не должна превышать стоимость работы.
3.9Связь с Jira и Confluence
Процесс не отменяет существующие инструменты, а разграничивает зоны.
| Система | Что в ней живёт | Что в ней НЕ живёт |
|---|---|---|
| Jira | Задачи, статусы, приоритеты, сроки, загрузка, связи, релизы | Требования |
| Confluence | Продуктовые решения, аналитика, регламенты, онбординг, протоколы решений, описание системы и интеграционная документация | Требования к поведению системы |
Репозиторий (openspec/) | Требования к поведению системы, техническое решение, декомпозиция | Приоритеты и сроки |
Правила связывания:
- Задача в Jira содержит ссылку на PR со спецификацией и на директорию изменения.
- Директория изменения именуется так, чтобы ключ задачи был восстановим: рекомендуется
<jira-key>-<kebab-name>, напримерPAY-1423-add-payout-retry. - Confluence-страница фичи, если она нужна бизнесу, ссылается на спецификацию, а не дублирует её. Дублирование требований запрещено: два источника истины гарантированно разойдутся.
Что делать с действующими Confluence-требованиями: ничего. Они не переносятся массово. При первом изменении затронутой части системы соответствующие требования появляются в openspec/specs/ как дельта, а страница Confluence помечается ссылкой на спецификацию. Полный перенос — антипаттерн: он дорог и создаёт спецификации на код, который никто не собирается менять.
Часть 4Требования: формат и стандарт качества
4.1Четыре артефакта и их назначение
| Артефакт | Отвечает на вопрос | Автор | Обязателен |
|---|---|---|---|
proposal.md | Зачем и что меняется на уровне охвата | Аналитик | Да |
specs/<capability>/spec.md | Что система должна делать (контракт поведения) | Аналитик | Да, кроме skip_specs |
design.md | Как это реализуется технически | Техлид | Условно |
tasks.md | В каком порядке и как проверить | Разработчик | Да |
Разделение жёсткое и не подлежит смешению:
- В
spec.mdне должно быть имён классов и функций, выбора библиотек, пошаговых инструкций реализации. - В
design.mdне должно быть мотивации (она вproposal.md) и требований (они вspec.md). - Проверочный вопрос для спецификации: если реализацию можно полностью заменить, не изменив того, что видит потребитель, — этому не место в спецификации.
4.2Формат требования
Дельта-спецификация состоит из блоков операций. Допустимы ровно четыре заголовка второго уровня:
| Заголовок | Назначение | Обязательные элементы |
|---|---|---|
ADDED ## ADDED Requirements | Новые требования | — |
MODIFIED ## MODIFIED Requirements | Изменение существующих | Полный текст требования целиком, включая все сохраняющиеся сценарии |
REMOVED ## REMOVED Requirements | Удаление | **Reason** и **Migration** |
RENAMED ## RENAMED Requirements | Только переименование | формат FROM: / TO: |
Структура требования:
Система SHALL <нормативная формулировка поведения>.
Жёсткие правила формата (проверяются валидатором):
- Сценарий — ровно четыре решётки (
####). Три решётки или маркированный список валидатор молча не засчитает как сценарий. - У каждого требования минимум один сценарий. Требование без сценария — ошибка валидации.
- Нормативные слова — SHALL / MUST, в теле требования, а не в заголовке. Слова «should», «may», «желательно» в требованиях не используются: они не проверяемы.
- Для новой способности дельта начинается с раздела
## Purposeдлиной не менее 50 символов. Для существующей способности## Purposeв дельте не пишется. - При
MODIFIEDтребование копируется целиком из основной спецификации и правится. Частичное копирование приводит к потере сценариев при архивации.
Совместимость с EARS. Формат совместим с нотацией EARS (Easy Approach to Requirements Syntax, Mavin, Wilkinson, Harwood, Novak, IEEE RE'09) — общепринятым способом писать однозначные требования. Соответствие шаблонов:
| Шаблон EARS | Как записывается у нас |
|---|---|
Ubiquitous: The <system> shall <response> | Требование без условий, сценарий описывает штатный путь |
Event-driven: WHEN <trigger> the <system> shall <response> | WHEN <trigger> / THEN <response> |
State-driven: WHILE <state> the <system> shall <response> | WHEN система находится в состоянии <state> и <trigger> |
Unwanted behaviour: IF <trigger> THEN the <system> shall <response> | Отдельный сценарий на негативный путь |
Optional feature: WHERE <feature> the <system> shall <response> | Отдельное требование с явным условием включения |
Специальный синтаксис EARS учить не нужно: достаточно писать сценарии в форме WHEN/THEN и следить, чтобы каждое требование имело чёткое условие и чёткий наблюдаемый результат.
4.3Контракты интерфейсов
Расхождение по интерфейсам — самый дорогой класс расхождений, потому что его последствия видны потребителям. Поэтому контракт фиксируется в спецификации явно.
Обязательно фиксируется в спецификации:
| Что | Как записывается |
|---|---|
| Публичный HTTP-эндпоинт | Метод, путь, обязательные поля запроса, коды успеха и ошибок |
| Формат ошибки | Ссылка на общий формат ошибок проекта + перечень кодов, специфичных для этого поведения |
| Событие или вебхук | Имя события, обязательные поля payload, условия и порядок отправки |
| Переходы состояний | Полный перечень допустимых переходов и условий, включая терминальные состояния |
| Идемпотентность | Ключ идемпотентности, окно действия, поведение при повторе с тем же и с другим payload |
| Обратная совместимость | Явное указание, является ли изменение ломающим (в proposal.md — пометка BREAKING) |
Не фиксируется в спецификации: внутренние DTO, структура таблиц, имена очередей, выбор библиотек, внутренние интерфейсы модулей. Это design.md.
Практика для API-контракта. Если в проекте есть машиночитаемая схема API (OpenAPI), спецификация ссылается на неё, а изменение схемы входит в тот же pull request. Схема — исполняемая часть контракта; спецификация — та часть, которую схема выразить не может: правила, инварианты, условия переходов.
4.4Нефункциональные требования
Нефункциональное требование записывается тем же способом, что и функциональное, но с измеримым порогом. Формулировки без числа не принимаются.
| Категория | Плохо | Хорошо |
|---|---|---|
| Производительность | «Должно работать быстро» | «Система SHALL возвращать ответ не медленнее 300 мс в 95-м перцентиле при нагрузке 100 rps» |
| Надёжность | «Не должно ломаться» | «При недоступности провайдера система SHALL вернуть 503 и не изменять состояние платежа» |
| Идемпотентность | «Не должно дублировать» | «При повторном запросе с тем же ключом идемпотентности система SHALL вернуть результат исходной операции и не создавать вторую» |
| Конкурентность | «Учесть гонки» | «При двух одновременных запросах на списание с одного баланса система SHALL исполнить ровно один и вернуть 409 на второй» |
| Наблюдаемость | «Добавить логи» | «При переходе платежа в FAILED система SHALL публиковать метрику с меткой причины отказа» |
| Безопасность | «Проверять права» | «Запрос без действительного API-ключа мерчанта система SHALL отклонять с 401 и не раскрывать существование ресурса» |
Общесистемные нефункциональные требования (единые для всех сервисов) выносятся в отдельную способность, например openspec/specs/platform-nfr/spec.md, и не повторяются в каждом изменении.
4.5Definition of Ready для спецификации
Спецификация выносится на Гейт 1 только при выполнении всех пунктов. Проверяет аналитик перед открытием PR. По-хорошему первые пункты (валидатор, наличие сценариев, отсутствие упоминаний реализации) стоит автоматизировать CI-проверкой на PR в спек-репозитории, а не держать на памяти аналитика — так же, как автоматические гейты в Части 7.
4.6Антипаттерны требований
| Антипаттерн | Пример | Почему это ломает реализацию |
|---|---|---|
| Неизмеримость | «Обработка должна быть быстрой» | Агент выберет произвольный порог; проверить нельзя |
| Подразумеваемый контекст | «Как в сервисе выплат» | Агент не знает, что именно имеется в виду; додумает |
| Предписание реализации | «Использовать Redis-очередь с TTL 60 с» | Это design.md. В спецификации связывает руки и устаревает |
| Молчание о негативе | Только успешный путь | Агент реализует happy path; ошибки обрабатываются как получится |
| Немой инвариант | Не сказано, что сумма не может быть отрицательной | Инвариант не будет проверен |
| Противоречие между разделами | В одном месте 3 попытки, в другом 5 | Агент выберет одно и не сообщит |
| Неограниченный охват | «И всё связанное» | Объём расползается, ревью невозможно |
| Смешение уровней | Бизнес-правило и структура таблицы в одном требовании | Спецификация устареет при первом рефакторинге |
| Синонимия | «платёж», «транзакция», «операция» об одном | Агент решит, что это разные сущности |
| Требование без субъекта | «Нужно валидировать» | Непонятно, кто, когда и что делает при провале |
Полный провалидированный пример всех четырёх артефактов на сквозной фиче — справочник, §4.
Часть 5Подготовка репозиториев
5.1Зачем это нужно
Подготовка кодовой базы — не опциональный шаг, а условие получения эффекта. Исследование DORA по AI-ассистированной разработке формулирует это так: AI является усилителем — он увеличивает и сильные, и слабые стороны организации. На здоровой кодовой базе с быстрой обратной связью агент даёт кратный выигрыш; на кодовой базе без надёжных проверок он с той же скоростью производит правдоподобный неверный код.
Практический смысл подготовки — дать агенту две вещи, которых у него нет по умолчанию:
- Проверку, которую он может запустить сам. Без неё единственный доступный агенту сигнал завершения — «выглядит готовым».
- Контекст ровно в том объёме, который нужен. Контекстное окно — конечный ресурс с убывающей отдачей. Задача — не «дать больше», а «дать самое существенное».
5.2Уровень 0 — обязательный минимум
Без этого уровня переход на подход не начинается. Проверяется на чистой машине.
| # | Требование | Критерий приёмки |
|---|---|---|
| 0.1 | Одна команда установки | С чистого клона до рабочего окружения — одна команда, без устных инструкций |
| 0.2 | Одна команда полной проверки | Одна команда прогоняет типизацию, линтер, форматирование, тесты и сборку и возвращает ненулевой код при любой ошибке |
| 0.3 | Проверка выполняется быстро | Полный прогон на изменённом коде — минуты, не десятки минут. Используйте кеширование и прогон только затронутых проектов |
| 0.4 | Тесты детерминированы | Нет тестов, падающих через раз. Нестабильный тест хуже отсутствующего: он обучает игнорировать красный статус |
| 0.5 | Секреты не в репозитории | Агент читает рабочее дерево целиком |
| 0.6 | Локальный запуск воспроизводим | Одинаковый результат у разных людей и в CI |
Рекомендуемая конвенция для монорепозитория на pnpm: единая точка входа в проверку на корневом уровне, например скрипт verify, объединяющий сборку, линт, типизацию и тесты, чтобы и человек, и агент, и CI использовали одну и ту же команду. Разные команды у человека и у CI — источник расхождений.
5.3Уровень 1 — инструкции для агента
CLAUDE.md — корневой файл инструкций, который Claude Code читает автоматически. Это основной носитель правил проекта.
Что должно быть в корневом файле инструкций
Держите его коротким — ориентир около 100–200 строк. Длинный файл вытесняет из контекста то, ради чего агент вызван.
Ниже — не готовый файл, а шаблон структуры: разделы и плейсхолдеры <...> заполняются содержимым конкретного репозитория.
# <Название проекта>
## Что это
Одно-два предложения: назначение системы и её доменная область.
## Структура
- `apps/*` — сервисы, по одному на бизнес-домен
- `packages/*` — переиспользуемые пакеты
- `openspec/specs/` — действующие требования к поведению (источник истины)
- `openspec/changes/` — изменения в работе
## Команды
- Установка: `<команда>`
- Полная проверка: `<команда>`
- Тесты одного сервиса: `<команда>`
- Запуск локально: `<команда>`
## Обязательные правила
- Перед завершением задачи прогнать полную проверку. Красный статус — работа не завершена.
- Не менять публичные контракты API и событий без соответствующего изменения в `openspec/`.
- Не добавлять новые зависимости без явного согласования.
- Не отключать и не помечать как пропускаемые существующие тесты.
- Коммиты — по Conventional Commits.
## Конвенции кода
- <язык, версия, стиль, обработка ошибок, логирование>
- <как устроены слои и что откуда можно импортировать>
## Термины
- <5–15 доменных терминов с однозначными определениями>
## Чего не делать
- <перечень известных ловушек этого репозитория>
Вложенные файлы инструкций
В монорепозитории корневой файл описывает общее, а специфика сервиса — в файле рядом с сервисом (apps/<service>/CLAUDE.md).
Глоссарий — отдельно и обязательно
Единый глоссарий доменных терминов — самый дешёвый способ убрать целый класс расхождений. Синонимы в требованиях агент интерпретирует как разные сущности. Глоссарий ведётся в репозитории и на него ссылаются и спецификации, и инструкции.
5.4Уровень 2 — управление контекстом
| Мера | Что даёт |
|---|---|
Запретить агенту чтение сгенерированных артефактов (dist/, build/, coverage/, *.generated.*, лок-файлы) | Убирает из контекста мусор, который вытесняет полезное |
| Индексация репозитория для поиска по графу символов (например, graft) | Агент находит нужное место по одному запросу вместо серии grep-ов |
| Разбиение больших файлов | Уменьшает объём, который агенту приходится удерживать |
| Явные экспорты и типизированные границы модулей | Агенту не нужно читать реализацию, чтобы понять контракт |
| Удаление мёртвого кода | Устраняет ложные образцы для подражания |
| Актуальные примеры в тестах | Агент копирует стиль из тестов; устаревшие примеры воспроизводятся |
Принцип: качество контекста определяется не объёмом, а долей существенного. Каждый лишний файл в контексте — это вытесненный полезный.
5.5Уровень 3 — автоматика и интеграции
| Мера | Приоритет | Комментарий |
|---|---|---|
| Хуки, автоматически запускающие проверку после правок агента | Высокий | Замыкает цикл без участия человека |
| Ограничение прав агента (что можно выполнять без подтверждения) | Высокий | См. §7.8 |
| Обязательные статус-проверки на ветке по умолчанию (branch protection) | Высокий | Настраивает DevOps; технически блокирует мерж только при включении, без него — процессная дисциплина (§7.6) |
| Подключение MCP-серверов (трекер задач, документация, БД) | Средний | Подключать по одному, с минимальными правами. Каждый сервер — расширение поверхности атаки и расход контекста |
| AI-ревьюер в pull request | Средний | Оценивается в пилоте; не заменяет человека. Технически — headless Claude Code как отдельный CI-job (§7.6, §7.3) |
5.6Установка OpenSpec в репозиторий
Топология: спек-репозиторий и кодовый репозиторий
Спецификации и код живут в двух разных репозиториях, а не в разделах одного. Причина — контроль доступа: ни git, ни GitHub не разделяют права на чтение по пути внутри одного репозитория, только по репозиторию целиком. Единственный способ дать аналитику доступ к требованиям и не дать доступ к коду — физически развести их по репозиториям (рабочее место аналитика — справочник, §2).
Механика связи — git submodule: кодовый репозиторий подключает спек-репозиторий на пути openspec/.
# один раз, при подключении спек-репозитория к кодовому
cd <кодовый-репозиторий>
git submodule add <url-спек-репозитория> openspec
git commit -m "chore: подключить спек-репозиторий как submodule"
# при каждом клоне кодового репозитория
git clone --recurse-submodules <url-кодового-репозитория>
# обновить submodule на последний мерженый коммит спек-репозитория
git submodule update --remote openspec
Команды openspec и слэш-команды Claude Code (/opsx:*) работают без изменений: агент и разработчик видят содержимое спек-репозитория как обычную папку openspec/ в рабочем дереве кодового репозитория. Разница только в правах доступа людей: спек-репозиторий — аналитик, техлид, разработчики на запись, ПМ и QA на чтение (для участия в Гейте 1 и приёмки — §3.5, §3.7); кодовый репозиторий — техлид и разработчики, без аналитика.
Установка
Требуется Node.js 20.19.0 или новее.
# установка CLI
npm install -g @fission-ai/openspec@latest
# инициализация — выполняется в корне спек-репозитория, не кодового
cd <спек-репозиторий>
openspec init
openspec init спросит, для каких ассистентов настроить команды, и создаст в корне спек-репозитория:
config.yaml # схема воркфлоу и проектный контекст
specs/ # действующие спецификации (источник истины)
changes/
└── archive/ # архив завершённых изменений
.claude/skills/openspec-*/ # навыки для Claude Code
.claude/commands/opsx/ # слэш-команды для Claude Code
После git submodule add этот же набор виден в кодовом репозитории на пути openspec/config.yaml, openspec/specs/ и так далее.
Обратите внимание: openspec init не создаёт и не перезаписывает ваш CLAUDE.md — его содержимое остаётся за вами.
Проектный контекст задаётся в openspec/config.yaml и подставляется агенту при создании артефактов:
schema: spec-driven
context: |
Стек: TypeScript, NestJS, pnpm-монорепозиторий, PostgreSQL, Redis.
Домен: платёжный шлюз (платежи, выплаты, кошельки, вебхуки мерчантам).
Соглашения: Conventional Commits; публичные контракты фиксируются в OpenAPI.
Спецификации пишутся на русском языке.
rules:
proposal:
- Раздел Why не длиннее пяти предложений
- Всегда явно указывать, является ли изменение ломающим
specs:
- Каждое требование обязано иметь сценарий негативного пути
- Нефункциональные требования обязаны содержать числовой порог
tasks:
- Каждая задача содержит способ проверки в своём тексте
Раздел rules — рабочий инструмент техлида: им планка требований задаётся один раз и применяется автоматически ко всем изменениям, вместо повторения одних и тех же замечаний на ревью.
Обновление команд и навыков после выхода новой версии CLI:
openspec update
Телеметрия. OpenSpec по умолчанию отправляет анонимную статистику использования (имя команды и версия). Отключается одним из способов:
openspec config set telemetry.enabled false
# либо переменными окружения OPENSPEC_TELEMETRY=0 или DO_NOT_TRACK=1
Для корпоративного использования отключение телеметрии рекомендуется закрепить в настройках репозитория.
5.7Чеклист готовности репозитория
Заполняется до старта Фазы 1. Порог допуска — 80 % пунктов, при этом все пункты уровня 0 обязательны.
Уровень 0 — обязательно
Уровень 1 — инструкции
Уровень 2 — контекст
Уровень 3 — процесс
Часть 6Реализация: как работает разработчик
6.1Принцип
Спецификация — задание. Тесты — приёмка. Агент — исполнитель. Разработчик — тот, кто отвечает за результат.
Разработчик не является оператором генератора кода. Он отвечает за то, что реализация соответствует спецификации и что это доказано. Всё, что не доказано проверкой, считается несделанным.
6.2Цикл работы
Шаг 1. Прочитать спецификацию целиком
До запуска агента. Полностью: proposal.md, все файлы specs/, design.md, tasks.md. Это 10–15 минут, которые окупаются полностью.
По ходу чтения отметить:
- Что непонятно или допускает два толкования.
- Где спецификация расходится с известным вам устройством системы.
- Какие сценарии потребуют нетривиальных тестов.
Если непонятного больше двух пунктов — не начинать. Сформулировать конкретные вопросы и вернуть их автору спецификации — аналитику. Техлида привлекать точечно, только если вопрос касается архитектурного решения, а не формулировки требования (§2.3). Стоимость вопроса до начала работы — минуты; после — переделка.
Шаг 2. Уточнить декомпозицию
tasks.md уже создан агентом на этапе Спецификации вместе с аналитиком (§3.4) — здесь разработчик его проверяет и дорабатывает, а не пишет с нуля. Проверить tasks.md:
- Каждая задача завершается за один заход.
- Каждая задача содержит явный способ проверки.
- Порядок соответствует зависимостям.
- Каждый сценарий спецификации покрыт хотя бы одной задачей.
Правки в декомпозицию вносить до старта.
Шаг 3. Запустить реализацию
/opsx:apply <change-name>
Агент читает все артефакты изменения, идёт по задачам и отмечает выполненные.
Шаг 4. Вести сессию
| Правило | Почему |
|---|---|
| Один change — одна сессия | Смешение задач загрязняет контекст и снижает качество |
| Коммит после каждой логически завершённой задачи | Даёт точки отката и делает diff читаемым |
| Прогонять проверку после каждой существенной задачи, а не в конце | Ошибка, найденная сразу, стоит минуты; найденная в конце — часы разбора |
| Начинать новую сессию при длинном контексте | Качество работы падает по мере накопления контекста |
| Не принимать «готово» без зелёной проверки | «Выглядит готовым» — не критерий |
| Читать diff, а не только итоговое сообщение | Итоговое сообщение агента — это отчёт, а не доказательство |
Шаг 5. Обеспечить прослеживаемость сценариев
Каждый сценарий спецификации должен иметь соответствующий тест, и связь должна быть видна без объяснений.
Конвенция именования: имя теста содержит имя требования и имя сценария.
describe('Requirement: Ограниченное расписание ретраев', () => {
it('Scenario: Успех со второй попытки', async () => { /* ... */ });
it('Scenario: Все повторы исчерпаны', async () => { /* ... */ });
});
Это даёт три вещи: ревьюер видит покрытие сценариев за секунды; при падении теста сразу понятно, какое требование нарушено; проверить полноту покрытия можно поиском по именам.
Шаг 6. Самопроверка перед PR
Обязательный чеклист. PR, открытый без его выполнения, возвращается без рассмотрения.
Пункт «в diff нет ничего лишнего» — ключевой. Типичное поведение агента — попутно «улучшить» соседний код. Это расширяет объём ревью, увеличивает риск и не имеет отношения к задаче. Лишнее удаляется до открытия PR.
6.3Что делать при расхождении
| Ситуация | Действие |
|---|---|
| Спецификация неоднозначна | Остановиться. Вопрос аналитику. Не выбирать толкование самостоятельно |
| Спецификация противоречит устройству системы | Остановиться. Вопрос техлиду. Возможен пересмотр design.md |
| Требование технически невыполнимо в заявленном виде | Остановиться. Изменение возвращается на доработку через /opsx:update |
| Обнаружен незадокументированный сценарий | Зафиксировать. Если он в границах изменения — дополнить спецификацию; если нет — завести отдельную задачу |
Агент предлагает решение лучше описанного в design.md | Обсудить с техлидом. При согласии — обновить design.md тем же PR |
| Реализация требует существенно большего объёма, чем задача | Остановиться и сообщить. Не поглощать объём молча |
Общее правило: любое расхождение фиксируется в артефактах, а не разрешается в голове разработчика. Иначе спецификация перестаёт соответствовать системе и весь подход теряет смысл.
Часть 7Контроль качества и управление результатом
Ревью — не построчный поиск случайных ошибок, а система проверок, спроектированная так, чтобы дефицитное внимание человека тратилось только там, где оно незаменимо.
Чек-листы этой Части не рассчитаны на то, что их будут держать в голове или сверяться с документом на каждый PR — так они не проживут и месяца под давлением сроков. Они рассчитаны на то, чтобы стать шаблоном PR в GitHub (.github/pull_request_template.md) и обязательными статус-проверками в CI (§7.6): тогда чек-лист не требует дисциплины, он просто есть на экране в момент, когда PR открывается.
7.1Двухгейтовая модель контроля
Процесс управляется ровно в двух точках, и они устроены по-разному.
| Гейт 1 (§3.5) | Гейт 2 (§3.7) | |
|---|---|---|
| Что проверяется | Правильно ли сформулировано задание | Правильно ли выполнено задание |
| Стоимость ошибки | Правка абзаца | Переписывание модуля |
| Владелец | Техлид | Техлид |
| Что происходит при отказе | Спецификация возвращается автору | PR возвращается автору |
| Масштабируется ли объёмом кода | Да — не зависит от объёма реализации | Ограниченно — требует риск-тиринга (§7.4) |
Гейт 1 дешевле и мощнее Гейта 2: он останавливает неверную работу до того, как она написана. Поэтому планка Гейта 1 (§7.2) — первый и самый дешёвый из четырёх рычагов техлида (§2.4). Всё в этой Части описывает, как эти два гейта работают на практике и что происходит, когда одного ревью недостаточно.
7.2Гейт 1: на что смотрит техлид
Definition of Ready (§4.5) — то, что аналитик проверяет сам перед подачей. Гейт 1 — это суждение техлида поверх пройденного DoR; проверяются вещи, которые нельзя свести к чеклисту.
Результат фиксируется по таблице исходов §3.5. Возврат с замечаниями — рабочий, ожидаемый исход, а не отказ довериться аналитику: цель гейта — поймать расхождение здесь, а не после реализации.
7.3Гейт 2: ревью кода агента
Ревью агентного PR отличается от ревью человеческого не по глубине, а по тому, с чего оно начинается: с проверки, что PR вообще годен к чтению.
Проход 0 — вход в очередь (автоматический)
PR, не прошедший проход 0, не выносится на ревью человека — CI возвращает его автору.
Проход 1 — каждый PR, любой тир
Намерение и охват
Тесты
Слабые места агентной реализации
Зависимости и переиспользование
Готовность к продакшну
Проход 2 — дополнительно для Тира 1 и Тира 2
Дисциплина ревьюера
Ориентир по темпу: если ревью идёт быстрее 500 строк в час — это не ревью, а подпись; при такой скорости PR стоит разбить или отложить до момента, когда на него есть время. Дальше — три правила, которые реально стоит соблюдать:
7.4Риск-тиринг изменений
Тир назначается по цене ошибки, а не по тому, кто автор — человек или агент. Авторство меняет требуемые доказательства, а не тир.
Шаг 1 — назначить тир по старшему совпавшему признаку
Тир 1 · критический Пишет агент под особо точной постановкой задачи; обязательно построчное ревью человеком без исключений и без сэмплирования. Для узкого класса случаев внутри Тира 1 (шаг 3 ниже) — пишет человек. Любое из:
- Логика аутентификации, авторизации, сессий, изоляции между мерчантами/тенантами.
- Движение денег: платежи, выплаты, балансы, реестры, ценообразование, возвраты, комиссии.
- Криптография, управление ключами, хранение и ротация секретов.
- Необратимые операции с данными: разрушающая миграция, удаление, бэкфилл поверх продакшн-данных.
- Новый способ обработки регулируемых данных (персональные данные, платёжные реквизиты, финансовая отчётность).
- Изменение модели прав агента, инструмента, MCP-сервера, скилла или хука.
- Изменение самого CI/CD, релизного процесса или гейтов деплоя.
- Изменение публичного контракта API или протокола, потребляемого внешними сторонами.
- Радиус поражения — «все мерчанты» или «все пользователи».
Тир 2 · высокий Пишет агент; построчно ревьюирует поимённо назначенный человек. Любое из:
- Основная бизнес-логика на клиентском пути.
- Общие библиотеки или внутренние фреймворки, используемые тремя и более сервисами.
- Обратимые изменения схемы данных; логика конкурентности, очередей, ретраев, идемпотентности, rate limiting.
- Границы интеграции со сторонним провайдером; добавление новой runtime-зависимости.
- Diff (без учёта тестов, §7.5) превышает 600 строк или 12 файлов, либо тесты были удалены/ослаблены в рамках PR, либо изменение — повторная подача после отката или инцидента.
Тир 3 · стандартный Пишет и ревьюирует агент; предревью агентом обязательно; человек проверяет обычной глубиной. Сюда попадает всё, что не относится к Тиру 1 или Тиру 2. Внутри тира одно исключение: изменения без влияния на прод-поведение (документация, форматирование, dev-тулинг, ≤ 100 строк, полностью покрыто существующими автопроверками) не требуют персонального ревью каждого PR — человек выборочно сэмплирует не менее 1 из 10 таких PR в неделю.
Тир не стоит назначать вручную на глаз при каждом PR — это ровно то место, где диалог с документом расходится с реальным поведением команды под дедлайном. Признаки Тира 1–2 привязаны к путям в репозитории (payments/, auth/, .github/workflows/ и т. д.) и к размеру diff — оба параметра CI видит сам. Бот-лейбл с предложенным тиром на PR снимает тир-классификацию с человека почти полностью; техлид вручную корректирует только неочевидные случаи.
Шаг 2 — обязательные контроли по тирам
| Контроль | Тир 1 | Тир 2 | Тир 3 |
|---|---|---|---|
| Код пишет человек | Обязательно | Опционально | Нет |
| Спецификация с проверяемыми сценариями и именованный тест на сценарий | Обязательно | Обязательно | Обязательно |
| Автоматические проверки зелёные, предревью агентом в свежем контексте | Обязательно | Обязательно | Обязательно |
| Второй, независимый AI-ревьюер | Обязательно | Рекомендуется | Нет |
| Построчное чтение человеком | Обязательно | Обязательно | Обычная глубина (сэмпл для мелких) |
| Второй human-approver | Обязательно | Нет | Нет |
| Отдельный security-проход; письменная дельта модели угроз | Обязательно | Если затрагивает безопасность | Нет |
| Задокументированные инварианты и негативные тесты | Обязательно | Обязательно | Если менялась логика |
| За feature-флагом; поэтапный/canary-выкат | Обязательно | Рекомендуется | Рекомендуется |
| Именованный ответственный на дежурстве; план отката в тексте PR | Обязательно | Обязательно | Одна строка |
Шаг 3 — когда обычного делегирования агенту недостаточно
Обычный цикл (§6.2) — агент реализует по спецификации, разработчик проверяет — рассчитан на случаи, где требование можно сформулировать точно, а результат проверить тестом. Для части изменений этого мало: нужны не отказ от агента, а кратно более точная постановка задачи и построчное ревью без сэмплирования, — это верно, если хотя бы одно:
- Критерий приёмки невозможно сформулировать настолько точно, чтобы его протестировать. Если тест-провал написать нельзя, результат нельзя доказать — разработчик формулирует и проверяет эту часть особенно тщательно.
- Изменение — это решение, а не реализация: выбор модели данных, контракта API, гарантии консистентности, зависимости, архитектурной границы. Решение принимает и фиксирует разработчик; агент реализует уже принятое решение, а не предлагает своё.
- Правильный ответ зависит от недокументированного институционального контекста: прошлый инцидент, обязательство перед клиентом, регуляторная трактовка, ещё не оформленный отказ от поддержки. Этот контекст нужно явно выгрузить в задачу — агент не восстановит то, чего не было написано.
- Задача — дверь в одну сторону: публичный API, который нельзя отозвать, необратимая миграция, схема, на которой построятся другие команды. Построчное ревью здесь обязательно, без исключений по тиру.
- Уже отклонены две попытки агента. Два проваленных исправления означают, что неверен контекст задачи, а не код: разработчик переформулирует её с максимальной точностью и фиксирует вывод как новое правило.
- Радиус поражения превышает возможность отката в рамках SLA на инцидент.
Когда не хватает и этого. В узком классе случаев — там, где тонко неверный ответ выглядит валидным и не будет пойман никаким ревью (предикаты авторизации, арифметика реестра, выбор параметров криптографии), — разработчик пишет эту часть сам. Это исключение, а не типовой режим: для остальных перечисленных выше случаев достаточно резко повысить точность постановки задачи и глубину собственного ревью, оставаясь в обычном цикле с агентом.
7.5Политика размера PR
Ограничение размера — самый дешёвый из всех контролей: он предотвращает проблему, а не находит её.
- Целевой диапазон: 200–600 изменённых строк, ≤ 8 файлов. Это объём, который ревьюер способен прочитать вдумчиво за 30–60 минут.
- Жёсткий предел: 900 строк или 15 файлов. Выше — PR автоматически помечается как избыточный, поднимается на один риск-тир и требует подписанного человеком исключения с объяснением, почему его нельзя разбить.
- Абсолютный потолок: 2000 строк. Выше бот помечает PR предупреждающей меткой и комментарием с требованием разбить его на последовательность связанных PR. На период миграции это предупреждение, а не автозакрытие — переход на автоматическое закрытие на потолке решается техлидом отдельно, после того как команда обкатает процесс.
- Строки в сгенерированных, вендорных, лок-файлах и тестах не входят в подсчёт — тесты не должны быть причиной, по которой PR упирается в лимит. Диф лок-файлов и тестов при этом остаётся обязательным пунктом ревью.
- Лимит применяется в трёх точках, а не в одной: в инструкциях агенту на этапе декомпозиции (
tasks.mdформируется так, чтобы каждая задача укладывалась в один поставляемый PR); на открытии PR; как проверка в CI на каждом PR (технически блокирует мерж там, где включён branch protection — см. §7.6). - Разбиение крупного изменения на последовательность зависимых PR (stacked PRs) и разработка за feature-флагами — рекомендуемая практика снижения размера единицы ревью. Это не отменяет лимит, а даёт способ его соблюдать без сокращения объёма работы.
7.6Автоматические гейты в CI
Автоматические проверки — второй рычаг техлида (§2.4): они определяют, что вообще допускается к чтению человеком. Ручное ревью начинается только после того, как эти проверки зелёные.
Обязательный минимум:
- Обязательные статус-проверки: сборка, типизация, линт, модульные и интеграционные тесты, порог покрытия.
- Валидация спецификаций (
openspec validate --strict) для любого PR, содержащегоopenspec/changes/. - Статический анализ безопасности (SAST) и сканирование секретов.
- Проверка политики зависимостей и лицензий; блокировка постинсталл-скриптов новых пакетов.
- Проверка архитектурных границ (запрещённые импорты между модулями), если такая граница определена.
Пока DevOps не включил branch protection: сброс устаревших одобрений при новом push, обязательное разрешение всех обсуждений перед мержем, запрет обхода правил веткозащиты вплоть до администраторов — это единственная мера, которая делает мерж без ревью технически невозможным, а не просто нежелательным. Без неё все пункты выше запускаются и видны в PR, но не блокируют мерж технически — это компенсируется процессной дисциплиной: красный статус проверки — блокирующее замечание на Гейте 2 (проход 0, §7.3), а не техническое препятствие.
Принцип проектирования проверок: каждая проверка относится к одной из двух категорий — guide (направляющая, действует до того, как агент напишет код: инструкции, шаблоны, ограничения прав) или sensor (проверяющая, действует после: тест, линт, сканер). Sensor должен быть достаточно быстрым и дешёвым, чтобы запускаться на каждое изменение. Задача техлида — проектировать эту систему проверок целиком, а не заменять её собственным построчным чтением.
Где выполняются агентные проверки. Предревью в свежем контексте (§7.3, проход 0) и второй независимый AI-ревьюер (§7.4) требуют суждения, а не сравнения с образцом, но остаются автоматической проверкой: неинтерактивный запуск Claude Code отдельным job'ом в CI на каждое открытие и обновление PR, в сессии без памяти о написанном коде. Находки публикуются как комментарии на PR до начала ревью человеком — это техническая реализация предревью и второго AI-ревьюера, а не замена самих Гейтов 1 и 2.
Правило двух (§7.8) распространяется и на этот job: агент читает недоверенный diff и публикует комментарий — уже два свойства из трёх, поэтому доступ к остальному репозиторию и секретам ограничивается минимально необходимым для чтения кода и публикации результата.
7.7Масштабирование контроля при росте объёма кода
Агент производит код быстрее, чем человек успевает его прочитать, и разрыв растёт вместе с объёмом — более способная модель его не закроет. «Больше ревьюеров» не масштабируется: их число растёт медленнее объёма кода. «Строже ревью каждого PR» не снижает число дефектов — только откладывает поставку. Рабочий ответ — последовательное применение четырёх рычагов техлида (§2.4) в порядке их стоимости:
- Планка Гейта 1 (§7.2) остаётся первой линией независимо от объёма. Её стоимость не растёт с объёмом реализации, потому что она применяется к спецификации, а не к коду.
- Автоматические гейты (§7.6) берут на себя всё, что можно проверить механически. Каждое ручное замечание, повторившееся дважды, переводится в правило или проверку (§7.3) — это единственный способ, которым ёмкость ревью растёт быстрее объёма кода.
- Риск-тиринг (§7.4) перераспределяет оставшееся внимание туда, где ошибка дорога. При росте объёма доля PR Тира 3 растёт быстрее доли Тира 1–2 — это ожидаемо и означает, что система работает, а не что контроль ослаб.
- Правила агентной работы (§7.8) снижают вероятность дефекта на входе, до того как он вообще станет предметом ревью.
Роль техлида смещается вместе с объёмом — от построчного чтения к проектированию: какие сенсоры нужны, где границы тиров, что фиксируется в правилах для агента. Техлид, который продолжает читать всё построчно при растущем объёме, становится узким местом, а не гарантом качества.
Сигналы разбалансировки: время PR в ревью растёт быстрее числа PR в неделю; доля PR, смерженных без содержательного ревью, растёт; число инцидентов на PR растёт быстрее числа PR. Любой из них — повод пересмотреть тиры и автоматические проверки, а не требовать от техлида читать быстрее.
7.8Безопасность агентной разработки
Агент, работающий в репозитории, одновременно способен читать приватные данные (код, секреты, историю), обрабатывать недоверенный контент (текст задачи, содержимое веб-страниц, вывод внешних инструментов) и совершать внешние действия (коммит, PR, сетевой запрос). Сочетание всех трёх свойств в одной сессии — открытая поверхность для атаки через внедрение инструкций в обрабатываемый текст.
Правило двух: в рамках одной сессии агента допускается не более двух из трёх свойств — обработка недоверенного ввода; доступ к чувствительным данным или системам; изменение состояния или внешняя коммуникация (коммит, PR, сетевой запрос, отправка сообщения).
Если задаче по своей природе требуются все три свойства без возможности начать новую сессию со свежим контекстом, она не выполняется агентом автономно — обязательно подтверждение человеком на каждом внешнем действии.
Обязательные технические меры:
- Флаг обхода разрешений Claude Code (
--dangerously-skip-permissions) запрещён в любом окружении с реальными учётными данными — в CI, на серверах, в скриптах. Его присутствие в файлах репозитория (workflow, скрипты, конфигурация) обнаруживается обычной проверкой содержимого на PR и блокирует мерж. Использование флага в локальной сессии разработчика технически не проверяется — это его зона контроля; вместо сканирования разработчик подтверждает его отсутствие пунктом в шаблоне PR, как и происхождение реализации (§7.3, проход 0). - Пока права агента не разграничены инфраструктурно (например, через MCP-серверы с минимальными правами, §5.5), соблюдение правила двух — обязанность разработчика: перед стартом сессии он явно проверяет, какие из трёх свойств она затрагивает, и не запускает сессию, в которой сходятся все три. Когда развести невозможно, это не смягчает требование — каждое внешнее действие подтверждается человеком вручную, как описано выше.
- Недоверенный текст (содержимое задачи, результат веб-запроса, пользовательский ввод) никогда не передаётся агенту без явно обозначенной границы, отделяющей его от инструкций.
- Секреты и учётные данные хранятся вне зоны чтения агента по умолчанию; доступ к ним — по явному исключению, а не потому что агент технически может дотянуться до файла.
- Учётные записи и токены для облачных сервисов (включая CI-инфраструктуру) не хранятся в открытом виде в файлах конфигурации репозитория — только через переменные окружения или менеджер секретов CI.
Что это не отменяет: ответственность за проверку предлагаемых изменений перед одобрением остаётся на человеке при любом уровне автоматизации разрешений. Ни один инструмент защиты от внедрения инструкций не даёт полной гарантии — это довод в пользу Правила двух и минимизации прав, а не аргумент против агентной разработки.
Ориентир для классификации рисков: для случаев, где агент обрабатывает контент, инструменты или внешние подключения, применяется актуальная редакция OWASP Top 10 for LLM Applications — готовый, регулярно обновляемый чеклист классов риска.
7.9Эскалация
| Ситуация | Действие | Кому |
|---|---|---|
| Гейт 1 не пройден дважды подряд по одной и той же причине | Разбор причины на уровне процесса, а не повторная правка формулировки | Техлид → ПМ |
| Гейт 2 находит один и тот же класс дефектов на разных PR | Замечание переводится в правило или автоматическую проверку (§7.3), а не повторяется в ревью | Техлид |
| Агент дважды не справился с одной задачей | Разработчик переформулирует задачу с максимальной точностью и проходит её построчно сам; вывод фиксируется как новое правило для агента (§7.4, шаг 3, п. 5) | Разработчик → Техлид |
| Спецификация и реализация расходятся после начала работы | Работа останавливается; спецификация правится через /opsx:update; сокращённое повторное ревью | Разработчик → Аналитик/Техлид (§6.3) |
| Ревью систематически не укладывается в SLA (§3.5, §7.3) | Пересмотр риск-тиринга или состава автоматических гейтов, не давление на скорость ревью | Техлид → CTO |
| Обнаружен флаг обхода разрешений или иное нарушение §7.8 в защищённом окружении | Немедленная блокировка PR/доступа; разбор инцидента | Техлид → CTO, вне обычного цикла ревью |
| Конфликт между техлидом и аналитиком/ПМ о необходимости спецификации (§1.3) | Решение принимает CTO; прецедент фиксируется как уточнение правила §1.3 | CTO |
Общий принцип эскалации: любое разногласие разрешается на уровне артефакта (спецификация, правило, автоматическая проверка), а не устным решением в моменте. Устное решение, не зафиксированное в артефакте, будет расходиться с системой при следующем похожем случае.
AI-NATIVE-SDD-REFERENCE.MD
Инструменты и справочник
Дочерний документ регламента. Ссылки без пометки — разделы этого файла; ссылки «регламент, §X» — основной документ.
§1Инструменты по ролям
| Роль | Инструмент | Назначение |
|---|---|---|
| Разработчик, техлид | Claude Code | Исполнение спецификации в режиме /opsx:apply; агентная реализация задач из tasks.md без пошагового ручного промптинга |
| Аналитик | Claude Code on the web (claude.ai/code) для Explore/Спецификации (§3.3, §3.4); GitHub (веб-редактор Markdown-файлов и Pull Request) для точечной правки — оба без установки ПО, в спек-репозитории | Разбор задачи и черновик спецификации агентом, правка текста без доступа к коду (§2 этого документа) |
| ПМ, QA | GitHub (чтение Markdown-файлов), в спек-репозитории | Доступ на чтение для участия в Гейте 1 (ПМ) и приёмки по сценариям (QA) — регламент, §3.5, §3.7, §5.6 |
| Техлид | CLAUDE.md и openspec/config.yaml (rules) — файлы инструкций и правил в самом репозитории | Планка требований и границы работы агента (регламент, §5.3, §5.6) |
| Любая роль, ревьюирующая PR | GitHub Desktop или VS Code + расширение GitHub Pull Requests | Просмотр diff, чекаут чужого PR, работа с конфликтами |
| DevOps | CI-платформа (GitHub Actions) + линтер/тест-раннер + SAST (Semgrep и/или CodeQL/GitHub Advanced Security и/или SonarQube) + управление зависимостями (Dependabot или Renovate) | Автоматические гейты (регламент, §7.6); бот-лейбл риск-тира по путям и размеру diff (§7.4) |
| Техлид (настройка), DevOps (платформа) | Claude Code GitHub Action (anthropics/claude-code-action) — headless-запуск Claude Code как отдельный CI-job | Предревью Гейта 2 и второй AI-ревьюер в свежем контексте (регламент, §7.6, §7.3, §7.4) — не замена самих Гейтов 1/2, отдельная проверка перед ними |
| Аналитик, техлид, разработчик | OpenSpec (@fission-ai/openspec) | CLI и слэш-команды жизненного цикла спецификации. Бесплатно, MIT (регламент, §1.2) |
Вне этого списка — предмет отдельной оценки в пилоте, не рекомендация этого документа: отдельные AI-ревьюеры pull request'ов (регламент, §7.3), MCP-серверы сверх минимально необходимых.
Специфичные для подхода команды у разработчика и техлида — это не отдельный инструмент, а две группы команд поверх обычного git/GitHub: слэш-команды и CLI OpenSpec (§6 этого документа) и команды git submodule для связи спек-репозитория с кодовым (регламент, §5.6). Всё остальное в их рабочем месте — обычный стек разработки, ничего дополнительного не требуется.
Пример конфигурации: агентные проверки в CI
Механизм — официальный anthropics/claude-code-action (GitHub Action), настраиваемый один раз в .github/workflows/.
Триггеры:
| Событие | Когда срабатывает | Соответствует |
|---|---|---|
pull_request: opened | PR создан | Первый проход предревью (регламент, §7.3, проход 0) |
pull_request: synchronize | В PR сделан новый push | Повторный проход предревью по обновлённому diff'у |
pull_request: reopened, ready_for_review | PR переоткрыт / вышел из черновика | То же самое |
issue_comment, pull_request_review_comment с @claude | Участник явно обратился к агенту в комментарии | Разовый запрос, не автоматический гейт |
Пример workflow (предревью на каждый PR):
name: Code Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
plugin_marketplaces: "https://github.com/anthropics/claude-code.git"
plugins: "code-review@claude-code-plugins"
prompt: "/code-review:code-review --comment ${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
claude_args: '--allowedTools "mcp__github_inline_comment__create_inline_comment"'
Что настраивается:
- Секрет
ANTHROPIC_API_KEY(илиCLAUDE_CODE_OAUTH_TOKENдля подписки) в настройках репозитория. - Права workflow — только
contents: read,pull-requests: read,issues: read; без прав на запись в код или деплой (согласуется с Правилом двух, регламент §7.8). --allowedTools— какие действия агенту разрешены сверх чтения; здесь только публикация inline-комментария.- Второй, независимый AI-ревьюер для Тира 1–2 (регламент, §7.4) — второй такой job в том же файле, с другим
promptили--model.
Вне CI: тот же агент запускается неинтерактивно локально или в любом другом пайплайне командой claude -p "<промпт>" --output-format json.
Пример конфигурации: бот-лейбл риск-тира
Из признаков Тира 1–2 (регламент, §7.4, шаг 1) механически проверяются только два: путь изменённых файлов и размер diff. Остальные признаки (изменение контракта API, новая бизнес-логика и т. п.) требуют суждения — бот их не видит, тир по ним поднимает техлид вручную.
name: Risk Tier Label
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
tier:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/github-script@v7
with:
script: |
const pr = context.payload.pull_request;
const files = await github.paginate(github.rest.pulls.listFiles, {
owner: context.repo.owner, repo: context.repo.repo, pull_number: pr.number
});
const paths = files.map(f => f.filename);
const isTestFile = f => /(^|\/)(tests?|__tests__|spec)\//i.test(f) || /\.(test|spec)\.[jt]sx?$/i.test(f);
const tier1Paths = [/^payments\//, /^auth\//, /^\.github\/workflows\//];
const isTier1 = paths.some(f => tier1Paths.some(p => p.test(f)));
const changedLines = files
.filter(f => !isTestFile(f.filename))
.reduce((sum, f) => sum + f.additions + f.deletions, 0);
const isTier2 = changedLines > 600 || paths.length > 12;
const tier = isTier1 ? 'tier-1' : (isTier2 ? 'tier-2' : 'tier-3');
await github.rest.issues.addLabels({
owner: context.repo.owner, repo: context.repo.repo, issue_number: pr.number, labels: [tier]
});
Что настраивается:
- Список путей Тира 1 (
tier1Paths) — под конкретный репозиторий, из признаков §7.4, шаг 1. - Пороги Тира 2 — те же числа, что в §7.4 (диф без тестов больше 600 строк или 12 файлов).
- Метка
tier-N— сигнал техлиду для глубины ревью (§7.3, §7.4), а не техническое ограничение: сама по себе она не блокирует мерж, только маркирует PR.
Пример конфигурации: контроль размера PR
name: PR Size Gate
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
size:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: write
steps:
- uses: actions/github-script@v7
with:
script: |
const pr = context.payload.pull_request;
const files = await github.paginate(github.rest.pulls.listFiles, {
owner: context.repo.owner, repo: context.repo.repo, pull_number: pr.number
});
const isTestFile = f => /(^|\/)(tests?|__tests__|spec)\//i.test(f) || /\.(test|spec)\.[jt]sx?$/i.test(f);
const changed = files
.filter(f => !isTestFile(f.filename))
.reduce((sum, f) => sum + f.additions + f.deletions, 0);
if (changed > 2000) {
await github.rest.issues.createComment({
owner: context.repo.owner, repo: context.repo.repo, issue_number: pr.number,
body: 'PR превышает абсолютный потолок в 2000 строк без учёта тестов (регламент, §7.5). Разбейте изменение на последовательность связанных PR. На период миграции это предупреждение — PR не закрывается автоматически.'
});
await github.rest.issues.addLabels({
owner: context.repo.owner, repo: context.repo.repo, issue_number: pr.number, labels: ['oversized-ceiling']
});
} else if (changed > 900 || pr.changed_files > 15) {
await github.rest.issues.addLabels({
owner: context.repo.owner, repo: context.repo.repo, issue_number: pr.number, labels: ['oversized']
});
}
Что настраивается:
- Пороги — те же числа, что в §7.5 (целевой диапазон 200–600 строк, жёсткий предел 900 строк/15 файлов, абсолютный потолок 2000 строк; тесты, сгенерированные, вендорные и лок-файлы не учитываются).
- Метка
oversized— сигнал техлиду поднять PR на риск-тир и потребовать подписанное исключение (§7.5); дальнейшее действие — вручную. - Автозакрытие на абсолютном потолке отключено на период миграции: вместо него бот ставит метку
oversized-ceilingи оставляет комментарий. Возврат к автозакрытию — решение техлида после того, как процесс обкатан.
§2Рабочее место аналитика
Аналитик не пишет код и не устанавливает инструменты разработчика. У его работы два разных режима: агентная работа с Claude Code на этапах Explore и Спецификация (регламент, §3.3, §3.4) и обычное редактирование Markdown-файлов через Pull Request.
Доступ — только к спек-репозиторию (регламент, §5.6), не к кодовому. Это снимает риск утечки кода через скомпрометированную или избыточно широкую учётную запись. Доступа на чтение к спек-репозиторию достаточно — полноценная разработческая учётная запись не требуется.
Агентная работа: Claude Code on the web
Этапы 1 и 2 (§3.3 Explore, §3.4 Спецификация) выполняются в сессии агента — аналитик запускает /opsx:explore и /opsx:propose "<описание>" в браузере, через Claude Code on the web (claude.ai/code), тем же GitHub-аккаунтом, что и веб-редактор.
- GitHub-аккаунт аналитика авторизуется через Claude GitHub App.
- Сессия выполняется в изолированной облачной среде.
- Доступные репозитории в сессии — те же, что и у GitHub-аккаунта (§5.6).
- В сессии доступны просмотр diff, инлайн-комментарии к черновику и создание PR.
Редактирование текста без агента
Для правок уже существующего change (доработка после Гейта 1, правка формулировки) агент не обязателен — подходит обычный текстовый редактор:
| Вариант | Что доступно | Когда достаточно |
|---|---|---|
| GitHub веб-редактор («Propose changes» прямо в браузере) | Редактирование файла с превью, автоматическое создание ветки и коммита, diff, PR, комментарии | Точечная правка одного файла |
github.dev (веб-версия VS Code, клавиша . на странице репозитория, без установки) | Полноценный файловый проводник, редактирование и коммит нескольких файлов одного change в одной сессии | Ручная правка нескольких файлов сразу без агента — например, синхронное переименование термина в нескольких spec.md |
GitHub Desktop и полноценный VS Code в рабочее место аналитика не входят — оба требуют отдельно установленного редактора для правки текста.
§3Что оценивать в пилоте
- Достаточно ли аналитику GitHub веб-редактора для точечных правок или типичный change с самого начала требует github.dev.
- Даёт ли AI-ревьюер pull request'ов измеримое сокращение времени ревью Гейта 2 без роста пропущенных дефектов — если нет, не подключается на постоянной основе.
§4Полный пример change
Пример ниже проверен реальным прогоном openspec validate --strict на версии 1.12.0 и корректно сливается в основную спецификацию при архивации. Используйте его как эталон формата.
proposal.md
## Why
Выплаты, упавшие из-за временной недоступности провайдера, помечаются как
`FAILED` и требуют ручной переотправки поддержкой. Это около 30 ручных
переотправок в неделю и задержка расчётов с мерчантами.
## What Changes
- Автоматический ретрай выплат, упавших с временной ошибкой провайдера.
- Новое состояние `RETRY_SCHEDULED` в жизненном цикле выплаты.
- Новое событие `payout.retry_scheduled`, позволяющее мерчанту отличить
временный отказ от окончательного.
- **BREAKING** `payout.failed` больше не отправляется при первой временной
ошибке — только после исчерпания ретраев.
## Capabilities
### New Capabilities
- `payout-retry`: автоматическая переотправка выплат, упавших с временной
ошибкой провайдера.
### Modified Capabilities
- `payout-webhooks`: изменение условий отправки событий при временном отказе.
## Impact
- `apps/payout-service`: машина состояний, планировщик, классификация ошибок.
- `packages/common`: перечисление статусов выплаты.
- Публичный контракт вебхуков, документация для мерчантов.
specs/payout-retry/spec.md
ADDED Requirements
Система SHALL классифицировать отказ провайдера как временный, если провайдер вернул сетевой таймаут, ответ HTTP 5xx или документированную ошибку превышения лимита запросов, и как окончательный во всех остальных случаях.
RETRY_SCHEDULEDFAILEDСистема SHALL повторять отправку выплаты в состоянии RETRY_SCHEDULED не более 3 раз с задержками 1, 5 и 25 минут после предыдущей попытки и SHALL переводить выплату в FAILED при неудаче третьего повтора.
COMPLETEDFAILEDСистема SHALL отправлять каждый повтор с тем же ключом идемпотентности, что и исходная отправка, чтобы провайдер, уже принявший выплату, не создал дублирующий перевод.
COMPLETED без создания второго переводаdesign.md
## Context
Отправка выплаты — синхронный вызов адаптера провайдера. В `apps/payout-service`
нет инфраструктуры планирования; сервис уже использует очередь на Redis
для входящих запросов. Мотивация — см. proposal.md, раздел Why.
## Goals / Non-Goals
**Goals:**
- Повторять отправку, не удерживая воркер между попытками.
- Сохранить гарантию ровно одного перевода.
**Non-Goals:**
- Повтор выплат, упавших на валидации до обращения к провайдеру.
- Переключение между провайдерами при отказе.
## Decisions
- Отложенная задача в очереди на каждую попытку вместо таймера в процессе:
сервис работает в нескольких репликах, таймеры теряются при рестарте.
Рассмотренная альтернатива — периодический обход строк в состоянии
`RETRY_SCHEDULED` — отклонена из-за постоянной нагрузки на базу.
- Классификация ошибок в адаптере провайдера, а не в машине состояний:
новый провайдер добавляет своё отображение ошибок, не трогая общую логику.
## Risks / Trade-offs
- Провайдер принял выплату, но ответил таймаутом → возможен повтор.
Митигация: требование идемпотентности делает повтор безопасным.
- Задержки 1/5/25 минут увеличивают худший срок расчёта примерно на 31 минуту.
Митигация: событие `payout.retry_scheduled` даёт мерчанту точный статус.
## Migration Plan
Выкатывается под флагом `payout.retry.enabled`, включается сначала для
внутренних мерчантов, затем для всех через неделю без инцидентов.
Выключение флага возвращает прежнее поведение без миграции данных.
tasks.md
## 1. Модель предметной области
- [ ] 1.1 Добавить `RETRY_SCHEDULED` в перечисление статусов выплаты
и убедиться, что юнит-тесты машины состояний принимают новые переходы
- [ ] 1.2 Добавить счётчик попыток и время следующей попытки в сущность
выплаты и убедиться, что миграция применяется на чистой базе
## 2. Логика повторов
- [ ] 2.1 Реализовать классификацию временных и окончательных ошибок
в адаптере провайдера и убедиться, что оба сценария требования
о классификации проходят
- [ ] 2.2 Планировать отложенные задачи на 1/5/25 минут и убедиться,
что сценарии требования об ограниченном расписании проходят
- [ ] 2.3 Переиспользовать исходный ключ идемпотентности во всех повторах
и убедиться, что сценарий идемпотентности проходит на песочнице провайдера
## 3. Контракт
- [ ] 3.1 Отправлять `payout.retry_scheduled` и не отправлять `payout.failed`
до исчерпания повторов; убедиться, что контрактные тесты вебхуков проходят
- [ ] 3.2 Обновить документацию вебхуков для мерчантов и убедиться,
что опубликованная схема совпадает с отправляемым payload
Обратите внимание на формат задач: каждая задача содержит способ проверки прямо в тексте. Это не украшение — агент использует эту формулировку как критерий завершения задачи, а разработчик и ревьюер как критерий приёмки.
§5Шаблоны артефактов (пустые, для копирования)
proposal.md
## Why
<!-- Проблема, которую решает изменение. Почему сейчас. -->
## What Changes
<!-- Что именно меняется. Конкретно про новые/изменённые/удалённые способности. -->
## Capabilities
### New Capabilities
<!-- Новые способности. kebab-case. Каждая создаёт specs/<capability-path>/spec.md -->
- `<capability-path>`: <краткое описание>
### Modified Capabilities
<!-- Существующие способности, у которых меняются ТРЕБОВАНИЯ, а не только реализация.
Пусто, если требования не меняются. Change без единой затронутой способности
помечается skip_specs: true — не изобретайте требование ради валидации. -->
- `<existing-capability-path>`: <что меняется в требовании>
## Impact
<!-- Затронутый код, API, зависимости, системы -->
specs/<capability>/spec.md
## Purpose
<!-- Только для новой способности: 1-2 предложения, что она делает. Для существующей — удалить раздел. -->
## ADDED Requirements
### Requirement: <!-- имя требования -->
<!-- текст требования, с SHALL/MUST -->
#### Scenario: <!-- имя сценария -->
- **WHEN** <!-- условие -->
- **THEN** <!-- ожидаемый результат -->
design.md
## Context
<!-- Текущее состояние и ограничения. Не повторять мотивацию из proposal.md -->
## Goals / Non-Goals
**Goals:**
<!-- Чего достигает это решение -->
**Non-Goals:**
<!-- Что явно вне охвата -->
## Decisions
<!-- Ключевые решения, обоснование, рассмотренные альтернативы -->
## Risks / Trade-offs
<!-- Известные риски и компромиссы -->
tasks.md
## 1. <!-- Название группы задач -->
- [ ] 1.1 <!-- Описание задачи, включая способ проверки -->
- [ ] 1.2 <!-- Описание задачи -->
## 2. <!-- Название группы задач -->
- [ ] 2.1 <!-- Описание задачи -->
§6Справочник команд OpenSpec
Слэш-команды жизненного цикла (используются в регламенте):
| Команда | Назначение | Где используется (регламент) |
|---|---|---|
/opsx:explore | Разобрать задачу и снять неопределённость до создания change | §3.3 |
/opsx:propose "<описание>" | Создать директорию изменения и артефакты планирования | §3.4 |
/opsx:apply <change-name> | Реализовать задачи tasks.md по спецификации | §3.6, §6.2 |
/opsx:update <change-name> | Пересмотреть артефакты уже существующего изменения | §3.6, §6.3, §7.9 |
/opsx:archive <change-name> | Слить дельты в основные спецификации, перенести change в архив | §3.7 |
Ключевые команды CLI:
| Команда | Назначение |
|---|---|
openspec init [path] | Инициализировать OpenSpec в репозитории (регламент, §5.6) |
openspec validate <item> --strict | Проверить change или спецификацию до нуля ошибок и предупреждений |
openspec show <item> --diff | Показать изменение спецификации как diff |
openspec archive <change> -y | Архивировать изменение без интерактивных подтверждений (для CI/скриптов) |
openspec list [--specs|--changes] | Показать активные спецификации или изменения |
openspec status --change <id> | Показать статус выполнения задач изменения |
openspec doctor | Проверить целостность OpenSpec-окружения в репозитории |
openspec config | Просмотреть/изменить конфигурацию (openspec/config.yaml) |
Важно: отдельной команды openspec diff не существует — используется show --diff. Полный список команд и флагов — openspec --help; версия и точный набор команд могут измениться между релизами — сверяйте с --help установленной версии.
§7Глоссарий
| Термин | Значение |
|---|---|
| Способность (capability) | Именованная область поведения системы, которой соответствует один файл openspec/specs/<capability>/spec.md |
| Изменение (change) | Директория openspec/changes/<name>/, содержащая предложенные артефакты одной фичи до архивации |
| Дельта-спецификация (delta spec) | Файл в changes/<name>/specs/, описывающий только добавляемые/меняемые/удаляемые требования — не полную спецификацию способности |
| Requirement / Требование | Формализованное утверждение о поведении системы, обязательно содержащее SHALL/MUST и хотя бы один сценарий (регламент, §4.2) |
| Scenario / Сценарий | Проверяемый пример поведения в формате WHEN/THEN, привязанный к требованию |
proposal.md | Артефакт, отвечающий на вопрос «зачем и что меняется» (регламент, §4.1) |
design.md | Условный артефакт технического решения — пишется, когда изменение сквозное или рискованное (регламент, §2.3, §4.1) |
tasks.md | Декомпозиция реализации на проверяемые задачи (регламент, §4.1) |
| Гейт 1 | Утверждение спецификации техлидом — точка управления процессом (регламент, §2.4, §3.5, §7.2) |
| Гейт 2 | Ревью кода агента техлидом — глубина определяется риск-тиром (регламент, §3.7, §7.3) |
| Риск-тир | Классификация PR по цене ошибки (Тир 1–3), определяющая обязательные контроли (регламент, §7.4) |
| Правило двух | Ограничение на одновременное сочетание свойств в одной сессии агента: не более двух из {недоверенный ввод, чувствительные данные, изменение состояния/внешняя коммуникация} (регламент, §7.8) |
| DoR (Definition of Ready) | Условия, при которых спецификация выносится на Гейт 1 (регламент, §4.5) |
| Облегчённый трек | Один из сокращённых путей флоу для изменений, не требующих полного набора артефактов (регламент, §3.8) |
CLAUDE.md | Корневой файл инструкций для Claude Code, работающего в репозитории (регламент, §5.3) |
| MCP (Model Context Protocol) | Открытый протокол подключения AI-ассистента к внешним инструментам и источникам данных (регламент, §1.2) |
| SDD (Spec-Driven Development) | Разработка, в которой спецификация — исполняемое задание для реализации, а не сопроводительный документ (регламент, §0.1) |
AI-NATIVE-SDD-MIGRATION-PLAN.MD
План миграции
Дочерний документ регламента. Ссылки без пометки — разделы этого файла; ссылки «регламент, §X» — основной документ.
Переход происходит фазами с явным критерием на входе в каждую и явным критерием выхода. Ни одна фаза не форсируется административно — переход к следующей случается тогда, когда предыдущая доказала себя, а не по календарю.
§1Принципы
- Пилот — не показательное выступление. Он проводится на реальной фиче с ощутимой ценностью для бизнеса, а не на синтетической задаче. Это сознательный компромисс: реальная фича даёт более высокий риск, но и единственно убедительное доказательство для остальной команды.
- Практика не вводится директивно поверх незрелой инфраструктуры. Обязательное использование агентов и спецификаций до прохождения чеклиста готовности (регламент, §5.7) даёт результат «инструмент замедляет, а не ускоряет» (регламент, §5.1) и риск инцидента при недостаточном контроле прав агента (регламент, §7.8).
- Расширение измеряется устойчивым добровольным использованием, а не процентом отчитавшихся о внедрении. Практика, которая держится только на личном давлении лидера пилота, не готова к масштабированию — это симптом, а не успех.
- Confluence и Jira не отменяются одномоментно. Массовый перенос существующих требований — антипаттерн (регламент, §3.9); миграция идёт срезами, привязанными к активной работе (§7).
- Каждая фаза даёт входной критерий следующей. Переход раньше срока без выполнения критерия входа переносит нерешённые проблемы фазы 0 или 1 на больший масштаб, где их дороже исправлять.
§2Фаза 0 — Подготовка (неделя 1)
Что происходит: репозиторий приводится к уровню «готов к агентам» (регламент, Часть 5): устанавливается OpenSpec, пишутся файлы инструкций для агентов, настраиваются обязательные автоматические проверки на ветке по умолчанию.
Роли: Техлид (A/R) — владелец подготовки; CTO (I) — уведомляется о готовности.
Артефакт на выходе: чеклист (регламент, §5.7), пройденный на ≥ 80 %, при этом все пункты уровня 0 выполнены без исключений.
Критерий входа в Фазу 1: чеклист пройден; выбраны пилотная команда и пилотная фича (см. §3).
§3Фаза 1 — Пилот (недели 2–3)
Что происходит: одна фича проходит полный флоу (регламент, §3.1–§3.9) от инициативы до архивации.
Роли: 1 ПМ, 1 аналитик, 1 техлид, 1–2 разработчика, QA — полный состав ролей (регламент, Часть 2). Роли работают в пилоте так же, как в RACI (регламент, §2.2): ПМ инициирует фичу и принимает результат по бизнес-критериям, участвует в Гейте 1 как Consulted; QA проводит приёмку по сценариям спецификации. CTO — Informed, подключается к разбору результатов на выходе фазы.
Артефакт на выходе: фича в продакшене; спецификация не разошлась с реализацией к моменту архивации; проведено ретро с участием всех ролей пилота.
Критерий входа в Фазу 2 — таблица Go/No-Go, §5.
§4Фаза 2 — Команда (недели 4–7)
Все новые фичи одного проекта проходят через флоу; ранее начатые задачи доигрываются по-прежнему, без принудительного перевода в середине работы. Работает вся команда проекта в штатных ролях (регламент, Часть 2).
Артефакт на выходе: ≥ 80 % новых изменений имеют утверждённую спецификацию до начала работы.
Сопротивление на этой фазе не всегда «страх нового процесса» — часть команды воспринимает смещение роли (от «пишу код» к «ставлю задачу, проверяю, оркестрирую агента») как смену профессиональной идентичности. Разговор с командой — про смещение объекта работы на проектирование и проверку, а не про обещание меньшей рутины при той же ответственности за результат.
Разворачивание на остальные репозитории компании — решение CTO и отдельный процесс за пределами этого документа, который описывает переход одного проекта.
§5Критерии Go/No-Go
Переход к следующей фазе — решение CTO по итогам разбора с техлидом пилота, зафиксированное явно, а не молчаливое продолжение по календарю.
| Go | No-Go / доработать текущую фазу |
|---|---|
| Практика используется добровольно и устойчиво, а не только потому что «так распорядились». | Практика держится только на личном давлении лидера пилота. |
| Нет открытых инцидентов, вызванных недостаточным контролем прав агента или расхождением спецификации с реализацией. | Возник инцидент из-за недостаточного контроля прав агента (регламент, §7.8) или из-за расхождения, не пойманного гейтами. |
| Обратная связь участников пилота преимущественно позитивная или нейтральная. | Участники обходят процесс под давлением дедлайна и полностью откатываются к прежнему способу работы. |
| Аналитики пилотной команды пишут спецификации, доходящие до Гейта 1 без систематической ручной переработки техлидом. | Аналитики систематически не укладываются в формат спецификации — симптом: спецификации массово переписываются разработчиками постфактум, а не наоборот. |
| Результат можно показать остальной команде предметно — конкретными PR и спецификациями, а не пересказом впечатлений. | — |
§6Риски миграции и митигации
| Риск | Проявление | Митигация |
|---|---|---|
| Директивный роллаут поверх неготовой инфраструктуры | Агент даёт нестабильный или небезопасный результат, команда делает вывод «подход не работает» | Фаза 0 обязательна и не сокращается; переход к Фазе 1 только после прохождения чеклиста (регламент, §5.7) |
| Показательный пилот на синтетической задаче | Результат не убеждает остальную команду | Пилотная фича выбирается по критериям §3, включая реальную бизнес-ценность |
| Откат к старым привычкам под дедлайном | Разработчики пропускают спецификацию и гейты, когда горят сроки | Explicit-договорённость на старте: облегчённые треки (регламент, §3.8) — предусмотренный способ ускориться, отказ от гейтов — нет |
| Смещение профессиональной идентичности воспринимается как угроза | Скрытое или открытое сопротивление | Коммуникация строится вокруг смещения роли к проектированию и проверке (§4) |
| Избыточные права агента при поспешном включении в продакшн-задачи | Агент выполняет более разрушительное действие, чем предполагалось, если унаследовал избыточные права оператора | Правило двух и запрет флагов обхода разрешений — обязательны с Фазы 0 (регламент, §7.8); обязательное ревью для продакшн-изменений не отменяется наличием агента |
| Аналитики не готовы к формату структурированных требований | Спецификации систематически неполны, Гейт 1 превращается в постоянную переработку | Обучение и разбор реальных антипаттернов (регламент, §4.6) на старте |
| Массовый перенос существующей документации ради полноты | Команда тратит недели на перенос требований к коду, который никто не планирует менять | Перенос только срезами по мере реальных изменений (§7); полный перенос явно назван антипаттерном (регламент, §3.9) |
§7Что делать с существующим массивом Confluence и Jira
Правило по умолчанию — ничего не переносить массово (регламент, §3.9). Ниже — как это работает на практике при живой миграции.
Переносится срезами, привязанными к активной работе:
- Новые и активно дорабатываемые фичи с самого начала описываются в
openspec/specs/, а не в Confluence. - Уже стабильные, не меняющиеся части системы не трогаются, пока в них не понадобится реальное изменение.
Переносится в первую очередь, при первой возможности, независимо от активности:
- Architecture decision records (ADR) — независимо от возраста: в них зафиксирована причина решения.
- Документация к сервисам, которые прямо сейчас находятся в активной разработке.
Не переносится и остаётся в архиве Confluence:
- Страницы без активности за последний значительный период, без владельца, без входящих ссылок.
- Требования к коду, который не планируется менять в обозримом горизонте.
На каждый перенесённый раздел назначается владелец и фиксируется договорённость: при следующем значимом изменении затронутого кода обновляется спецификация в репозитории, а соответствующая страница Confluence, если она нужна для бизнес-контекста, помечается ссылкой на спецификацию, а не дублирует её (регламент, §3.9).
Jira не заменяется. Она остаётся системой учёта задач, приоритетов и сроков; меняется только то, что именно в ней перестаёт жить, — детальные требования к поведению системы переезжают в спецификацию, а задача в Jira ссылается на неё.