Files
specs/openspec/schemas/wealth-ledger-sdd-lab/schema.yaml
T
codex-bot b9ec11f5ba
Specs security / security (push) Successful in 8s
Specs verify / verify (push) Successful in 10s
refactor: make sdd-lab review-driven (WealthLedger/specs#66)
Replace executable schema checks with explicit review-driven readiness, add a requirement-writing profile, and incorporate review clarifications for source traceability and comparative validation.
2026-10-30 13:35:39 +03:00

795 lines
61 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: wealth-ledger-sdd-lab
version: 1
description: Экспериментальный Engineering Lab workflow — proposal + Change Profile → specs → выбранные analysis-артефакты → design ∥ qa-analysis → tasks → apply, 4 decision gates
# Контракт OpenSpec CLI: артефакт завершён, когда существует путь `generates`; `requires` — жёсткое ребро;
# условных артефактов в CLI нет. Поэтому условные артефакты ниже не требуются ни обязательными
# артефактами, ни apply. Выбор, порядок, gates и готовность — ручной Readiness Checklist в
# instruction `process-record`. Исполняемых проверок у schema нет: gates рекомендательные, их
# соблюдение обеспечивают основной агент и independent reviewer, а не CLI.
# Раскладка change: в корне — proposal, process-record, specs/, design, tasks;
# вся аналитика — в `analysis/`.
artifacts:
- id: proposal
generates: proposal.md
description: Намерение Change Owner — зачем, результат, scope, capabilities, evidence, открытые решения
template: proposal.md
instruction: |
Владелец: Change Owner; черновик — product-analyst. Gate: G1 Product Decision.
Назначение:
Proposal фиксирует, зачем нужно изменение, какой результат ожидается, где проходит
scope и какие решения ещё не приняты. Это не requirements, не system analysis и
не design.
Старт lab lifecycle (до первой записи):
- Change создаётся явно: `openspec new change <name> --schema wealth-ledger-sdd-lab
--store wealth-ledger-specs`. Schema не становится default и не применяется к
существующим changes.
- Small не идёт в OpenSpec: fix восстанавливает поведение, уже описанное canonical
spec (spec не меняется или уточняется без изменения смысла), — правка в том же
Issue. Fix, меняющий canonical behavior, — минимум `delivery` `standard`.
Lab schema принимает только Standard и Complex.
- Если есть research (`analysis/research.md`, Issue, внешний отчёт), прочитай его
выводы; Proposal ссылается на него в **Evidence**, а не копирует. Research может
закончиться решением не делать change — тогда change не создаётся.
- Общий протокол (Change Profile, gates, Readiness Checklist, делегирование) —
instruction `process-record`; он действует на каждой стадии. Прочитай его до
первой записи: `openspec instructions process-record`.
Прочитай сначала:
- Релевантные canonical specs из `specs/openspec/specs/` и AS-IS страницы `docs/`
(`overview.md`, `architecture/`, `domains/`, `integrations/`, `adr/`, `design/`).
- Код изучай не глубже, чем нужно для scope и impact.
Правила:
- Один Proposal = одно связное намерение; независимо поставляемое разделяй.
- Capabilities перечисляют каждую новую или изменяемую behavior spec точным path.
Если observable behavior не меняется — `.openspec.yaml: skip_specs: true`.
- Ломающее observable behavior помечай **BREAKING**.
- Evidence разделяет факты (с источником) и гипотезы.
- Open Decisions: вопрос, кто решает, что блокирует. Вопрос, меняющий scope или
capabilities, решается до G1.
Не включай: файлы/классы/функции/таблицы/ORM-сущности; библиотеки/фреймворки/
транспорт; контракты endpoint/payload/error-code; диаграммы; тест-планы; tasks/
план PR; пиксельные детали UI.
Обратная связь: пробел в research → research; остальное возвращается сюда.
Проверка:
- `openspec validate <change> --store wealth-ledger-specs` (Why/What Changes);
структурный успех не является approval.
- Затем создай `process-record.md` (Change Profile) и предъяви на G1 оба файла.
requires: []
- id: research
generates: analysis/research.md
description: Необязательное продуктовое исследование — входной контекст, не источник требований
template: research.md
instruction: |
Владелец: product-researcher. Условный, пишется до proposal: research — вход
Proposal, поэтому создаётся раньше `proposal.md`, а не по Change Profile (Profile
появляется позже и лишь фиксирует факт: `yes` — `analysis/research.md` есть в
change, `no` — ссылка на внешний источник или причина). Не требуется ни одним
артефактом и не блокирует apply. В gates не входит: это контекст, не утверждаемый
артефакт.
Trigger: новый продуктовый функционал, незнакомая предметная область, конкуренты и
альтернативы, проверка гипотезы, высокая продуктовая неопределённость.
Исследование уже есть вне change (Issue, `audit-results/`, отчёт) — не копируй,
Proposal ссылается на источник.
Research понадобился после G1 (новая неопределённость) — это Open Decision в
Proposal: research дописывается, Proposal обновляется, G1 инвалидируется.
Правила:
- Каждое утверждение помечено: [F] факт с источником, [I] интерпретация, [H] гипотеза.
- Не выдумывай источники, цифры и пользователей; нет данных — так и напиши.
- Рекомендация допускает «не делать» и «сузить scope».
Не включай: окончательные requirements, обязательные архитектурные решения,
контракты, tasks.
Обратная связь: выводы потребляет Proposal (Evidence, Scope, Open Decisions).
requires: []
- id: process-record
generates: process-record.md
description: Change Profile, решения gates, снятая работа и lab-журнал change
template: process-record.md
instruction: |
Владелец: основной агент (оркестратор). Change Profile утверждает Change Owner на
G1. Это журнал процесса, а не planning authority: requirements, контрактов и
design здесь нет.
## Общий протокол lab schema (действует на каждой стадии)
Режимы и классы:
- **Mode** `lab` — целенаправленная практика: G2 обязателен, independent review на
каждом gate, Lab Journal после каждой стадии, Retrospective перед archive;
условные артефакты можно выбирать ради названной практики.
- **Mode** `delivery` — минимально достаточный процесс: артефакты только по
risk-trigger, qa-analysis компактный, Lab Journal необязателен.
- **Class** `standard` | `complex`. Complex: межсистемно, деньги/синхронизация/
данные, необратимые миграции или высокая неопределённость. Mode и Class
независимы.
Шаблоны: HTML-комментарии в шаблонах — подсказки для автора. В готовом артефакте их
нет; удаляй до gate этого артефакта.
Качество требований: единый профиль для автора и reviewer —
`openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md`. До утверждения Specs
автор проходит нормоконтроль и смысловую проверку набора из раздела Review;
назначенный по режиму reviewer перепроверяет их на существующем G2/G3.
Результат — в Validation и Findings Gate Log. Вопрос, меняющий норму или ожидаемый
результат, блокирует gate; предпочтение стиля само по себе не блокирует.
Change Profile (обязательная таблица, все 10 строк):
- `yes` — только при конкретном trigger из instruction артефакта; в lab допустим
`yes` с названной практикой («lab: практика data mapping»).
- `no` — с конкретной причиной. Пустой документ с «N/A» вместо `no` запрещён.
- Profile меняется только решением Change Owner: строка текущего gate (G1–G3) со
Scope `change-profile`; все последующие gates при этом инвалидируются.
- Выбранный условный вход пишется раньше потребителя: research — до proposal;
ux-design, system-analysis, data-mapping, failure-model, nfr, observability,
security-analysis — до design, qa-analysis и tasks; test-cases, docs-impact —
до tasks.
Граница контроля:
- CLI проверяет только существование файлов и структуру delta specs. Profile,
порядок, gates и готовность — Readiness Checklist ниже: его проходит основной
агент, independent reviewer gate перепроверяет. Скриптов у schema нет.
- Checklist — не approval и не замена review: он ловит форму, смысл — reviewer.
- Результат checklist пишется в колонку Validation Gate Log
(`readiness: plan OK` | `readiness: apply OK` | список нарушений).
Следующий артефакт:
- `openspec status` показывает невыбранные условные артефакты как `ready`, а
`isPlanningComplete` остаётся `false`, пока они не созданы. Это ограничение CLI:
не создавай артефакт только потому, что он `ready`.
- Следующий артефакт — первый ещё не созданный и разрешённый последним approved
gate в порядке: proposal → process-record → specs → выбранные ux-design /
system-analysis и модули / security-analysis → design ∥ qa-analysis → выбранные
test-cases / docs-impact → tasks.
Decision Gates (Gate Log, только дописывание):
| Gate | Scope | Когда |
| --- | --- | --- |
| G1 Product Decision | proposal, change-profile | всегда |
| G2 Requirements Baseline | specs (+ system-analysis и модули для complex) | lab или complex |
| G3 Solution Approval | остальное planning, включая tasks | всегда |
| G4 Delivery Acceptance | implementation, review, QA, parity, docs | перед archive |
- Без G2 (delivery standard) specs входят в Scope G3.
- Complex: выбранные system-analysis, data-mapping, failure-model, nfr,
observability входят в G2, чтобы системные обязательства были согласованы до
design (contract-first). Hub не обязателен: утверждается только выбранное.
- Каждый артефакт утверждается только на своём gate: proposal — G1; change-profile
— G1 (позднее изменение — G2/G3); specs — G2 (без G2 — G3); system-analysis и
модули — G2 для complex, иначе G3 (или G2, если он есть); остальное planning —
G3. Approval на чужом gate не засчитывается. Scope G1–G3 содержит только эти ids;
неизвестный id — ошибка записи. Scope G4 — implementation, review, QA, parity,
docs.
- Решение gate явно разрешает черновик следующего пакета артефактов. Approval
перечисляет каждый id в Scope и дословно цитирует слова Change Owner из текущей
сессии или комментария Issue (со ссылкой). Никогда не записывай решение, которого
владелец не давал; существование файла или строки Gate Log — не approval.
- Состояние gate = его ПОСЛЕДНЯЯ строка в Gate Log. `rejected`,
`changes requested` и `invalidated: <причина>` снимают approval этого gate и всех
последующих; новое approval — по порядку. Прежний approved выше в журнале не
действует.
- Каждый gate разделяет: Artifact Validation (CLI + Readiness Checklist),
Independent Review (findings) и Decision Approval (владелец). Validation и
Findings заполняются до запроса решения.
- Смысловое изменение утверждённого артефакта: строка `invalidated: <причина>` для
gate, покрывающего самый ранний затронутый артефакт (снимает и все последующие),
затем повторное approval по порядку. Механические правки (опечатка, формат) не
инвалидируют.
- Release Approval — вне OpenSpec (release-it, Gitea); G4 его не заменяет.
Readiness Checklist (проходи целиком; любой пункт «нет» — нарушение):
plan — после каждого артефакта:
- [ ] `**Mode:**` = lab|delivery, `**Class:**` = standard|complex, Issue указан.
- [ ] Change Profile: ровно 10 строк, Selected = yes|no, Reason непустой; `yes` в
delivery называет trigger, в lab — trigger или практику.
- [ ] Нет файлов невыбранных условных артефактов; `skip_specs: true` ⇔ нет `specs/`.
- [ ] Каждый выбранный условный вход существует раньше потребителя (см. Change
Profile).
- [ ] В артефактах, предъявляемых на gate, нет HTML-комментариев шаблона.
- [ ] Каждая ссылка `` `capability` — `Requirement` `` указывает на heading из delta
или canonical spec; после RENAMED — только на новое имя.
- [ ] Gate Log: артефакт засчитан только на своём gate; в Scope нет неизвестных ids;
Scope G1 включает `change-profile`; состояние gate — по последней строке; каждое
approved содержит дословную цитату и непустую Validation.
- [ ] Specs: нет дублей `### Requirement:` в одном файле; MODIFIED/REMOVED/RENAMED
FROM ссылаются на существующий canonical heading.
- [ ] Для предъявляемых на gate Specs пройдены оба прохода Review из
spec-writing.md: качество требований и полнота/согласованность итогового набора;
нет нерешённых вопросов о нормативном поведении.
- [ ] test-cases: ids `TC-` уникальны, у каждого case есть Verifies в формате ссылки.
- [ ] Каждый файл `analysis/contracts/` и `analysis/diagrams/` упомянут в
`analysis/*.md`; JSON/YAML-контракты синтаксически валидны.
apply — plan плюс:
- [ ] Существуют proposal, process-record, specs (или `skip_specs: true`), design,
qa-analysis, tasks и все выбранные условные артефакты.
- [ ] Текущее состояние approved: G1; G2 (lab или complex); G3. Каждый существующий
артефакт (кроме research и process-record) входит в approved Scope.
- [ ] С момента approval нет смысловых правок утверждённых артефактов без
`invalidated`.
- [ ] Каждый ADDED/MODIFIED/REMOVED Requirement имеет строку в Coverage Matrix
qa-analysis и хотя бы одну task с ним в Covers. Упоминание вне матрицы и Covers —
не покрытие. REMOVED покрывается проверкой миграции/регрессии.
- [ ] В tasks есть Independent Review; Contract Parity при наличии
`analysis/contracts/`; раздел `## Docs Impact` в tasks.md, если docs-impact `no`.
- [ ] Descoped Work: каждая строка с причиной и gate G3/G4.
archive — apply плюс:
- [ ] Все tasks `[x]` или перенесены в Descoped Work.
- [ ] Состояние G4 — approved; Validation G4 содержит verify, review, QA, parity
(если есть контракты), docs.
- [ ] Lab: Retrospective заполнена.
Independent Review (lab — на каждом gate; delivery — минимум G4):
- G1: product-analyst ищет в проблеме и scope противоречия и скрытые решения.
- G2: qa-engineer — тестируемость; independent-reviewer — оба прохода Review из
spec-writing.md для delta и итогового набора с canonical specs.
- G3: independent-reviewer — согласованность specs ↔ analysis ↔ design ↔
qa-analysis ↔ tasks; без G2 также профиль Specs; security-reviewer, если выбран
security-analysis.
- G4: independent-reviewer — код против утверждённых артефактов; qa-engineer —
системная проверка по qa-analysis.
- Reviewer не исправляет артефакт; findings идут по правилам обратной связи.
Делегирование сабагентам:
- Сабагент — самостоятельный профессионал: не знает OpenSpec, gates и других
сабагентов. Основной агент выбирает роль, пишет Task Brief, получает результат,
размещает его в артефакте, проверяет согласованность и выносит вопросы человеку.
- Task Brief: профессиональная цель («спроектируй межсистемные взаимодействия
для …», а не «создай artifact system-analysis»); точные входные файлы и разделы;
ограничения из «Не включай» артефакта, сформулированные профессионально;
ожидаемые разделы ответа; правило «неизвестное — вернуть вопросом, не выдумывать».
- Сабагент не принимает решений за другие роли; конфликт с upstream возвращается
как finding.
Lab Journal (lab): строка после каждой стадии — уникальные находки (что нашла
только эта стадия), решения, риски, проблемы передачи контекста, skills, стоимость
(вызовы, токены/время), что переносимо на крупные проекты. Не пиши ожидаемые
результаты заранее.
requires:
- proposal
- id: specs
generates: "specs/**/*.md"
description: Нормативные black-box дельты поведения, бизнес-правила и инварианты
template: spec.md
instruction: |
Владелец: product-analyst (requirements engineering). Gate: G2 (lab/complex) или G3.
Reviewers: qa-engineer (тестируемость), independent-reviewer (согласованность).
Назначение:
Delta Specs — нормативный black-box контракт: что система обязана делать для
пользователя или внешнего наблюдателя. После archive становятся canonical specs.
Предусловия:
- G1 approved; используются только capabilities из Proposal.
- Для существующей capability прочитай canonical spec целиком.
- `skip_specs: true` — spec-файлы не создаются.
- Прочитай `openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md`: это единый
профиль написания и ревью, включая эталоны, а не необязательные советы.
Правила:
- Путь дельты — `specs/<capability-path>/spec.md`, capability-path точно из Proposal.
- Один Requirement = одно независимо принимаемое наблюдаемое обязательство или
инвариант. Единый атомарный результат не дроби по числу SHALL.
- Новая норма: субъект + SHALL / SHALL NOT + результат с явным условием, если оно
нужно. MUST / MUST NOT равнозначны; BCP 14 — по политике `config.yaml`.
- Общая норма, нужные определения/таблицы, затем ≥1 `#### Scenario:` для
ADDED/MODIFIED: GIVEN по необходимости, конкретные WHEN/THEN. Scenario не
создаёт новую норму. Существующие headings и сохраняемые Scenarios не теряй.
- Термины бери из затронутых specs и предоставленного глоссария; новое определение
размещай внутри владеющего Requirement, а не только в исследовании или примере.
- Бизнес-правила, инварианты (сохранение суммы, однократный учёт денег, знак и
точка округления), единицы и существенные границы — явные нормы и Scenarios.
Для ветвлений/жизненного цикла используй таблицы по профилю, без дублирования
правил прозой. Неизвестные пороги и политики не выдумывай.
- Допущение не оформляется как факт: неизвестное правило → вопрос в Open
Decisions Proposal с владельцем и зависимым требованием; зависимый gate ждёт
решения. Наблюдение в коде не подменяет согласованное намерение.
- Не дели Requirements по repositories; имена систем/транспорт/endpoints —
в system-analysis, если сама их identity не внешнее обязательство.
Delta-операции:
- `ADDED`; `MODIFIED` — ПОЛНЫЙ существующий блок со всеми scenarios, heading
точно; `REMOVED` — **Reason** и **Migration**; `RENAMED` — `FROM:`/`TO:`.
- Новая capability: `## Purpose` 1–2 предложения (≥50 символов).
- Не оставляй пустые разделы операций.
Формат ссылки (для всех downstream артефактов и Readiness Checklist):
`` `capability-path` — `Requirement heading` `` — heading точно. Пример:
`` `portfolio/holdings` — `Итог портфеля не учитывает дубли операций` ``.
Переименование heading после G2 — это RENAMED + invalidation; ссылки обновляются.
Не включай: детали реализации, поведение вне Proposal, «корректно»/«быстро»/
«удобно» без критерия, противоречия canonical specs.
Обратная связь: намерение/scope/capabilities → Proposal; системы/контракты/
mappings → system-analysis; детали взаимодействия → ux-design.
Проверка: `openspec validate <change> --strict --store wealth-ledger-specs`, затем
оба прохода Review из spec-writing.md. Успех CLI не доказывает полноту смысла;
проверяй delta вместе с получающимся canonical набором.
requires:
- process-record
- id: ux-design
generates: analysis/ux-design.md
description: Необязательный interaction design утверждённого поведения; часть Design package
template: ux-design.md
instruction: |
Владелец: ux-designer. Условный: только если Change Profile выбрал `ux-design`.
Gate: G3 вместе с design (единый Design package, отдельного UX approval нет).
Trigger: новые экраны, существенное изменение пользовательского сценария, редизайн,
сложные формы, многосостоянийный интерфейс. Иначе UI описывается в разделе
UI Implementation `design.md` (reuse или N/A с причиной).
Полномочия:
- ux-design — UX-часть единого Design package (не отдельный approval): внутри
пакета он один владеет flows, IA, состояниями, feedback, responsive и a11y.
design.md ссылается на него и фиксирует только инженерную реализацию UI.
- Observable behavior остаётся в Specs; UX не вводит новое поведение. Состояние или
ошибка, которых нет в Specs, — finding → Specs.
Правила:
- Ссылайся на Requirements, не пересказывай их.
- UI States — loading/empty/error/success/partial только там, где они реально
возможны.
- Визуальные материалы — по правилу Visual Package из instruction `design`.
- Используй существующую design system (`docs/design/`, UI kit `frontend`) прежде
нового паттерна; отклонение обоснуй.
Не включай: серверную архитектуру, контракты, дерево компонентов, state
management, data fetching.
Обратная связь: поведение → Specs; реализуемость → design; данные/ошибки
интеграции → system-analysis.
requires:
- specs
- id: system-analysis
generates: analysis/system-analysis.md
description: Необязательный hub межсистемного контекста — границы, flows, владение данными, контракты
template: system-analysis.md
instruction: |
Владелец: system-analyst. Условный: только если Change Profile выбрал
`system-analysis`. Gate: G2 для complex, иначе G3.
Trigger: новый или изменённый межсистемный контракт (HTTP API, внешняя интеграция,
event), изменение владения данными, несколько систем в одном flow, сложная
миграция/coexistence. Изменение внутри одного repo без контракта — не trigger.
Структура (hub + модули; каждый модуль — отдельный выбор Change Profile, hub для
модуля не обязателен):
- `analysis/system-analysis.md` — контекст, границы, As-Is/To-Be, impact,
ответственности, владение данными, обзор flows, семантика контрактов и ошибок на
границах, совместимость, ссылки на модули.
- `analysis/contracts/` — машиночитаемые target-контракты (OpenAPI/AsyncAPI/
JSON Schema/Proto). Не отдельный артефакт: принадлежит hub.
- `analysis/diagrams/*.mmd` — Mermaid sequence/state/data-flow, только если
помогают понять поведение. Каждый файл упомянут в hub или модуле.
- Модули: `data-mapping.md`, `failure-model.md`, `nfr.md`, `observability.md`.
- Расширения (audit, fraud, feature toggles, CMS, внешние системы) — новым
модулем только при реальном requirement; schema их не предопределяет.
Полномочия контракта (из v2):
- Новый или изменённый контракт определяется в `analysis/contracts/` до
реализации.
- Backend-generated OpenAPI остаётся исполняемым runtime-источником после
реализации и MUST быть семантически совместим с утверждённым target-контрактом
до G4.
- Не создавай второй вечный canonical OpenAPI в `specs/`; target-контракт остаётся
в архивном change. Расхождение generated ↔ target возвращает change сюда.
- Для существующего HTTP API прочитай текущий backend-generated OpenAPI
(`frontend/src/shared/api/spec/openapi.json` — опубликованный snapshot).
- Каждый контракт помечает совместимость: additive | breaking (+ migration).
Правила:
- Не вводи observable behavior молча: пробел → Specs и повторный G2/G3.
- Hub не копирует модули; модуль не копирует hub.
- Нет внутренних классов/модулей/таблиц БД/developer tests.
Обратная связь: поведение → Specs; внутренняя реализация → design; проверка →
qa-analysis.
requires:
- specs
- id: data-mapping
generates: analysis/data-mapping.md
description: Необязательный поле-в-поле mapping, преобразования и инварианты сохранения между системами
template: data-mapping.md
instruction: |
Владелец: system-analyst; reviewer — database-specialist при изменении хранения.
Условный: только если выбран `data-mapping`; hub не обязателен.
Trigger: преобразование данных между системами или моделями (внешний API →
domain, domain → API, агрегаты), денежные суммы, валюты, знаки, классификация
записей по группам.
Правила:
- Каждое target-поле: источник, преобразование, unit/валюта/scale, nullability,
default, валидация, поведение при ошибке.
- Инварианты: правила сохранения (сумма частей = итог, каждая денежная единица
учтена ровно в одном агрегате), знаки, точка округления — со ссылкой на
защищаемый Requirement. Нет Requirement — finding → Specs.
- Двойной учёт: каждый тип исходной записи, который может попасть в два агрегата,
и правило, относящее его ровно к одному.
- Большой mapping — машиночитаемый файл в `analysis/contracts/` со ссылкой отсюда.
Не включай: ORM/SQL/код mappers, retry/idempotency (failure-model).
Обратная связь: инвариант без Requirement → Specs; владение данными → hub;
реализация → design.
requires:
- specs
- id: failure-model
generates: analysis/failure-model.md
description: Необязательная семантика отказов на границах — таймауты, повторы, идемпотентность, частичный отказ, восстановление
template: failure-model.md
instruction: |
Владелец: system-analyst; reviewer — reliability-specialist.
Условный: только если выбран `failure-model`; hub не обязателен.
Trigger: внешняя интеграция, фоновая синхронизация, повторяемые операции,
многошаговая запись, возможны дубли/out-of-order/частичный отказ.
Правила:
- Каждый сценарий отказа: граница, отказ, обнаружение, требуемое поведение системы,
observable результат, Requirement.
- Идемпотентность: ключ, scope, срок хранения, результат повторного запроса/события.
- Частичный отказ: что остаётся согласованным, компенсация или восстановление.
- Обязательства формулируются на границе систем; механизм (lock, очередь,
транзакция) — design.
Не включай: численные SLO (nfr), выбор библиотек, код.
Обратная связь: новое видимое пользователю поведение при отказе → Specs;
механизм → design; проверка → qa-analysis.
requires:
- specs
- id: nfr
generates: analysis/nfr.md
description: Необязательные измеримые нефункциональные требования с порогами и способом измерения
template: nfr.md
instruction: |
Владелец: system-analyst; reviewer — reliability-specialist.
Условный: только если выбран `nfr`; hub не обязателен.
Trigger: значимые ограничения performance/availability/capacity/retention/security,
которые меняют design или проверку.
Правила:
- Каждый NFR: id, порог, способ измерения, обоснование/источник.
- Для численного порога определи единицы, условия/нагрузку, точки начала и конца
измерения, окно или агрегат по необходимости. Контекст измерения нужен,
чтобы разные авторы и QA проверяли одно обязательство.
- Нет порога — раздел Constraints Without Thresholds с владельцем решения; числа
не выдумывай. Если от порога зависит design или приёмка, вопрос блокирует
соответствующий gate до решения.
- Security-NFR живут здесь; security-analysis ссылается на них по id.
Не включай: механизмы достижения (design), семантику отказов (failure-model),
события наблюдаемости (observability).
requires:
- specs
- id: observability
generates: analysis/observability.md
description: Необязательные обязательства наблюдаемости — события, сигналы, корреляция, SLI и алерты
template: observability.md
instruction: |
Владелец: system-analyst; reviewer — reliability-specialist.
Условный: только если выбран `observability`; hub не обязателен.
Trigger: фоновые/асинхронные процессы, финансовые расчёты или синхронизация, где
оператор должен различать успех, частичный успех и отказ; новые SLI.
Правила:
- Семантические события с trigger и обязательными атрибутами (например,
`code=1 → NO_MONEY`); корреляция через границы систем.
- Диагностические сценарии: «когда X, оператор определяет Y по Z».
- SLI/алерты — только с определением и целевым значением; цель из nfr — ссылкой.
Не включай: SDK/exporter/logger/инфраструктуру (design), секреты и персональные
данные в атрибутах.
requires:
- specs
- id: security-analysis
generates: analysis/security-analysis.md
description: Необязательная threat model этого change — mitigations и остаточные риски
template: security-analysis.md
instruction: |
Владелец: security-reviewer. Условный: только если выбран `security-analysis`.
Gate: G3; требования к проверке исполняются на G4.
Trigger: authentication/authorization, токены и секреты, новая trust boundary,
чувствительные/финансовые персональные данные, внешняя интеграция, изменение
модели доступа. Без этих признаков не создавай.
Входы: Specs; system-analysis и nfr, если выбраны; существующие ADR и
`docs/architecture/cross-cutting/`.
Правила:
- Threat model только этого change (STRIDE — способ поиска, не чек-лист).
- Каждая mitigation назначена владельцу: observable требование → Specs,
межсистемное обязательство → system-analysis, механизм → design.
- Security-NFR не дублируй: ссылайся на id из `nfr.md`.
- Остаточные риски явно принимает Change Owner на G3.
Не включай: универсальный security checklist, эксплуатацию внешних систем, секреты.
requires:
- specs
- id: design
generates: design.md
description: Инженерный design — как affected repositories реализуют утверждённое поведение и системные обязательства
template: design.md
instruction: |
Владелец: solution-architect; reviewers — affected frontend/backend engineers,
database-specialist при миграциях. Gate: G3.
Назначение:
Как affected repositories реализуют свою сторону утверждённых Specs и выбранных
analysis-артефактов. Это не повторный system analysis.
Предусловия:
- Все выбранные условные входы из `analysis/` уже существуют (Readiness Checklist
`plan` без нарушений). Complex: выбранные system-analysis и модули утверждены
на G2.
- Протокол (gates, checklist, обратная связь) — instruction `process-record`;
Change Profile в `process-record.md` определяет, какие входы читать.
- Upstream контракты/sequences/mappings — входные ограничения.
Глубина:
- Delivery standard: Inputs, Implementation Impact Map, Decisions и
Risks / Trade-offs обязательны; остальные разделы — только при наличии
содержания (Solution Assessment и Rollback — по их trigger ниже); пустые удаляй,
не пиши N/A.
- Lab или complex: все разделы шаблона; N/A — с причиной в одну строку.
Правила:
- Не добавляй observable behavior и не меняй системные контракты. Нереализуемый
контракт → system-analysis, а не private-контракт здесь.
- Каждое существенное решение ссылается на driver: Requirement, id NFR, failure,
threat или ограничение. Новая технология/компонент без driver запрещены.
- UI: при ux-design — только инженерная реализация (композиция, state, data
fetching, как получается каждое UI-состояние); без ux-design — раздел
UI Implementation: new/changed/reuse/N/A с причиной и нужные экраны/состояния.
Неизменяемый UI и N/A макетов не требуют.
- Visual Package (единое правило для ux-design и UI Implementation): версия
пакета; для reuse — неизменяемый locator (store ID + path от OpenSpec root),
применимая часть и отличия; локальные PNG/SVG в `visuals/` с относительным путём,
назначением и SHA-256; SVG самодостаточен (без scripts, handlers, внешних
шрифтов/ресурсов); изменяемая внешняя ссылка не является утверждённой версией.
ux-design и design — один Design package с одним approval на G3.
- Solution Assessment обязателен для нового auth, security, storage, внешней
интеграции, observability, кеширования, конкурентности, общего tooling или иного
дорогого необратимого решения; иначе N/A + причина.
- Rollback обязателен для security, разрушающей миграции, публичного контракта и
труднообратимых решений.
- Developer verification определяют implementation owners; QA-матрицу не копируй.
- ADR Candidates: только долгоживущие архитектурные решения с альтернативами.
Не включай: утверждённые sequences/контракты/mappings (ссылки, не копии); UX flows/
состояния при наличии ux-design; QA-покрытие; план docs; tasks/план PR; длинный
production-код.
Обратная связь: намерение → Proposal; поведение → Specs; взаимодействие →
ux-design; контракты/mappings/отказы/наблюдаемость → system-analysis и модули;
угрозы → security-analysis.
requires:
- specs
- id: qa-analysis
generates: analysis/qa-analysis.md
description: Risk-based стратегия системной проверки, независимая от developer tests
template: qa-analysis.md
instruction: |
Владелец: qa-engineer. Gate: G3. Может выполняться параллельно с design.
Назначение:
Что проверить на уровне системы, чтобы доказать соответствие Specs и выбранным
analysis-модулям, и с какой глубиной — по риску.
Прочитай `openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md`: ожидаемый исход
берётся из нормы, а не из догадки QA или фактического поведения реализации.
Глубина (условные разделы внутри обязательного артефакта):
- Всегда: Risk Assessment, Coverage Matrix (строка на каждый ADDED/MODIFIED/REMOVED
Requirement с указанием Scenarios/ветвей правила и способа проверки), Gaps /
Blockers. При `skip_specs: true` матрица фиксирует существующее поведение или
согласованное ограничение для регрессии и его источник, без выдуманных дельт.
- Delivery standard: остальные разделы — только при наличии содержания; пустые
удаляй, не пиши N/A.
- Lab или complex: все разделы; Cross-system Verification обязателен при выбранных
system-analysis, failure-model или data-mapping (каждый failure id и инвариант
имеет проверку или обоснованный risk-based отказ).
Правила:
- QA проверяет поведение системы, не устройство кода; не предписывай unit/component
tests, mocks, процент покрытия.
- Не создавай поведение: неопределённый ожидаемый результат → пробел в Specs;
неопределённый flow/ошибка/контракт → пробел в system-analysis.
- Ссылайся на Scenarios, не переписывай их. Отдельные test cases — только через
артефакт `test-cases`.
- По риску проверь существенные границы, строки таблиц, переходы, повторы,
конкуренцию и отсутствие запрещённых побочных эффектов. Пропуск проверки —
явное `not verified: <риск-причина>` для названного случая в матрице, не молчание.
- Планы проверок отделены от результатов: результаты фиксируются на G4.
- Automation: black-box кандидаты API/E2E; QA repo пока нет — `deferred until QA
repo exists`.
Обратная связь: поведение → Specs; контракты/отказы → system-analysis;
testability hooks → design (как потребность, без проектирования).
requires:
- specs
- id: test-cases
generates: "analysis/test-cases/*.md"
description: Необязательный явный test design для рискованных сценариев, которым нужны конкретные данные, шаги или oracle
template: test-cases.md
instruction: |
Владелец: qa-engineer. Условный: только если выбран `test-cases`. Gate: G3.
Trigger: финансовые расчёты, сложные бизнес-сценарии, значимые интеграции, много
ошибок и граничных случаев, критичное пользовательское поведение — когда проверке
нужны конкретные данные, шаги или oracle, которых нет в Scenario.
Правила:
- Один файл на область: `analysis/test-cases/<area>.md`; id `TC-<AREA>-<NNN>`
уникален.
- Каждый case: Verifies (формат ссылки), риск/приоритет, предусловия, тестовые
данные, шаги, ожидаемый результат, кандидат в автоматизацию.
- Case добавляет информацию сверх Scenario (числа, комбинации, порядок событий,
расчётный oracle). Не добавляет — не пиши case; Coverage Matrix ссылается на
Scenario.
- Не копируй acceptance criteria дословно; ожидаемый результат выводится из
Requirement, а не придумывается. Неопределённость → пробел в Specs.
- Coverage Matrix qa-analysis ссылается на TC ids.
requires:
- qa-analysis
- id: docs-impact
generates: analysis/docs-impact.md
description: Необязательный план переноса знаний change в canonical AS-IS документацию
template: docs-impact.md
instruction: |
Владелец: documentation-engineer. Условный: только если выбран `docs-impact`.
Gate: G3.
Trigger: несколько docs targets, новый ADR, перенос диаграмм, изменение страниц
architecture/integration, lab-практика Documentation Impact Analysis. Иначе —
раздел `## Docs Impact` в tasks.md (targets или конкретная причина без изменений).
Модель документации: `docs/` — AS-IS (`overview.md`, `glossary.md`,
`architecture/`, `architecture/cross-cutting/`, `domains/`, `integrations/`,
`adr/`, `design/`). Принятый ADR не переписывается.
Правила:
- Переносится только знание, полезное после завершения change; без дневника
миграции.
- Не копируй машиночитаемый контракт в docs вторым источником истины.
- Каждая запись: Action, точный Target (существующий path проверен), Category,
итоговое AS-IS, Source, Verification.
- Перенос диаграмм по умолчанию — нет.
- docs-impact не редактирует `docs/`; tasks создают пункты `[docs]`.
requires:
- design
- id: tasks
generates: tasks.md
description: Упорядоченный по зависимостям delivery checklist по repositories с проверками, review и parity
template: tasks.md
instruction: |
Владелец: основной агент (координация delivery); reviewers — affected engineers.
Gate: G3.
Предусловия:
- design и qa-analysis существуют; все выбранные условные артефакты существуют
(Readiness Checklist `plan` без нарушений).
- Для complex/lab: G2 approved до записи tasks.
- Протокол (gates, checklist, Descoped Work) — instruction `process-record`.
Формат task:
`- [ ] X.Y [main|frontend|backend|docs|specs] <Kind>: <действие + результат>`
с полями **Covers**, **Source**, **Verification**, **Depends on**.
Kinds: Implementation, Migration, Automated Testing, Contract Parity, Docs,
Independent Review, QA Verification, Verification.
Обязательные tasks (только релевантные; отмеченные * проверяет Readiness Checklist):
- Implementation/Automated Testing по каждому repository согласно design.
- Migration: при изменении хранения — backup/rollback и проверка на копии данных.
- * Contract Parity: при наличии `analysis/contracts/` — сравнение backend-generated
OpenAPI/runtime с target-контрактом.
- Docs: из docs-impact или раздела `## Docs Impact`.
- * Independent Review: read-only review реализации против утверждённых артефактов.
- QA Verification: системные проверки по qa-analysis (и test-cases).
- Security: проверки из Validation Requirements security-analysis, если выбран.
- Native sync/archive — не task; canonical specs задачами не правятся.
Правила:
- Одна task = один repository + один независимо проверяемый результат.
- * Каждый ADDED/MODIFIED/REMOVED Requirement есть в Covers хотя бы одной task
(REMOVED — task миграции/регрессии).
- Covers в формате ссылки; неизвестный heading — нарушение checklist.
- У каждой task все четыре поля; Verification — наблюдаемая команда или результат,
а не «проверить, что работает».
- `[qa]` запрещён, пока QA repo не существует.
- Не создавай церемониальные tasks; нерелевантный Kind не нужен.
- Снятие после G3: удали task из tasks.md и запиши в `Descoped Work`
process-record с причиной и gate решения владельца.
Не включай: новое поведение/контракт/design/QA/docs-решение (→ upstream артефакт),
commits/branches, будущие результаты.
Обратная связь: смысловое изменение → самый ранний затронутый артефакт с
инвалидацией его gate и последующих.
requires:
- design
- qa-analysis
apply:
requires:
- tasks
tracks: tasks.md
instruction: |
Apply реализует утверждённый план и не переоткрывает upstream-решения без цикла
обратной связи.
Предусловия (CLI проверяет только наличие tasks.md, остальное — вручную):
- Readiness Checklist `apply` (instruction `process-record`) пройден целиком и
записан в Validation последней строки G3; любое нарушение блокирует apply.
Главное: все обязательные и выбранные артефакты существуют; текущее состояние
G1, G2 (lab/complex), G3 — approved по последней строке.
- Перед зависимой UI-работой проверь наличие и SHA-256 материалов из таблицы
Materials (ux-design или UI Implementation в design).
- Store `wealth-ledger-specs`; протокол — instruction `process-record`.
Загрузка контекста: `contextFiles` из apply instructions, затем `AGENTS.md` только
affected repositories, затем нужные upstream-разделы для каждой task.
Выполнение:
- Незакрытые tasks — в порядке зависимостей; один repository на task; делегируй по
роли (frontend-engineer, backend-engineer, database-specialist) с Task Brief.
- Checkbox отмечается только после наблюдаемого успеха Verification.
- Contract Parity: backend-generated OpenAPI семантически совместим с
target-контрактом.
- Independent Review выполняет independent-reviewer (read-only) по полному diff
против утверждённых артефактов; Major findings исправляются или возвращаются в gate.
- QA Verification выполняет qa-engineer по qa-analysis; результаты — в Gate Log G4.
- Lab: строка Lab Journal после implementation, review и QA.
- Снятие task — только решением владельца с записью в Descoped Work.
Перед archive (G4 Delivery Acceptance):
- Все tasks `[x]`; снятые — только через `Descoped Work`.
- Validation G4: developer checks, parity, вердикт review, результаты QA, docs.
- Lab: Retrospective заполнена.
- Readiness Checklist `archive` пройден и записан в Validation G4, затем
`openspec archive <change> --store wealth-ledger-specs`. Никогда
`--no-validate`. `--yes` подавляет и подтверждение обновления specs, и
предупреждение о незакрытых tasks, поэтому допустим только сразу после
пройденного checklist `archive` (в non-TTY агентской среде без него archive не
выполняется).
Семантика sync/archive: native archive обновляет canonical specs; `analysis/`,
контракты и process-record остаются в архивном change; `docs/` меняются только
tasks `[docs]`; значимые решения — неизменяемый ADR.
Обратная связь:
- намерение/scope → Proposal; поведение/инварианты → Specs; взаимодействие →
ux-design; системы/контракты/mappings/отказы/NFR/наблюдаемость → system-analysis
и модули; угрозы → security-analysis; внутренняя реализация → design; проверка →
qa-analysis/test-cases; docs → docs-impact; декомпозиция → tasks.
- При смысловом конфликте останови downstream-работу, приложи evidence,
инвалидируй gates начиная с самого раннего затронутого артефакта.