19 KiB
Context
SDD lifecycle уже опирается на canonical OpenSpec store, versioned engineering governance, repository-local routing и необязательные agent adapters. Сейчас эти слои частично повторяют lifecycle rules, а session state не связывает сохранённый approval с неизменностью одобренного artifact. Implementation ориентирована на полное завершение change за один outcome, Validation и Finalization местами повторяют evidence work, а Completion Evidence живёт вне canonical archive.
Подход должен сохранить OpenSpec единственной authority для change-specific
знания, docs/development — authority для общей policy и context discipline, а
active instructions — короткими routing entrypoints. Canonical workflow должен
оставаться выполнимым без конкретного AI-agent runtime. Все репозитории
независимы, CI отсутствует, а локальные gates выполняются под Node 22.
Goals / Non-Goals
Goals:
- Разделить vendor-neutral lifecycle core, repository-local boundaries и необязательные runtime adapters без дублирования общей policy.
- Представить Specification как две ограниченные последовательности с отдельной approval boundary перед каждым downstream artifact.
- Сделать persisted session navigation достаточной для точного продолжения, но не превращать её в альтернативу canonical artifacts или самостоятельное доказательство approval.
- Разрешить Implementation завершаться проверенным checkpoint и направлять Validation и Finalization по точным, не пересекающимся обязанностям.
- Хранить фактическое Completion Evidence вместе с canonical archive.
Non-Goals:
- Изменять пользовательское поведение WealthLedger, доменную модель или API.
- Вводить новый workflow engine, CI service либо обязательный agent runtime.
- Переносить Requirements, Design, Tasks или acceptance scenarios в session records, documentation или active instructions.
- Автоматически считать сохранённое состояние approval решением Change Owner.
Decisions
1. Canonical core и active entrypoints имеют разные обязанности
Общая lifecycle policy и context discipline остаются в двух versioned
vendor-neutral authorities внутри docs/development: первая определяет стадии,
ownership и completion safeguards, вторая — bounded reads, evidence batching и
handoff discipline. OpenSpec schema задаёт форму и stage-specific native
instructions для canonical artifacts. Root и repository-local active
instructions содержат только ссылочную маршрутизацию, локальные boundaries и
canonical gates.
Необязательные skills, commands и session records являются adapters поверх этой модели. Они могут автоматизировать routing и persistence, но canonical outcomes должны быть достижимы вручную через OpenSpec и repository gates. Общие правила не копируются в каждый adapter: adapter ссылается на authority и добавляет только runtime-specific mechanics.
Альтернатива — сделать agent skill tree источником полного workflow — отклонена:
она привязывает completion safeguards к одному runtime и создаёт расходящиеся
копии policy. Оставить дублирование во всех AGENTS.md также отклонено из-за
непроверяемого semantic drift.
2. Specification использует две bounded progression с четырьмя approval boundaries
Specification сохраняет одну роль, но делится на пары Proposal + Delta Specs
и Design + Tasks. После draft каждого artifact workflow ждёт explicit approval
его неизменившегося содержимого. Approval Proposal разрешает только Delta Specs;
approval Delta Specs завершает первую пару и направляет следующий Specification
outcome к Design. Аналогично approval Design разрешает только Tasks, а approval
Tasks — переход к Implementation.
Navigation state хранит для текущей границы наблюдённый approval status,
identity artifact и стабильный fingerprint его содержимого. Первичное значение
approved появляется только после явного решения Change Owner. При продолжении
fingerprint сверяется с canonical artifact: совпадение позволяет использовать
сохранённый observed status, отсутствие статуса требует повторного решения, а
несовпадение сбрасывает approval изменённого artifact и всех downstream
artifacts. Immutable record сообщает только наблюдённый переход и следующий
outcome; canonical content в него не копируется.
Альтернатива — всегда повторно спрашивать approval в новой сессии — безопасна, но противоречит требуемому восстановлению контекста. Approval только по имени artifact без fingerprint отклонён, потому что не обнаруживает semantic edit.
3. Session recovery читает один актуальный envelope
Mutable state остаётся единственным navigation pointer, а immutable phase record — self-contained handoff текущего outcome. Recovery сначала выбирает одну роль и один разрешённый outcome, затем читает только текущий record, phase-specific authority и canonical artifacts этой роли. Старые records доступны лишь как evidence при расследовании конкретного расхождения.
Обновление выполняется в порядке canonical outcome → immutable record → state pointer. Незавершённая запись не продвигает pointer; конфликт конкурентных
изменений остаётся видимым через filesystem/Git и не разрешается last-write-wins
логикой. Records не содержат Requirements, decisions, Tasks или acceptance
scenarios.
4. Implementation checkpoint является нормальным outcome той же роли
Implementation выбирает связный batch из ещё не выполненных approved Tasks. После реализации она отмечает только фактически завершённые canonical Tasks и сохраняет релевантные observed checks. Если implementation-owned Tasks остаются, outcome остаётся Implementation checkpoint с completed/remaining scope и одним следующим Implementation outcome; это не blocker и не готовность к Validation.
Только отсутствие remaining implementation-owned Tasks вместе с успешными
релевантными проверками создаёт READY_FOR_VALIDATION. Размер batch не задаётся
искусственным числом: граница определяется связностью изменения и возможностью
дать проверяемый checkpoint без частично нарушенного инварианта.
Альтернатива — требовать реализацию всего change за одну сессию — отклонена из-за неограниченного контекста и потери проверяемых промежуточных результатов.
5. Validation производит независимый verdict, Finalization только потребляет его
Validation выполняется в отдельной read-only роли относительно production code,
planning artifacts и Tasks. Она объединяет affected canonical gates, semantic и
acceptance verification, применимые edge cases и independent review в один
verdict: PASS, FAIL либо SPEC_ISSUE. Validation-owned проверки не
представляются implementation checkboxes.
Record PASS связывается с identity проверенных planning и delivery inputs.
Finalization проверяет, что эти inputs не изменились, но не повторяет актуальную
Validation. Отсутствующий или устаревший PASS направляется в Validation;
implementation finding — в Implementation; planning issue — к самой ранней
затронутой Specification boundary; retryable completion failure остаётся в
Finalization.
Альтернатива — разрешить Validation сразу исправлять findings — отклонена, поскольку смешивает независимый verdict с авторством изменений. Повторять все проверки в Finalization отклонено как дублирование уже привязанного к inputs evidence.
6. Completion Evidence формируется до archive только из существующих фактов
После успешной Validation delivery changes и их repository commits уже должны существовать. Finalization собирает фактическую Delivery Map, commit identifiers, точные observed gate outcomes и independent review result в Completion Evidence внутри active canonical change, затем архивирует change вместе с этой записью. После archive as-built remediation registry может ссылаться на canonical archive и не дублирует evidence.
Для N/A area сохраняется проверяемая причина без фиктивного commit или gate.
Если любой факт отсутствует, Completion Evidence не создаёт placeholder и
archive остаётся заблокирован. Тем самым archive является единственным
долговечным evidence bundle, а docs сохраняет только as-built navigation.
Альтернатива — вести отдельный evidence store в docs — отклонена, поскольку он расходится с change authority и усложняет восстановление terminal status.
Delivery Map
| Area | Status | Architectural outcome or N/A reason |
|---|---|---|
| frontend | affected |
Repository-local active instructions согласуются с vendor-neutral lifecycle authority и сохраняют только frontend boundaries и canonical gate. Product code и runtime behavior не меняются. |
| backend | affected |
Repository-local active instructions согласуются с vendor-neutral lifecycle authority и сохраняют только backend boundaries и canonical gate. API и runtime behavior не меняются. |
| specs | affected |
Canonical Delta Specs, OpenSpec schema instructions и completion/archive model закрепляют bounded Specification, Implementation checkpoints и разделение Validation/Finalization. |
| docs | affected |
Engineering governance, lifecycle/context documentation и remediation semantics становятся общей vendor-neutral authority и указывают на Completion Evidence в canonical archive. |
Workspace-owned root routing и optional runtime adapters меняются как orchestration surface, но не подменяют repository-owned outcomes из Delivery Map.
Contract Gate Decision
| Gate | Status | Reason |
|---|---|---|
| runtime-openapi | N/A |
Change не меняет backend API contract, frontend contract consumer или runtime OpenAPI snapshot. |
Solution Assessment
Change существенно меняет shared SDD tooling, поэтому оценены следующие варианты:
| Option | Fit and maturity | Security / operating cost | Constraints / migration cost |
|---|---|---|---|
| Расширить существующие OpenSpec schema, versioned Markdown authorities и малый navigation adapter | Высокое соответствие; OpenSpec уже является canonical store и поддерживает native artifact lifecycle | Не добавляет внешнего сервиса или credential surface; использует существующие local gates | Требует согласованно обновить active instructions и мигрировать текущий state envelope |
| Сделать vendor-specific skills/commands обязательным workflow engine | Хорошая автоматизация только внутри одного runtime; portability низкая | Добавляет runtime lock-in и отдельную поверхность сопровождения safeguards | Нарушает достижимость canonical outcomes без optional framework и усложняет переход между agents |
| Ввести отдельный general-purpose workflow/BPM/CI orchestrator | Зрелые продукты существуют, но их возможности существенно шире локального session routing | Добавляет сервис, конфигурацию, supply-chain и operational ownership | Непропорциональная миграция при отсутствии CI и серверной orchestration requirement |
| Написать собственный orchestration engine | Можно точно подогнать под state machine, но зрелость начинается с нуля | Максимальная стоимость тестирования, совместимости и поддержки | Дублирует OpenSpec lifecycle и создаёт новую authority boundary |
Выбран первый вариант: он расширяет уже ответственную платформу и сохраняет малый custom surface только для локальной навигации. Повторная оценка нужна, если появятся multi-user concurrent execution, обязательный remote CI или невозможность выразить новый lifecycle invariant native OpenSpec validation.
Risks / Trade-offs
- Fingerprint защищает approval от незаметного изменения artifact, но не превращает navigation state в криптографическое доказательство личности Change Owner. Модель доверия остаётся repository-local и явной.
- Разделение authorities снижает дублирование, но повышает важность корректных routing links. Canonical gates и scoped review должны обнаруживать broken links и противоречащие active instructions.
- Миграция активного change может встретить legacy state без approval binding. Такой state не угадывается: текущая boundary запрашивает решение повторно.
- Input-bound
PASSтребует точно определить relevant inputs. Слишком широкий набор вызывает лишнюю Validation, слишком узкий — риск stale verdict; binding включает все approved planning artifacts и affected delivery state. - Перенос Completion Evidence в archive меняет порядок Finalization. Archive остаётся заблокированным до существования delivery commits и всех observed verification facts.
Migration Plan
- Сначала изменить canonical schema и vendor-neutral lifecycle/context authorities так, чтобы новые state transitions, approval invalidation, checkpoint outcomes, verdict routing и archive evidence имели одно нормативное определение.
- Затем согласовать root и repository-local active instructions с новыми authorities, сохранив только routing, boundaries и local gates.
- После этого обновить optional runtime adapters и session envelope. Legacy state без artifact fingerprint остаётся читаемым для выбора change/phase, но не переносит approval автоматически.
- Перевести Implementation, Validation и Finalization adapters на новые outcomes и input bindings; удалить дублирующий evidence flow после появления canonical archive path.
- Завершить миграцию согласованной проверкой всех affected instruction surfaces и native OpenSpec lifecycle без зависимости от optional runtime.
Rollback Contract
| Field | Decision |
|---|---|
| Status | N/A |
| Reason | Изменение состоит из versioned process artifacts, local instructions и обратимого navigation state; оно не меняет auth/security, данные, public contract или необратимую runtime infrastructure. До завершения миграции прежние canonical artifacts сохраняются в Git, а legacy state без нового binding приводит к повторному approval, а не к потере данных. |
| Trigger | N/A |
| Actions | N/A |
| Data safety | N/A |
| Verification | N/A |