Модуль 17

SDD и OpenSpec: от требований до проверенного изменения

Как превратить просьбу «давайте дадим доступ» в согласованный контракт, передать его coding agent и проверить результат. Системный анализ, основные и дельта-спецификации, работа с изменениями и приёмка. После теории — локальный сервис заявок на доступ, который вы измените дважды по процессу SDD.

12–14 часов с практикойGoJava 21 + Markdown3 интерактивные схемыOpenSpec 1.16.0

Рекомендуемый вход — после 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. У каждого существенного вопроса должен быть владелец и понятное последствие отсутствия ответа. Неизвестное о безопасности блокирует соответствующее решение; выбор имени локальной переменной может остаться исполнителю.

Роль AI в анализе

Агент помогает найти противоречия, составить вопросы и оформить черновик. Утверждение «заказчик наверняка хотел 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. Жизненный цикл: от исследования до архива

  1. Исследовать. Прочитать текущие спеки, код и тесты, собрать вопросы.
  2. Согласовать изменение. Определить scope, подготовить proposal, дельты, design и задачи; провести ревью.
  3. Реализовать. Делать небольшие изменения с проверками. Если выяснилось новое ограничение, вернуться к документам и согласовать его последствия.
  4. Проверить. Формат документов, наблюдаемое поведение и смысл требований проверяются разными средствами.
  5. Синхронизировать. Внести принятые дельты в основные спецификации и проверить целостность результата.
  6. Архивировать. Сохранить 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 не входят в проект. Выберите один стек; дважды выполнять задания не нужно.

Одобрение заявки и действительность доступа

Решение остаётся историей; меняется состояние разрешения. Вариант ниже моделирует одно разрешение.

pendingapprovedrejectedразрешение активноистекло / отозвано

Этап 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.