SDD и OpenSpec: от требований до проверенного изменения
Как превратить просьбу «давайте дадим доступ» в согласованный контракт, передать его coding agent и проверить результат. Системный анализ, основные и дельта-спецификации, работа с изменениями и приёмка. После теории — локальный сервис заявок на доступ, который вы измените дважды по процессу SDD.
Рекомендуемый вход — после coding agents из модуля 4. Номер 17 сохраняет адреса существующих уроков; ждать окончания курса не нужно. Первые десять разделов — теория с разобранными примерами, затем справочник команд и самостоятельный проект. К разделу про AI-качество полезно вернуться после evals. Чтение с разборами занимает около 6–7 часов, лабораторная — ещё 6–7.
Уточнить потребность, сформулировать проверяемые требования, восстановить контракт существующей системы, подготовить дельту, проверить реализацию и обновить основные спецификации без потери старых гарантий.
1. Зачем нужен Spec-Driven Development
SDD — способ вести разработку от явно описанного и проверяемого поведения системы. Спецификация задаёт договорённость; код реализует её; проверки дают доказательства. С AI-агентом это особенно полезно: агент способен быстро написать много правдоподобного кода, но недостающие правила он часто заполняет предположениями. Контекст чата неполон, сокращается и плохо передаётся другому участнику.
Спецификация сохраняет решения вне чата. Новая сессия получает правила и границы изменения, ревьюер видит согласованный результат, тесты проверяют обещанное поведение. При этом формальный документ может содержать неверные требования: SDD уменьшает неоднозначность, но не заменяет исследование проблемы и ответственность человека.
| Подход или артефакт | На какой вопрос отвечает | Связь с SDD |
|---|---|---|
| Промпт | Что попросить агента сейчас? | Передаёт задачу; может ссылаться на устойчивый контракт |
| Спецификация | Какое поведение согласовано? | Долгоживущий контракт и основа ревью |
| BDD | Как описать поведение на примерах? | Даёт язык сценариев; сценарии дополняют общие правила |
| TDD | Как построить реализацию через падающий тест? | Помогает реализовать и проверить часть контракта |
| Design doc / ADR | Как реализуем и почему так? | Фиксирует техническое решение отдельно от требований |
Пример. Просьба «выдай доступ после подтверждения» не определяет, кто подтверждает, допустимо ли самосогласование, что делать при повторе и когда доступ кончается. Промпт «сделай качественно» не устраняет эти вопросы. Нужны решения владельца процесса и проверяемый контракт.
Соразмерность. Для правки опечатки достаточно небольшого изменения. Для смены политики доступа нужны роли, переходы, ошибки и совместимость. Пишите столько, сколько требуется, чтобы следующий человек мог безопасно принять изменение; не генерируйте документы ради количества.
От потребности к доказательству
Выберите звено: у каждого артефакта своя работа и своя типичная ошибка.
Зачем меняем
Что обязано быть
В каких условиях
Чем проверили
2. От потребности к требованиям
Начните с проблемы и людей, для которых она существует. Заинтересованные стороны могут хотеть разного: сотруднику нужен быстрый доступ, владельцу документации — контроль, службе безопасности — невозможность самосогласования, поддержке — объяснение отказов. Перечень экранов ещё не является перечнем потребностей.
AS-IS описывает текущий процесс: сотрудник пишет в чат, руководитель отвечает, администратор выдаёт права вручную. TO-BE — согласованное изменение: заявка и решение фиксируются в сервисе. Из этого не следует, что сервис автоматически меняет реальные ACL: границу интеграции надо договорить отдельно.
| Шаг анализа | Артефакт | Пример Access Requests |
|---|---|---|
| Проблема и цель | Короткая постановка с метрикой | Решение по доступу должно быть доступно для проверки без поиска в чате |
| Границы | Контекст и non-goals | Сервис учитывает разрешения; SSO и выдача прав в реальной системе вне лабораторной |
| Термины | Глоссарий | Заявка — просьба; решение — approved/rejected; разрешение — основание для доступа |
| Источники | Владелец и ссылка на решение | Правило запрета самосогласования подтверждено владельцем процесса |
| Неизвестное | Открытый вопрос или допущение | От какого момента отсчитывать срок: создания или одобрения? |
Разобранное уточнение брифа
Исходная просьба: «Сделайте согласование доступа к документации». Аналитик спрашивает: кто подаёт и кто решает? Можно ли подать за другого? Что видит другой сотрудник? Может ли согласующий решить свою заявку? После ответа «сотрудник подаёт только за себя, согласующий не согласовывает своё» появляется два самостоятельных правила: принадлежность заявки и запрет самосогласования.
Записывайте решение отдельно от предположения. «Полагаем, что доступ бессрочный» нельзя незаметно превратить в SHALL. У каждого существенного вопроса должен быть владелец и понятное последствие отсутствия ответа. Неизвестное о безопасности блокирует соответствующее решение; выбор имени локальной переменной может остаться исполнителю.
Агент помогает найти противоречия, составить вопросы и оформить черновик. Утверждение «заказчик наверняка хотел 24 часа» не является источником требования. Просите явно помечать неизвестное и показывать, откуда взялось каждое бизнес-правило.
3. Подготовка требований системного анализа
От пользовательского намерения переходите к системному поведению. Пользовательское требование «согласующий принимает решение» раскладывается на допустимые роли, предусловия, переход состояния, результат, ошибки и повторные действия. Контракт API — наблюдаемая часть системы; внутренний класс контроллера — техническое решение.
| Что описать | Что спросить | Пример точного правила |
|---|---|---|
| Функции и данные | Какие входы, выходы, обязательные поля? | Заявка содержит владельца, ресурс и состояние; владелец берётся из проверенной идентичности |
| Бизнес-правила | Какие инварианты действуют всегда? | Согласующий не принимает решение по собственной заявке |
| Состояния | Какие переходы допустимы? | Из pending можно перейти в approved или rejected |
| Ошибки и повторы | Чем повтор отличается от противоречия? | Повтор approved возвращает прежний результат; approved→rejected даёт 409 |
| Время | Откуда часы и включена ли граница? | Срок отсчитывается от одобрения; при now ≥ expires_at доступа уже нет |
| Интеграции | Кто доверенный источник личности и результата? | В production личность поступает от проверенной сессии; в учебной модели — фиксированный адаптер |
| Нефункциональные условия | В какой среде и как измеряем? | Лабораторный сервер слушает loopback; данные живут до завершения процесса |
| Совместимость | Что будет с прежними данными и клиентами? | Ранее выданные бессрочные разрешения сохраняются после новой политики |
Состояние заявки и состояние доступа
Одобренная заявка — исторический факт решения. Истёкшее или отозванное разрешение — состояние права доступа. Если при отзыве поменять approved на rejected, история решения станет ложной. Разделение понятий в глоссарии предотвращает ошибку модели данных ещё до кода.
| Текущее состояние заявки | Событие | Результат |
|---|---|---|
| pending | Одобрение допустимым согласующим | approved; появляется разрешение |
| pending | Отклонение | rejected; разрешения нет |
| approved / rejected | Повтор того же решения | Прежний результат, без повторного эффекта |
| approved / rejected | Противоположное решение | 409; состояние сохраняется |
| approved | Отзыв разрешения | Заявка остаётся approved; это разрешение перестаёт давать доступ |
При двух одновременных противоположных решениях нужно выбрать политику. В лабораторной первым считается атомарно зафиксированное решение, второе получает конфликт. Просто «используем mutex» — описание реализации; «у заявки не бывает двух разных окончательных решений» — контракт.
Минимальный пакет аналитика
Контекст и границы; глоссарий; список вопросов и решений; требования с источниками и приоритетами; модель данных с инвариантами; матрица ролей; таблица состояний; контракты интерфейсов и ошибок; условия приёмки. Не для каждой задачи нужны все диаграммы: выбирайте форму, которая делает неоднозначность видимой.
4. Как писать хорошие требования и сценарии
Хорошее требование достаточно атомарно, понятно участникам, согласовано с остальными правилами и допускает проверку. Полнота означает покрытие существенного поведения в выбранных границах, а не попытку описать весь мир. Отдельно фиксируйте уровень обязательности: SHALL/MUST задают обязательство; SHOULD — рекомендацию с возможными исключениями; MAY — разрешённую возможность. В нормативных примерах OpenSpec этого модуля используем SHALL/MUST.
| Неудачная формулировка | Что не определено | Исправление |
|---|---|---|
| Доступ выдаётся безопасно | Какая угроза исключается? | Согласующий MUST NOT одобрять свою заявку; отказ не меняет состояние и не создаёт разрешение |
| Повторный запрос поддерживается | Какой запрос и какой эффект? | Повтор того же решения SHALL вернуть прежний результат без создания нового разрешения |
| Сервис отвечает быстро | Нагрузка, процентиль, точка измерения | Для реального сервиса: p95 ≤ заданного бюджета на указанном профиле нагрузки и стенде; для лабораторной SLA не обещаем |
| Добавить поле в класс Grant | Какое поведение нужно пользователю? | После истечения срока разрешение SHALL перестать давать доступ; поле и класс выбирает design |
Требование, сценарий и приёмка
Требование описывает общее правило; сценарий — конкретный случай его применения; критерий приёмки — условие, по которому принимают изменение. Один пример не исчерпывает правило. К успешному сценарию добавьте отрицательные, пограничные и повторные действия.
### Requirement: Decision authorization
The system SHALL allow an approver to decide a pending request
only when the approver is not its owner.
#### Scenario: Self approval is forbidden
- **GIVEN** carol is an approver and owns a pending request
- **WHEN** carol approves that request
- **THEN** the service returns 403
- **AND** the request remains pending and no grant is created
Given фиксирует исходные условия, When — действие, Then — наблюдаемый результат. «Когда всё корректно, тогда всё работает» не проверяет ничего. Для срока 1–24 часа нужны минимум допустимые границы, 0, 25, дробное значение, отсутствие поля и точный момент истечения.
Идентификаторы вроде DEC-01 помогают связать правило с источником и тестом. Они являются соглашением проекта. В OpenSpec заголовок требования также участвует в сопоставлении дельты: не переименовывайте его случайно при изменении формулировки. Шаблон дисциплинирует запись, но не доказывает её смысл.
5. Основная спецификация: зачем нужна мастер-спека
В этом курсе мастер-спека — согласованный набор основных спецификаций системы. В OpenSpec это обычно несколько файлов openspec/specs/<capability>/spec.md. Обязательного единого master.md нет. Основные спеки отвечают на вопрос «какое поведение сейчас принято», а история change-пакетов объясняет, как и почему оно появилось.
openspec/
specs/
access-requests/spec.md # создание и чтение заявок
access-decisions/spec.md # принятие решений и права
access-grants/spec.md # действующий доступ
changes/
temporary-access/ # предлагаемое изменение
proposal.md
specs/access-grants/spec.md
design.md
tasks.md
Capability — устойчивая возможность системы. Название access-grants переживёт несколько релизов; add-expiry-this-week описывает работу, поэтому подходит change, а не основной capability. Не дробите каждый метод в отдельный документ и не складывайте всё в безразмерный system: границу удобно ревьюить и поддерживать одним владельцем поведения.
Что хранить в основной спеке
Назначение возможности, обязательное наблюдаемое поведение, ошибки, ограничения, проверяемые сценарии. Бизнес-контекст можно вынести в аналитический документ со ссылкой; способ хранения времени — в design; причины выбора механизма — в ADR; последовательность реализации — в tasks. Изменение библиотеки без изменения поведения обычно не требует новой поведенческой дельты.
Принимаемое требование, реализованное поведение и развёрнутая версия — разные состояния. Файл main specs не является датчиком production. Указывайте версии, сохраняйте доказательства и разбирайте дрейф: исправить код, изменить договорённость или документировать временное ограничение. Не переписывайте контракт задним числом только ради зелёной проверки.
Пример. В baseline правило разрешает бессрочный доступ. План «ввести срок» пока живёт в change. До приёмки этой работы основные спеки не должны одновременно утверждать несовместимые политики. После согласованной синхронизации в них остаётся новый целостный контракт, включая исключение для ранее выданных разрешений.
6. Дельта-спеки: как менять контракт
Дельта-спецификация описывает изменение относительно основной спецификации выбранной базовой версии. Она позволяет ревьюеру видеть, что добавляется и что перестаёт быть истинным. Это семантическое изменение требований, которое затем надо согласовать с API, данными, тестами и миграциями.
| Операция | Когда применять | Важная деталь |
|---|---|---|
ADDED Requirements | Новое самостоятельное поведение | Не используйте для второй копии уже существующего правила |
MODIFIED Requirements | Меняется существующее правило | Полный итоговый блок со всеми сохраняемыми сценариями |
REMOVED Requirements | Обязательство перестаёт действовать | Причина и миграция; проверить последствия удаления |
RENAMED Requirements | Меняется имя требования | FROM/TO; само по себе не меняет поведение и не переименовывает capability |
Разобранный пример: добавляем срок
Было: «После одобрения доступ действует бессрочно». Решено: новым заявкам нужен срок 1–24 часа от одобрения; старые разрешения сохраняются. Изменения касаются создания заявки и проверки доступа. Одной фразы «добавить expires_at» недостаточно: не определены границы, повтор одобрения и совместимость.
## MODIFIED Requirements
### Requirement: Grant validity
The system SHALL grant access for newly approved requests until
approved_at + requested_hours. It SHALL keep legacy indefinite grants
valid unless revoked. Replaying approval SHALL NOT reset expiry.
#### Scenario: Exact expiration boundary
- **GIVEN** a new grant expires at 2026-11-05T12:00:00Z
- **WHEN** access is checked at 2026-11-05T12:00:00Z
- **THEN** that grant does not permit access
#### Scenario: Existing indefinite grant
- **GIVEN** a grant was issued under the indefinite policy
- **WHEN** the temporary-access policy is enabled
- **THEN** that grant remains valid
#### Scenario: Approval replay
- **GIVEN** a request was approved at 10:00Z for one hour
- **WHEN** the same approval is repeated at 10:30Z
- **THEN** its grant still expires at 11:00Z
Этот фрагмент показывает структуру; в настоящей дельте скопируйте весь изменяемый блок из своей базовой спеки и сохраните остальные сценарии, например проверку владельца и ресурса. MODIFIED заменяет требование целиком. Если оставить только сценарий истечения, при синхронизации можно потерять старые гарантии. Сохранение гарантии не означает буквальное копирование устаревших входов: после введения обязательного срока успешный сценарий создания должен передавать hours=1, а отдельный сценарий — проверять отказ без hours. Strict validator версии 1.16.0 выявляет пропущенные имена прежних сценариев, но не доказывает сохранность их смысла: ослабленный текст с прежним заголовком всё равно требует ревью.
## RENAMED Requirements
- FROM: `### Requirement: Check access`
- TO: `### Requirement: Grant validity`
## REMOVED Requirements
### Requirement: Indefinite access for new requests
**Reason**: New requests use bounded access duration.
**Migration**: Require 1–24 hours for new requests;
retain already issued indefinite grants.
Удалять можно только существующее требование с таким именем. Второй фрагмент — иллюстрация отдельных операций; его нельзя слепо добавить к любому baseline. В раздаточных материалах есть отдельное упражнение с подходящей базой. Если меняется и имя, и содержание, явно согласуйте RENAMED и MODIFIED с форматом закреплённой версии.
Что попадёт в основные спеки?
Сравните корректную дельту, неполную замену и две конфликтующие политики.
Бессрочный доступ; владелец и ресурс проверяются
Срок 1–24 часа + совместимость
Срок ограничен; прежние гарантии сохранены
Параллельные изменения
Одна ветка добавляет отзыв доступа, другая — продление. Git может слить разные файлы без конфликта, но продление случайно восстановит отозванное право. Нужен анализ общего инварианта: продление не снимает отзыв. Перед объединением перечитайте обновлённую базу, согласуйте политику, обновите оба набора сценариев и прогоните проверки на их сочетание.
7. Артефакты OpenSpec и работа с агентом
OpenSpec организует change как папку с контекстом изменения. Разделение файлов нужно для разных решений: зачем, какое поведение, каким способом, какими шагами. Если все четыре документа повторяют один и тот же текст, они создают четыре источника рассинхронизации.
| Артефакт | Содержание | Пример |
|---|---|---|
proposal.md | Проблема, scope, затронутые возможности и влияние | Нужен ограниченный по времени доступ; меняются заявки и разрешения |
specs/*/spec.md внутри change | Дельты требований и сценарии | Срок 1–24 часа; старый доступ сохраняется |
design.md | Реализация, альтернативы, компромиссы, миграции | Время выдачи хранится один раз; часы передаются зависимостью |
tasks.md | Проверяемые шаги реализации | Добавить тест границы; реализовать проверку срока; прогнать регрессии |
config.yaml | Контекст проекта, схема и правила документов | Стек, команды тестов, область учебного проекта |
В схеме spec-driven proposal даёт контекст для specs и design; tasks опираются на specs и design. Это граф зависимостей артефактов. Он помогает определить следующий доступный документ и не означает запрет пересмотреть ранее принятое решение.
Запрос агенту при подготовке изменения:
Прочитай основные спеки access-requests и access-grants целиком.
Найди требования, затронутые временным доступом.
Отдельно перечисли неизвестные бизнес-правила и риски совместимости.
Подготовь proposal и дельты; код пока не изменяй.
Для MODIFIED сохрани все сценарии, которые остаются действительными.
Человек проверяет смысл и границы, агент готовит черновик и ищет пропуски. Перед реализацией полезно дать новой сессии согласованные документы и минимальный релевантный контекст, а не весь разговор. Инструкции репозитория задают команды и правила работы; они не заменяют поведенческие спецификации. Любое предположение агента о бизнесе проверяется по источнику.
«Реализуй change temporary-access; сохрани сценарии baseline; после изменения покажи результаты тестов и соответствие сценариям». Одна галочка в tasks не является подтверждением выполнения: нужен наблюдаемый результат.
8. Жизненный цикл: от исследования до архива
- Исследовать. Прочитать текущие спеки, код и тесты, собрать вопросы.
- Согласовать изменение. Определить scope, подготовить proposal, дельты, design и задачи; провести ревью.
- Реализовать. Делать небольшие изменения с проверками. Если выяснилось новое ограничение, вернуться к документам и согласовать его последствия.
- Проверить. Формат документов, наблюдаемое поведение и смысл требований проверяются разными средствами.
- Синхронизировать. Внести принятые дельты в основные спецификации и проверить целостность результата.
- Архивировать. Сохранить change с историей решений. Git merge и развёртывание выполняются отдельно.
Как начать в существующем проекте
Выберите небольшую capability. Посмотрите реальные вызовы, обработчики, тесты и договорённости с потребителями. Составьте таблицу: наблюдаемое поведение / подтверждённый контракт / расхождение. Восстановленную по коду спецификацию отдайте на ревью владельцу: баг или случайная особенность не становятся обязательством автоматически. Зафиксируйте базовую версию и только затем описывайте дельту.
Пример: код позволяет одобрять собственную заявку, но владелец процесса считает это недопустимым. Нельзя написать «система SHALL разрешать самосогласование», потому что так удобнее пройти проверку baseline. Зафиксируйте дефект и отдельное исправление с регрессионным сценарием. Если же клиенты зависят от странного поведения, потребуется решение о совместимости и миграции.
Что означает завершение. Реализация проверена, изменения требований согласованы, доказательства доступны, основные спеки соответствуют принятому результату, change архивирован. Возможность технически архивировать незавершённую работу не делает её принятой. В учебном процессе не пропускаем приёмку и синхронизацию.
Рабочие команды агента могут анализировать код и предлагать изменения, но выводы агента требуют проверки. Терминальный CLI детерминированно создаёт структуру и проверяет формат. Не приписывайте CLI способность доказать бизнес-корректность программы.
9. Прослеживаемость, приёмка и ответственность
Трассировка связывает исходную потребность, правило, сценарий, проверку и результат. Она нужна, чтобы при изменении требования понять, что ещё проверить, а при провале теста — какое обещание нарушено. Для маленького проекта достаточно таблицы в Markdown.
| Правило | Сценарий | Проверка | Доказательство |
|---|---|---|---|
| DEC-01: нет самосогласования | carol решает свою pending-заявку | HTTP возвращает 403; состояние и разрешения неизменны | Результат теста с ревизией кода |
| GRANT-02: истечение | now = expires_at | Управляемые часы; access=false | Детерминированный тест без sleep |
| GRANT-03: совместимость | Старое бессрочное разрешение после смены политики | Доступ остаётся разрешённым | Миграционный тест с исходным состоянием |
| Уровень | Что доказывает | Чего не доказывает |
|---|---|---|
| Strict validation OpenSpec | Соответствие документов поддерживаемой структуре и правилам валидатора | Корректность бизнес-решений и работающего кода |
| Тесты, API-прогоны, evals | Наблюдаемое поведение на проверенных входах и условиях | Полноту исходных требований и отсутствие всех ошибок |
| Ревью человеком и приёмка | Соответствие цели, границам и согласованным рискам | Автоматически не заменяет воспроизводимые проверки |
Проверяйте не только ответ, но и отсутствие запрещённых эффектов. После 403 не должно появиться разрешение. После повтора одобрения не должен сдвинуться срок. После отзыва повтор старой команды не должен восстановить доступ. Тест «метод вернул true» слабее проверки наблюдаемого контракта, если ошибочный побочный эффект остался незамеченным.
Частая ловушка. Один агент придумал предположение, написал под него код и тесты, затем объявил соответствие. Документы и код согласованы между собой, но бизнес-задача не решена. Поэтому ревью исходных требований и независимые сценарии важнее уверенного отчёта. Не ослабляйте тест под реализацию без явного изменения договорённости.
10. Как специфицировать AI-системы
В AI-продукте есть две разные природы требований. Проверка прав, предел бюджета и подтверждение операции относятся к детерминированной обвязке. Полезность ответа и полнота цитирования зависят от модели и входа; для них нужны измеримые цели и процедура оценки. Формулировка «ассистент всегда отвечает правильно» непригодна для честной приёмки.
| Тип | Пример требования | Как принимаем |
|---|---|---|
| Инвариант доступа | Retrieval SHALL исключать документы без действующего разрешения пользователя | Негативные интеграционные сценарии, проверка фильтра до передачи контекста модели |
| Инвариант действия | Агент SHALL запрашивать подтверждение перед необратимой операцией | Проверка шлюза действий и траекторий |
| Цель качества | На frozen dataset версии v3 доля корректных ответов с подтверждающими цитатами ≥ заданного порога | Версия корпуса, выборка, оценщик, метрика, порог и статистическое правило приёмки |
| Стоимость и задержка | Бюджет на задачу; p95 ответа на согласованной нагрузке | Измерение на заданном стенде с определением начала/конца и ошибок |
Разобранная дельта для RAG
Было: «Возвращать ответ по найденным документам». Новое намерение: уменьшить неподтверждённые ответы. Перед дельтой надо определить, какой сигнал достаточности использует система, как выглядит отказ и как оценивается качество. Самооценка уверенности модели не является гарантией.
Строгая часть контракта: если retrieval не вернул разрешённых источников, сервис не передаёт чужие документы и возвращает согласованный ответ об отсутствии данных. Измеряемая часть: на датасете с ответимыми и неответимыми вопросами фиксируются отдельные показатели корректности и необоснованных ответов. Порог выбирают по риску, а не копируют из учебного примера.
Для воспроизводимости укажите набор и его версию, состав критичных срезов, модель/промпт, параметры, правила оценки и допустимую регрессию. Смена judge или корпуса тоже может изменить результат: это изменение процедуры приёмки, требующее ревью. Подробности — в модуле 8, контроль доступа и действий — в модуле 7, итоговая защита — в капстоуне.
Шпаргалка OpenSpec: команды и порядок
Справочник относится к OpenSpec 1.16.0. В чате агента используйте интеграционную форму имени, созданную init. Например, в Codex: $openspec-propose, $openspec-new-change, $openspec-continue-change, $openspec-apply-change, $openspec-verify-change, $openspec-sync-specs, $openspec-archive-change. Ниже — канонические имена /opsx:…; форма зависит от инструмента. CLI-команды openspec … выполняются в терминале и решают другие задачи. Перед обновлением версии сверяйте --help и документацию.
| Команда агента | За что отвечает | Когда вызывается |
|---|---|---|
/opsx:explore | Исследование кода, идей и неизвестных требований | Необязательно перед созданием change или при новых вопросах |
/opsx:propose | Создание change и планирующих артефактов | Начало основного пути; далее ревью |
/opsx:update | Согласованная правка документов change | При уточнениях до и во время реализации |
/opsx:apply | Реализация задач change | После согласования документов; повторяется для исправлений |
/opsx:verify | Проверка агентом соответствия кода артефактам | После реализации; расширенный workflow, не замена тестам |
/opsx:sync | Перенос дельт в основные спеки | После приёмки; можно отдельно до архива |
/opsx:archive | Архивирование change с проверкой состояния синхронизации | В конце цикла; не выполняет deployment |
/opsx:new | Каркас change без всех готовых документов | Альтернативный старт расширенного пути |
/opsx:continue | Следующий доступный артефакт | После new, повторять с ревью |
/opsx:ff | Все планирующие артефакты за один проход | Вместо повторных continue; ревью остаётся |
Основной путь:
[explore] → propose → ревью → apply → тесты → приёмка → sync → archive
Пошаговый путь лабораторной:
[explore] → new → continue → ревью → continue → …
→ apply → тесты → verify → приёмка → sync → archive
Уточнение: update → ревью → повтор затронутых проверок
[ ] = необязательный шаг; ff заменяет серию continue
В версии 1.16.0 нет отдельного пресета «expanded»: пошаговые действия включаются через custom с явным списком workflows (точные локальные команды — в README лабораторной). В текущем core доступны explore, propose, apply, update, sync, archive; для new/continue/ff/verify выбираются дополнительные workflows. Для обучения полезнее пошаговое создание с ревью: видна связь документов. OpenSpec не требует навсегда «закрывать» предыдущую фазу: уточняйте документы, когда узнали новое.
| CLI в терминале | Назначение | Место в процессе |
|---|---|---|
openspec --version | Проверить версию | Перед началом |
openspec init | Подключить проект и выбранного агента | Один раз в учебной копии |
openspec config profile | Выбрать workflows профиля | Перед расширенным путём; учитывайте область глобальных настроек |
openspec update | Обновить инструкции интеграции | После смены профиля/CLI; отличается от /opsx:update |
openspec list / openspec list --specs | Посмотреть changes / основные спеки | Исследование и контроль состояния |
openspec status --change <name> | Состояние артефактов change | Во время подготовки |
openspec validate <name> --strict | Строгая проверка структуры change | После правок документов |
openspec validate --specs --strict | Проверка основных спецификаций | После baseline и sync |
В лабораторной CLI устанавливается локально с закреплённой версией; перед командами используется путь локального бинарника, указанный в README. В README настройка профиля изолируется через отдельные XDG_CONFIG_HOME и XDG_DATA_HOME: это позволяет выбрать дополнительные workflows без изменения настроек других проектов. Команды не требуют глобальной установки пакета.
Практика: Access Requests
Небольшой сервис хранит заявки на доступ к документации. В нём нет модели: SDD применяется к процессу разработки, а проверяемое поведение остаётся детерминированным. Это позволяет сосредоточиться на качестве требований и изменениях. Затем тот же процесс переносится на RAG.
Материалы в репозитории: examples/m17-sdd; Java-код — examples/java/m17-sdd. В локальном checkout откройте README первого каталога: бриф, задания, исходные спеки, эталон и команды запуска.
Один процесс, память до перезапуска, loopback HTTP. Alice и Bob — сотрудники, Carol — согласующий; ресурс — handbook или runbook. Заголовок X-User выбирает фиксированную учебную личность и не является production-аутентификацией. SSO, реальная выдача ACL, почта, база и multi-tenant не входят в проект. Выберите один стек; дважды выполнять задания не нужно.
Одобрение заявки и действительность доступа
Решение остаётся историей; меняется состояние разрешения. Вариант ниже моделирует одно разрешение.
Этап 1. Анализ и восстановление baseline
Сначала прочитайте бриф, сформулируйте вопросы и зафиксируйте допущения. Затем сверьтесь с решениями условного заказчика в материалах. Запустите baseline, исследуйте API и тесты. Подготовьте глоссарий, границы, матрицу ролей, переходы и основные спеки трёх capabilities. Готовые исходные спеки используйте для сверки после своей попытки.
Приёмка: ясно различаются заявка, решение и разрешение; описаны чужое чтение, самосогласование, повтор и конфликт; основные спеки проходят strict validation; поведение подтверждено тестами. Исходный доступ бессрочный — это согласованное правило baseline.
Этап 2. Дельта temporary-access
Владелец требует срок 1–24 часа от одобрения для новых заявок. Ранее выданные бессрочные разрешения сохраняются. Подготовьте change с proposal, дельтами, design и задачами; проведите ревью до кода. Реализуйте изменение с агентом или вручную.
Приёмка: 1 и 24 допустимы; 0, 25, дробь и пропуск отклоняются; ровно на expires_at права нет; повтор одобрения не продлевает срок; legacy grant остаётся действующим. Время контролируется часами теста. Старую pending-заявку без срока после обновления можно отклонить, но нельзя одобрить: для этого нужна новая заявка со сроком. После проверок синхронизируйте основные спеки и архивируйте change.
Этап 3. Отзыв и конфликт дельт
Добавьте отзыв разрешения согласующим с непустой причиной. Заявка остаётся approved, отозванное разрешение больше не даёт доступ. Повтор с той же причиной идемпотентен, с другой — конфликт. Исследуйте параллельное предложение о продлении, написанное на старой базе: оно не должно возвращать отозванный доступ.
Приёмка: отрицательные сценарии доступа, отзыв и повтор после отзыва покрыты проверками; конфликты требований разрешены письменно; основной контракт обновлён, второй change архивирован. Продление достаточно проанализировать, реализовывать его не обязательно. Отдельное документное упражнение закрепляет REMOVED и RENAMED на подходящей базе.
Этап 4. Приёмка и передача проекта
Соберите актуальные основные спеки, два архивных change-пакета, матрицу трассировки, решение конфликта и результаты проверок. Дайте другому человеку восстановить правила и запустить тесты по README. Эталон reference сравнивайте после самостоятельной реализации, анализируя поведение, а не сходство кода.
Приёмка: из каждого требования понятно, чем оно проверено; нет потерянных сценариев; формат CLI и тесты программы проверены отдельно; ограничения учебного сервиса описаны. Дополнительно примените процесс к одному изменению собственного RAG-проекта, например к политике отказа при отсутствии доступных источников.
Самопроверка
1. Почему подробный промпт ещё не означает SDD?
Нужен управляемый контракт, связанный с изменениями и проверкой результата. Промпт может запустить работу, но договорённости должны сохраняться, ревьюиться и обновляться вместе с системой.
2. Как отличить решение заказчика от допущения агента?
У решения есть источник и ответственный, подтвердивший правило. Допущение явно помечается, содержит последствия и вопрос на согласование. Уверенная формулировка агента не превращает неизвестное в требование.
3. Почему «использовать HashMap для заявок» обычно не требование?
Это выбор реализации. Если наблюдаемое поведение сохраняется при другой структуре данных, фраза относится к design. Ограничение на сохранность после перезапуска, напротив, наблюдаемо и относится к контракту.
4. Почему approved и active нельзя считать одним состоянием?
Approved фиксирует решение по заявке; active характеризует действующее разрешение. Срок может истечь или разрешение могут отозвать, при этом факт одобрения остаётся истинным.
5. Зачем нужна основная спека, если сохранены все changes?
Основная спека даёт целостный актуальный контракт без ручного воспроизведения истории изменений. Архив хранит причины и путь эволюции; оба представления нужны для разных вопросов.
6. Что произойдёт, если в MODIFIED оставить только новый сценарий?
При замене блока могут потеряться прежнее содержание и сценарии. Нужно исходить из полной базовой версии требования и явно сохранить то, что остаётся обязательным.
7. Когда ADDED, а когда MODIFIED?
ADDED вводит самостоятельное правило; MODIFIED меняет существующее. Добавление второй копии того же правила под новым именем порождает неоднозначность и усложняет будущие изменения.
8. Может ли отсутствие Git-конфликта означать безопасность объединения?
Нет. Отзыв и продление могут менять разные файлы, но нарушить общий инвариант. Нужны анализ сочетания политик и сценарий, запрещающий восстановить отозванное разрешение.
9. Как проверить точное истечение доступа без медленного sleep?
Передать управляемые часы и проверить моменты до границы, на границе и после. При now ≥ expires_at конкретное разрешение уже не даёт доступ. Результат должен зависеть от входного времени, а не планировщика теста.
10. Что доказывает успешный openspec validate --strict?
Документы прошли структурные и поддерживаемые семантические проверки CLI. Это не выполнение тестов сервиса и не доказательство, что требования соответствуют потребности заказчика.
11. Почему архивирование не равно выпуску в production?
Архивирование управляет change-артефактами; код может быть не слит и не развёрнут. Для выпуска нужны отдельные действия и критерии, включая проверку фактической версии.
12. Как сформулировать требование к качеству RAG?
Указать задачу, версионированный набор, метрику, критичные срезы, пороги и процедуру оценки. Строгие гарантии доступа проверять отдельно. «Всегда без ошибок» не является воспроизводимой оценкой вероятностного качества.
Вопросы с собеседований
Как вы подготовите задачу для coding agent из расплывчатого брифа?
Выясню цель и заинтересованные стороны, границы и термины, соберу вопросы. Зафиксирую подтверждённые правила и неизвестное, опишу контракт и негативные сценарии, согласую дельту и план. Агент получает документы и критерии проверки, а не свободу придумывать бизнес-процесс.
Как внедрить SDD в существующую систему без переписывания документации целиком?
Выберу одну capability, восстановлю наблюдаемое поведение по интерфейсам, коду и тестам, подтвержу контракт с владельцами и отмечу дефекты. На этом baseline проведу небольшое изменение; расширять покрытие буду по мере работы.
Что будете ревьюить в дельте на временный доступ?
Источник времени и момент отсчёта, включение границы, диапазон и единицы, совместимость старых разрешений, повтор и конкурентное одобрение, права участников, ошибки API. Проверю, что MODIFIED не потерял прежние сценарии и все затронутые capabilities учтены.
Как разделить требования, design doc и ADR?
Требования описывают поведение и внешние ограничения; design — устройство решения; ADR — значимый выбор, альтернативы и последствия. Один контракт допускает несколько реализаций; связь между документами сохраняется ссылками.
Агент говорит, что всё выполнено, но заказчик не принимает результат. Как разбираться?
Сопоставлю результат с согласованными сценариями и исходной потребностью. Возможны ошибка реализации, неполный контракт, неверное исходное решение или новое требование. Не буду автоматически переписывать тесты; сначала определю и согласую тип расхождения.
Как не превратить SDD в бюрократию?
Масштабирую строгость по риску. Маленькому изменению нужны короткий scope, дельта и несколько проверяемых сценариев. Подробные модели полезны для состояний, миграций и безопасности. Документ должен помогать принять решение или проверить обещание.
Что входит в доказательство готовности change?
Согласованные документы, успешные воспроизводимые проверки поведения, разбор критичных сценариев, отсутствие неучтённого scope, актуальные основные спеки, история решения и понятные ограничения. Галочки задач и структурная валидация сами по себе недостаточны.
Две дельты меняют одно право доступа. Как организовать совместную работу?
Согласую общую базу и владельца capability, выявлю пересечение инвариантов, определю порядок интеграции. После первой синхронизации пересмотрю вторую относительно новой базы, проверю сочетание сценариев и повторю приёмку.
Как спецификация для LLM отличается от контракта обычного HTTP-сервиса?
Детерминированные гарантии интерфейсов остаются строгими. Для семантического качества добавляются набор данных, оценщик, метрики и статистическое правило решения. Нужны версии процедуры оценки и анализ срезов, иначе цифры несопоставимы.
Источники
Проверенная учебная версия инструмента: OpenSpec 1.16.0. Документация ветки main меняется; команды лабораторной сверяются с закреплённым пакетом и его справкой. Аналитический шаблон и правила Access Requests — учебные решения, а не требования самого OpenSpec.
- OpenSpec: официальный репозиторий
- Concepts: основные спеки, изменения и дельты
- Workflows: итерации, синхронизация и архив
- Commands: действия AI-агента
- CLI: терминальные команды
- Схема spec-driven и формат артефактов
- Gherkin: язык сценариев
- RFC 2119: уровень обязательности требований
- RFC 8174: регистр нормативных ключевых слов