From d5a0e942a39441998e7815bcc5b81525d49b4422 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Fri, 30 Oct 2026 08:57:45 +0300 Subject: [PATCH 1/3] refactor: drop check.cjs and translate wealth-ledger-sdd-lab schema (WealthLedger/specs#66) Readiness rules move to a manual checklist with fixed gate semantics. Analysis artifacts live under analysis/; templates and instructions are in Russian. --- .../schemas/wealth-ledger-sdd-lab/check.cjs | 294 ------ .../schemas/wealth-ledger-sdd-lab/schema.yaml | 911 ++++++++++-------- .../templates/data-mapping.md | 18 +- .../wealth-ledger-sdd-lab/templates/design.md | 30 +- .../templates/docs-impact.md | 4 +- .../templates/failure-model.md | 9 +- .../wealth-ledger-sdd-lab/templates/nfr.md | 9 +- .../templates/observability.md | 9 +- .../templates/process-record.md | 54 +- .../templates/proposal.md | 13 +- .../templates/qa-analysis.md | 20 +- .../templates/research.md | 10 +- .../templates/security-analysis.md | 10 +- .../wealth-ledger-sdd-lab/templates/spec.md | 40 +- .../templates/system-analysis.md | 27 +- .../wealth-ledger-sdd-lab/templates/tasks.md | 28 +- .../templates/test-cases.md | 12 +- .../templates/ux-design.md | 17 +- 18 files changed, 668 insertions(+), 847 deletions(-) delete mode 100644 openspec/schemas/wealth-ledger-sdd-lab/check.cjs diff --git a/openspec/schemas/wealth-ledger-sdd-lab/check.cjs b/openspec/schemas/wealth-ledger-sdd-lab/check.cjs deleted file mode 100644 index 834874a..0000000 --- a/openspec/schemas/wealth-ledger-sdd-lab/check.cjs +++ /dev/null @@ -1,294 +0,0 @@ -#!/usr/bin/env node -// Deterministic checks for wealth-ledger-sdd-lab changes. OpenSpec CLI 1.13.1 has no conditional -// artifacts, gate records or archive policy, so this file covers only what the CLI cannot. -// It is the single source for profile, ordering, gate and readiness rules; schema.yaml points here. -// Semantic quality (contradictions, invented facts, design fit) stays with reviewers. -// -// Usage: node check.cjs [--root ] -// plan — artifact consistency while planning; missing gates are notes, not errors. -// apply — plan + every apply blocker is an error. -// archive — apply + all tasks done, G4 approved, lab retrospective. -// Exit: 0 ok, 1 violations, 2 invocation/environment error. -"use strict"; -const fs = require("node:fs"); -const path = require("node:path"); - -const SA_MODULES = ["data-mapping", "failure-model", "nfr", "observability"]; -// Primary file of each conditional artifact, relative to the change directory. -const PRIMARY = { - research: "research.md", - "ux-design": "ux-design.md", - "system-analysis": "system-analysis/system-analysis.md", - "data-mapping": "system-analysis/data-mapping.md", - "failure-model": "system-analysis/failure-model.md", - nfr: "system-analysis/nfr.md", - observability: "system-analysis/observability.md", - "security-analysis": "security-analysis.md", - "test-cases": "test-cases", - "docs-impact": "docs-impact.md", -}; -const CONDITIONAL = Object.keys(PRIMARY); -// A selected conditional input must exist before any of these files is written. -const BEFORE_SOLUTION = ["design.md", "qa-analysis.md", "tasks.md"]; -const DOWNSTREAM = { - research: ["specs", ...BEFORE_SOLUTION], - "ux-design": BEFORE_SOLUTION, - "system-analysis": BEFORE_SOLUTION, - ...Object.fromEntries(SA_MODULES.map((id) => [id, BEFORE_SOLUTION])), - "security-analysis": BEFORE_SOLUTION, - "test-cases": ["tasks.md"], - "docs-impact": ["tasks.md"], -}; -// Gate that may approve each artifact. Complex changes approve system analysis at G2 (contract-first). -const SA_IDS = ["system-analysis", ...SA_MODULES]; -const allowedGates = (id, complex, hasG2) => { - if (id === "proposal") return ["G1"]; - if (id === "change-profile") return ["G1", "G2", "G3"]; // later profile changes need a recorded decision - if (id === "specs") return hasG2 ? ["G2"] : ["G3"]; - if (SA_IDS.includes(id)) return complex ? ["G2"] : hasG2 ? ["G2", "G3"] : ["G3"]; - return ["G3"]; -}; -const NOT_APPROVED = new Set(["research", "process-record"]); // input context / the log itself -const REF = /`([a-z0-9][a-z0-9/-]*)`\s*[—–-]\s*`([^`]+)`/g; - -const fail = (msg) => { console.error(msg); process.exit(2); }; -const args = process.argv.slice(2); -const [mode, changeName] = args; -if (!["plan", "apply", "archive"].includes(mode) || !changeName) { - fail("Usage: node check.cjs [--root ]"); -} -const rootIdx = args.indexOf("--root"); -if (rootIdx > 0 && !args[rootIdx + 1]) fail("--root needs a path"); -const root = path.resolve(rootIdx > 0 ? args[rootIdx + 1] : path.join(__dirname, "..", "..")); -const changeDir = path.join(root, "changes", changeName); -if (!fs.existsSync(changeDir)) fail(`Change directory not found: ${changeDir}`); - -const errors = []; -const warnings = []; -const notes = []; -const rel = (p) => path.relative(changeDir, p); -const read = (p) => fs.readFileSync(p, "utf8"); -const at = (p) => path.join(changeDir, p); -const walk = (dir) => fs.existsSync(dir) - ? fs.readdirSync(dir, { withFileTypes: true }).flatMap((e) => - e.isDirectory() ? walk(path.join(dir, e.name)) : [path.join(dir, e.name)]) - : []; -const present = (p) => p === "test-cases" || p === "specs" - ? walk(at(p)).some((f) => f.endsWith(".md")) - : fs.existsSync(at(p)); -const mdFiles = walk(changeDir).filter((f) => f.endsWith(".md")); -const strip = (s) => (s ?? "").replace(/`/g, "").trim(); -// Columns: fixed count, the last cell keeps any `|` it contains. -const tableRows = (text, heading, columns) => { - const section = text.split(/^## /m).find((s) => s.startsWith(heading)); - if (!section) return null; - return section.split("\n").filter((l) => /^\|/.test(l)).slice(2).map((l) => { - const parts = l.replace(/^\|/, "").replace(/\|\s*$/, "").split("|"); - return [...parts.slice(0, columns - 1), parts.slice(columns - 1).join("|")].map((c) => c.trim()); - }); -}; - -finishIfMissing(); -const record = read(at("process-record.md")); - -// 1. Unfilled templates. -for (const f of mdFiles) { - if (read(f).includes(" + ## Source and Target -| Mapping | Source (owner) | Target (owner) | Direction | Trigger | +| Mapping | Источник (владелец) | Цель (владелец) | Направление | Trigger | | --- | --- | --- | --- | --- | ## Field Mapping -| Target field | Source field(s) | Transformation | Unit / currency / scale | Nullability | Default | Validation | On failure | +| Поле цели | Поля источника | Преобразование | Единица / валюта / scale | Nullability | Default | Валидация | При ошибке | | --- | --- | --- | --- | --- | --- | --- | --- | ## Invariants - + ## Double-counting and Classification Risks - + ## Transformation Errors diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/design.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/design.md index 0ba5533..091adbf 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/design.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/design.md @@ -1,22 +1,22 @@ # Engineering Design - + ## Inputs - + ## Architecture Drivers - + ## Technical Goals / Non-Goals ## Implementation Impact Map -| Area | Affected | Outcome or N/A reason | +| Область | Затронута | Результат или причина N/A | | --- | --- | --- | | main | | | | frontend | | | @@ -24,8 +24,8 @@ ## Decisions - + ## Components and Responsibilities @@ -33,16 +33,16 @@ ## Contract Implementation - + ## Cross-cutting Implementation ## UI Implementation - + ## Developer Verification Strategy @@ -50,8 +50,8 @@ ## Solution Assessment - + ## Risks / Trade-offs diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/docs-impact.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/docs-impact.md index 715218d..eeeca15 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/docs-impact.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/docs-impact.md @@ -1,12 +1,12 @@ # Documentation Impact - + ## Summary ## Documentation Changes -| Action | Target | Category | Resulting AS-IS | Source | Verification | +| Action | Target | Category | Итоговое AS-IS | Source | Verification | | --- | --- | --- | --- | --- | --- | ## Diagram Promotion diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/failure-model.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/failure-model.md index fb0e81e..3992ace 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/failure-model.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/failure-model.md @@ -1,19 +1,18 @@ # Failure Model - + ## Failure Scenarios -| ID | Boundary / step | Failure | Detection | Required system behavior | Observable result | Requirement | +| ID | Граница / шаг | Отказ | Обнаружение | Требуемое поведение системы | Наблюдаемый результат | Requirement | | --- | --- | --- | --- | --- | --- | --- | ## Timeouts and Retries ## Idempotency and Duplicate Handling - + ## Ordering and Concurrency diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/nfr.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/nfr.md index 586c35b..6d37f60 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/nfr.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/nfr.md @@ -1,14 +1,13 @@ # Non-Functional Requirements - + -| ID | Category | Requirement | Threshold | Measurement / evidence | Rationale / source | +| ID | Категория | Требование | Порог | Измерение / evidence | Обоснование / источник | | --- | --- | --- | --- | --- | --- | ## Constraints Without Thresholds - + ## Open Questions diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/observability.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/observability.md index e328a2f..40ea561 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/observability.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/observability.md @@ -1,11 +1,10 @@ # Observability - + ## Semantic Events -| Event | Trigger | Required attributes | Consumer / purpose | +| Событие | Trigger | Обязательные атрибуты | Потребитель / назначение | | --- | --- | --- | --- | ## Logs, Metrics and Traces @@ -14,11 +13,11 @@ ## SLI and Alert Conditions -| SLI | Definition | Target | Alert condition | +| SLI | Определение | Цель | Условие алерта | | --- | --- | --- | --- | ## Diagnostic Scenarios - + ## Open Questions diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/process-record.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/process-record.md index 28617c4..138a5fb 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/process-record.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/process-record.md @@ -1,17 +1,21 @@ # Process Record -**Mode:** -**Class:** -**Issue:** +**Mode:** +**Class:** +**Issue:** ## Change Profile - + -| Artifact | Selected | Reason | +| Артефакт | Выбран | Причина | | --- | --- | --- | | research | | | | ux-design | | | @@ -26,32 +30,38 @@ ## Gate Log - + -| Gate | Date | Scope | Validation | Findings | Decision | +| Gate | Дата | Scope | Validation | Findings | Decision | | --- | --- | --- | --- | --- | --- | ## Descoped Work - + -| Task | Reason | Gate | +| Task | Причина | Gate | | --- | --- | --- | ## Lab Journal - + -| Stage | Role / subagent | Unique findings | Decisions | Risks found / excluded | Handoff issues | Skills | Cost | Transferable | +| Стадия | Роль / сабагент | Уникальные находки | Решения | Риски найдены / исключены | Проблемы передачи | Skills | Стоимость | Переносимо | | --- | --- | --- | --- | --- | --- | --- | --- | --- | ## Retrospective - + diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/proposal.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/proposal.md index 8dc2c74..099715e 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/proposal.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/proposal.md @@ -1,7 +1,6 @@ # Proposal - + ## Why @@ -23,14 +22,16 @@ ## Success Criteria + + ## Evidence - + ## Assumptions / Dependencies ## Open Decisions - + diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/qa-analysis.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/qa-analysis.md index 3ef55db..32bf794 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/qa-analysis.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/qa-analysis.md @@ -1,20 +1,24 @@ # QA Analysis - + ## Risk Assessment -| Risk | Affected requirements | Likelihood | Impact | Verification depth | +| Риск | Затронутые требования | Вероятность | Ущерб | Глубина проверки | | --- | --- | --- | --- | --- | ## Coverage Matrix - + -| Requirement | Check | Level | Test cases | +| Requirement | Проверка | Уровень | Test cases | | --- | --- | --- | --- | ## Negative and Boundary Focus @@ -30,5 +34,3 @@ ## Regression Impact ## Gaps / Blockers - - diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/research.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/research.md index 0bd7c2d..8e0b3ed 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/research.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/research.md @@ -1,7 +1,7 @@ # Product Research - + ## Problem Statement @@ -11,7 +11,7 @@ ## Existing Solutions and Alternatives -| Option | What it does | Strengths | Weaknesses | Source | +| Вариант | Что делает | Сильные стороны | Слабые стороны | Источник | | --- | --- | --- | --- | --- | ## Evidence & Sources @@ -24,5 +24,5 @@ ## Recommendation - + diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/security-analysis.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/security-analysis.md index 6c39a93..fe789de 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/security-analysis.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/security-analysis.md @@ -1,7 +1,7 @@ # Security Analysis - + ## Scope @@ -11,16 +11,16 @@ ## Threats -| ID | Threat (STRIDE) | Attack scenario | Asset / boundary | Existing control | Likelihood / impact | +| ID | Угроза (STRIDE) | Сценарий атаки | Актив / граница | Существующий контроль | Вероятность / ущерб | | --- | --- | --- | --- | --- | --- | ## Recommended Mitigations -| Threat | Mitigation | Owner artifact (specs / system-analysis / design) | +| Угроза | Mitigation | Артефакт-владелец (specs / system-analysis / design) | | --- | --- | --- | ## Residual Risks ## Validation Requirements - + diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md index b838743..ecaad36 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md @@ -1,18 +1,32 @@ diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/system-analysis.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/system-analysis.md index 0467d0c..5680f63 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/system-analysis.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/system-analysis.md @@ -1,12 +1,11 @@ # System Analysis - + ## Requirement Coverage -| Requirement | Flow / contract | Module | +| Requirement | Flow / контракт | Модуль | | --- | --- | --- | ## System Context and Boundaries @@ -19,32 +18,32 @@ ## Data Ownership -| Data | Source of truth | Writers | Readers | +| Данные | Источник истины | Пишут | Читают | | --- | --- | --- | --- | ## Interaction Flows - + ## Contracts - + -| Contract | Producer → Consumer | File | Compatibility | Published source | +| Контракт | Producer → Consumer | Файл | Совместимость | Опубликованный источник | | --- | --- | --- | --- | --- | ## Error Semantics - + ## Compatibility / Migration ## Detailed Modules - + ## Open Questions diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/tasks.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/tasks.md index 9402737..708b685 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/tasks.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/tasks.md @@ -1,18 +1,24 @@ # Tasks - +Independent Review, QA Verification, Verification. +Пример: +- [ ] 2.1 [backend] Implementation: пропускать операции, чей внешний id уже сохранён + - **Covers:** `portfolio/holdings` — `Итог портфеля не учитывает дубли операций` + - **Source:** design.md Decisions D2; analysis/failure-model.md F3 + - **Verification:** `npm run verify` в backend; повторный импорт fixture оставляет итог 100.00 + - **Depends on:** 1.1 +Плохо: «Verification: проверить, что работает»; Covers с heading, которого нет в specs. --> -## 1. +## 1. ## Docs Impact - + diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/test-cases.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/test-cases.md index 4e8b8ae..e679190 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/test-cases.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/test-cases.md @@ -1,10 +1,10 @@ -# Test Cases — +# Test Cases — - + -### TC- +### TC- - **Verifies:** `capability` — `Requirement heading` / Scenario - **Risk / Priority:** @@ -13,4 +13,4 @@ - **Steps:** 1. - **Expected Results:** -- **Automation Candidate:** +- **Automation Candidate:** diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/ux-design.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/ux-design.md index 8dc07de..7142f18 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/ux-design.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/ux-design.md @@ -1,15 +1,14 @@ # UX Design - + ## User Goals ## User Flows - + ## Information Architecture and Screen Structure @@ -17,7 +16,7 @@ ## UI States -| Screen / region | Loading | Empty | Error | Success | Partial / stale | +| Экран / область | Loading | Empty | Error | Success | Partial / stale | | --- | --- | --- | --- | --- | --- | ## Validation Feedback @@ -26,15 +25,15 @@ ## Accessibility - + ## Design System Reuse ## Materials - + -| Material ID | Relative path / reference | Screen/state and purpose | SHA-256 | +| ID материала | Относительный путь / ссылка | Экран/состояние и назначение | SHA-256 | | --- | --- | --- | --- | ## Open UX Questions -- 2.54.0 From 4c13b1863fefbdae083432be5cd1d02c5d1da552 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Fri, 30 Oct 2026 10:50:19 +0300 Subject: [PATCH 2/3] spec: add requirement-writing profile to sdd-lab (WealthLedger/specs#66) --- .../schemas/wealth-ledger-sdd-lab/schema.yaml | 60 ++++- .../wealth-ledger-sdd-lab/spec-writing.md | 220 ++++++++++++++++++ .../wealth-ledger-sdd-lab/templates/nfr.md | 11 +- .../templates/process-record.md | 2 + .../templates/proposal.md | 4 +- .../templates/qa-analysis.md | 21 +- .../wealth-ledger-sdd-lab/templates/spec.md | 40 ++-- 7 files changed, 320 insertions(+), 38 deletions(-) create mode 100644 openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md diff --git a/openspec/schemas/wealth-ledger-sdd-lab/schema.yaml b/openspec/schemas/wealth-ledger-sdd-lab/schema.yaml index b632641..bf2c772 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/schema.yaml +++ b/openspec/schemas/wealth-ledger-sdd-lab/schema.yaml @@ -118,6 +118,13 @@ artifacts: Шаблоны: 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»). @@ -196,6 +203,9 @@ artifacts: 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-контракты синтаксически валидны. @@ -220,10 +230,11 @@ artifacts: Independent Review (lab — на каждом gate; delivery — минимум G4): - G1: product-analyst ищет в проблеме и scope противоречия и скрытые решения. - - G2: qa-engineer — тестируемость; independent-reviewer — противоречия с canonical - specs и пропущенные error/boundary случаи. + - G2: qa-engineer — тестируемость; independent-reviewer — оба прохода Review из + spec-writing.md для delta и итогового набора с canonical specs. - G3: independent-reviewer — согласованность specs ↔ analysis ↔ design ↔ - qa-analysis ↔ tasks; security-reviewer, если выбран security-analysis. + qa-analysis ↔ tasks; без G2 также профиль Specs; security-reviewer, если выбран + security-analysis. - G4: independent-reviewer — код против утверждённых артефактов; qa-engineer — системная проверка по qa-analysis. - Reviewer не исправляет артефакт; findings идут по правилам обратной связи. @@ -262,15 +273,27 @@ artifacts: - G1 approved; используются только capabilities из Proposal. - Для существующей capability прочитай canonical spec целиком. - `skip_specs: true` — spec-файлы не создаются. + - Прочитай `openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md`: это единый + профиль написания и ревью, включая эталоны, а не необязательные советы. Правила: - - Один Requirement = одно устойчивое observable behavior или инвариант. - - BCP 14 по политике `config.yaml`: uppercase SHALL/MUST — только для обязательств. - - У каждого Requirement ≥1 `#### Scenario:` с конкретными WHEN/THEN. + - Путь дельты — `specs//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, а не только в исследовании или примере. - Бизнес-правила, инварианты (сохранение суммы, однократный учёт денег, знак и - точка округления) и граничные случаи — явные Requirements/Scenarios. + точка округления), единицы и существенные границы — явные нормы и Scenarios. + Для ветвлений/жизненного цикла используй таблицы по профилю, без дублирования + правил прозой. Неизвестные пороги и политики не выдумывай. - Допущение не оформляется как факт: неизвестное правило → вопрос в Open - Decisions Proposal, а не выдуманный Requirement. + Decisions Proposal с владельцем и зависимым требованием; зависимый gate ждёт + решения. Наблюдение в коде не подменяет согласованное намерение. - Не дели Requirements по repositories; имена систем/транспорт/endpoints — в system-analysis, если сама их identity не внешнее обязательство. @@ -291,7 +314,9 @@ artifacts: Обратная связь: намерение/scope/capabilities → Proposal; системы/контракты/ mappings → system-analysis; детали взаимодействия → ux-design. - Проверка: `openspec validate --strict --store wealth-ledger-specs`. + Проверка: `openspec validate --strict --store wealth-ledger-specs`, затем + оба прохода Review из spec-writing.md. Успех CLI не доказывает полноту смысла; + проверяй delta вместе с получающимся canonical набором. requires: - process-record @@ -445,8 +470,12 @@ artifacts: Правила: - Каждый NFR: id, порог, способ измерения, обоснование/источник. + - Для численного порога определи единицы, условия/нагрузку, точки начала и конца + измерения, окно или агрегат по необходимости. Контекст измерения нужен, + чтобы разные авторы и QA проверяли одно обязательство. - Нет порога — раздел Constraints Without Thresholds с владельцем решения; числа - не выдумывай. + не выдумывай. Если от порога зависит design или приёмка, вопрос блокирует + соответствующий gate до решения. - Security-NFR живут здесь; security-analysis ссылается на них по id. Не включай: механизмы достижения (design), семантику отказов (failure-model), @@ -572,10 +601,14 @@ artifacts: Назначение: Что проверить на уровне системы, чтобы доказать соответствие Specs и выбранным analysis-модулям, и с какой глубиной — по риску. + Прочитай `openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md`: ожидаемый исход + берётся из нормы, а не из догадки QA или фактического поведения реализации. Глубина (условные разделы внутри обязательного артефакта): - - Всегда: Risk Assessment, Coverage Matrix (строка на каждый delta Requirement), - Gaps / Blockers. + - Всегда: Risk Assessment, Coverage Matrix (строка на каждый ADDED/MODIFIED/REMOVED + Requirement с указанием Scenarios/ветвей правила и способа проверки), Gaps / + Blockers. При `skip_specs: true` матрица фиксирует существующее поведение или + согласованное ограничение для регрессии и его источник, без выдуманных дельт. - Delivery standard: остальные разделы — только при наличии содержания; пустые удаляй, не пиши N/A. - Lab или complex: все разделы; Cross-system Verification обязателен при выбранных @@ -589,6 +622,9 @@ artifacts: неопределённый flow/ошибка/контракт → пробел в system-analysis. - Ссылайся на Scenarios, не переписывай их. Отдельные test cases — только через артефакт `test-cases`. + - По риску проверь существенные границы, строки таблиц, переходы, повторы, + конкуренцию и отсутствие запрещённых побочных эффектов. Пропуск проверки — + явное `not verified: <риск-причина>` для названного случая в матрице, не молчание. - Планы проверок отделены от результатов: результаты фиксируются на G4. - Automation: black-box кандидаты API/E2E; QA repo пока нет — `deferred until QA repo exists`. diff --git a/openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md b/openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md new file mode 100644 index 0000000..ccfbad5 --- /dev/null +++ b/openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md @@ -0,0 +1,220 @@ +# Spec Writing Profile + +Профиль написания и ревью требований `wealth-ledger-sdd-lab`. Цель — одинаковое +понимание поведения разными авторами, разработчиками и QA, а не дословно одинаковые +документы. Это адаптация инженерных практик, не заявление о соответствии стандартам. + +## Scope + +Автор и reviewer читают профиль перед подготовкой или согласованием Specs. Правила +применяются к новым и изменяемым требованиям; весь canonical store ради стиля не +переписывается. Пути, delta-операции и gates задаёт `schema.yaml`. + +Specs определяют наблюдаемое поведение. Обоснования и открытые решения — в Proposal, +межсистемные детали — в `analysis/`, механизмы — в design, способы доказательства — +в QA. Ни один downstream-артефакт не вводит новое поведение молча. + +## Writing Rules + +1. **Основание.** Каждое обязательство следует из согласованного намерения или + существующего контракта. Наблюдение в коде, гипотеза и пример — не решение + владельца. Неизвестное запиши в Open Decisions: вопрос, кто решает, зависимое + требование и что блокируется. Несогласованные числа и варианты не становятся нормой. +2. **Термины.** Используй названия из затронутых canonical specs и предоставленного + проектного глоссария. Один термин — одно значение в названном контексте. «Счёт», + «брокерский счёт» и «учётная запись» не взаимозаменяемы. Новый или спорный термин + определи в теле владеющего им Requirement; остальные требования ссылаются на него. + Определение должно различать случаи, а не заменять слово синонимом. Общие термины + передаются в глоссарий через Docs Impact; новый файл словаря на каждый change не нужен. +3. **Атомарность.** Один Requirement — одно независимо принимаемое обязательство. + Если одну часть можно принять, а другую отклонить — раздели. Связанные условия, + сохранность данных при отказе и единый атомарный результат остаются вместе. + Число союзов или SHALL не определяет атомарность. +4. **Явная норма.** Назови субъект, условие применимости и наблюдаемый результат. + Для нового обязательства предпочитай SHALL / SHALL NOT; существующие MUST / + MUST NOT равнозначны и сохраняются. SHOULD / MAY не заменяют неопределённый исход: + допустимая вариативность и исключения должны быть согласованы и описаны. + «Корректно», «быстро», «при необходимости», «и/или», «и т. д.» без определения — + повод уточнить правило. Краткость не оправдывает потерю условий. +5. **Величины и границы.** Для расчёта задай входы, формулу, знак, валюту, точность + и момент округления, если они влияют на результат. Для периода — включительность + границ, дату/время учёта и часовой пояс; для порога — сравнение и точку отсчёта. + Различай ноль, отсутствие значения и неизвестный результат. Не добавляй допуск, + таймаут или округление без источника только ради измеримости. +6. **Свобода реализации.** Описывай «что», а не внутренние классы, библиотеки или + алгоритм. Если внутренний механизм можно заменить без изменения внешнего + обязательства, это design. Внешний формат или протокол допустим в Specs, когда + именно он является согласованным обязательством, а не удобством реализации. + +## Requirement and Scenario + +Порядок блока: `### Requirement:` с устойчивым именем → общая норма → нужные +определения/таблица → `#### Scenario:`. Для новых требований используй короткое имя +на русском; существующие headings сохраняй для native delta-сопоставления. + +Выбирай форму по смыслу (адаптация EARS, не дополнительный синтаксис OpenSpec): + +| Смысл | Каркас нормы | +| --- | --- | +| Постоянное свойство | Система SHALL … | +| Реакция на событие | При … система SHALL … | +| Зависимость от состояния | Пока … система SHALL … | +| Ошибка или исключение | Если … система SHALL … | + +У ADDED/MODIFIED Requirement минимум один Scenario. GIVEN нужен, когда исходное +состояние влияет на результат; WHEN задаёт событие; THEN — наблюдаемый исход с +определённым ожидаемым значением или составом, не «работает правильно». AND уточняет +тот же исход. Шаги не описывают внутренние вызовы и селекторы UI. + +Сначала общее правило, затем различающие примеры: основной путь, существенная +граница, иной исход, отказ, повтор или конкуренция — по применимости. Каждый сценарий +добавляет новый класс поведения. Не вводи правило только в Scenario и не переписывай +правило целиком для каждой комбинации данных. Сценарии показывают следствия нормы, +но несколько примеров не доказывают универсальный инвариант. + +## Representation + +| Когда прозы недостаточно | Представление и обязательные уточнения | +| --- | --- | +| Взаимодействуют несколько условий | Таблица решений: область входов, смысл «любое», политика совпадений (одна строка / первая / все), результат отсутствия совпадений или объяснение полноты | +| Результат зависит от истории | Переходы: исходное состояние, событие/условие, новое состояние, видимый эффект; существенные повторы и недопустимые переходы | +| Должно сохраняться свойство | Инвариант/формула с областью действия и единицами; примеры нуля, знака и округления по применимости | + +Нормативная таблица находится внутри Requirement до первого Scenario и вводится +фразой с SHALL. Она — единственное определение правила, а не копия соседней прозы. +Неоднозначные пересечения строк — дефект, если явно не задан приоритет или сбор +результатов. Таблица безусловно не нужна каждому требованию. Внутренние состояния +реализации и межсистемные схемы остаются в analysis/design. + +## Examples + +Учебные примеры формы, не продуктовые решения WealthLedger. В реальном change +периоды, состояния и исходы берутся из его согласованных входов. + +### Condition and Boundary + +```markdown +## ADDED Requirements + +### Requirement: Отбор операций за календарный период +При формировании отчёта система SHALL включать все и только операции выбранного +счёта, дата учёта которых входит в выбранный период включительно по Europe/Moscow. + +#### Scenario: Последний день периода и следующий день +- **GIVEN** выбран период 01.10.2026–31.10.2026 и счёт A +- **AND** на счёте A есть операции X с датой учёта 31.10.2026 и Y с датой 01.11.2026 +- **WHEN** формируется отчёт +- **THEN** отчёт включает X и не включает Y +``` + +Плохо: «Система SHALL корректно отбирать операции до конца месяца» — не определены +месяц, границы, дата отбора и счёт. «THEN список корректен» не позволяет проверить исход. + +### Decision Table + +```markdown +## ADDED Requirements + +### Requirement: Различимость неполного и пустого итога +Система SHALL представлять итог расчёта по таблице. «Полнота» означает получение +всех данных выбранной выборки; «есть записи» — наличие хотя бы одной записи. +Оба условия логические. Совпадает ровно одна строка; «любое» означает оба значения. +Покрыты все комбинации. + +| Полнота подтверждена | Есть записи | Видимый итог | +| --- | --- | --- | +| Нет | Любое | Недоступен, без числового итога | +| Да | Нет | Ноль и пояснение пустого результата | +| Да | Да | Рассчитанный итог | + +#### Scenario: Известная часть не становится окончательной суммой +- **GIVEN** известна одна запись на 100 RUB, но полнота выборки не подтверждена +- **WHEN** пользователь просматривает результат +- **THEN** итог обозначен как недоступный, не показан ни как 100 RUB, ни как ноль +``` + +Плохо: строки «нет данных → 0» и «данные не полны → недоступно» без определения +«нет данных» — одному входу могут соответствовать два разных результата. + +### State Transition + +```markdown +## ADDED Requirements + +### Requirement: Отмена формирования отчёта +При запросе отмены система SHALL изменять состояние формирования отчёта по таблице. +Область правила — состояния «Ожидает», «Отменён», «Готов»; начальное — «Ожидает». +Совпадает ровно одна строка. Таблица определяет только событие отмены. + +| До | После | Результат отмены | +| --- | --- | --- | +| Ожидает | Отменён | Отмена подтверждена, отчёт не будет сформирован | +| Отменён | Отменён | Отмена подтверждена без повторного эффекта | +| Готов | Готов | Отмена отклонена, готовый отчёт сохранён | + +#### Scenario: Повтор отмены +- **GIVEN** формирование отчёта уже отменено +- **WHEN** пользователь снова запрашивает отмену +- **THEN** отмена подтверждена, состояние остаётся «Отменён» +``` + +Плохо: «повтор ничего не делает» — не определён результат для пользователя. + +## Review + +Используй два прохода на существующем gate Specs (G2 или G3), не новый gate. +Автор выполняет самопроверку; назначенный по режиму reviewer перепроверяет независимо. + +| Проход | Что проверить | +| --- | --- | +| Нормоконтроль | Native headings/операции; термины и единицы; явные субъект/условие/исход; атомарность; корректные ссылки; Scenario с проверяемым THEN | +| Смысл и набор | Необходимость и происхождение норм; основной путь, альтернативы, отказы и границы; повторы/конкуренция/сохранность по риску; непротиворечивость таблиц и итогового baseline; отсутствие выдуманных решений | + +Проверь не только delta, но и получающийся набор вместе с canonical specs: +сохранились ли действующие ограничения, исключения, инварианты и сценарии? MODIFIED +заменяет полный блок; редакторское улучшение не разрешает удалить прежний сценарий +или незаметно переименовать Requirement. + +Профиль не отменяет ограничений установленного CLI. При предупреждении о длине +сократи повторения или раздели действительно независимые обязательства; не убирай +условия и не прячь норму в комментарий/код ради успешного `--strict`. + +Контрольный вопрос: «Назови существенную ошибочную реализацию и наблюдение, которым +это требование отличит её от соответствующей». Если ответ зависит от догадки, +укажи точную неопределённость. Это эвристика ревью, не доказательство полноты. + +Finding: **файл/heading + цитата → нарушенное правило → два возможных толкования +или недостающий исход → вопрос владельцу/адресат исправления**. Reviewer возвращает +находки, не переписывает текст по вкусу. Пример: «до конца месяца» → неясна правая +граница → операция в последний день включается или исключается → уточнить в Specs. +Нерешённый вопрос, меняющий требование или ожидаемый результат, блокирует его gate; +косметическое предпочтение не блокирует. Validation и Findings — в существующем +Gate Log, без нового отчёта на каждый Requirement. + +### Trial + +Для проверки эффекта дай одним и тем же авторам/моделям одинаковые входы: простое +правило, ветвление, повтор/состояние и MODIFIED. До сравнения зафиксируй согласованные +исходы и намеренно оставленные неизвестные. Сравни ответы независимых читателей на +контрольные вопросы, пропуски и выдуманные нормы, время уточнения и ревью. Совпадение +формулировок и успешный CLI не считаются доказательством одинакового понимания. + +## Sources and Adaptation + +Из девяти исследований `sdd-spec-quality/*.md` и трёх сводок `result/*.pdf` выбраны +правила с понятной пользой для ручного Markdown-процесса. Первоисточники проверены +30.10.2026; критерии адаптированы, а не перенесены как обязательная сертификация. + +| Источник | Что взято и где предел | +| --- | --- | +| [NASA SE Handbook, Appendix C, C.2–C.4](https://www.nasa.gov/reference/appendix-c-how-to-write-a-good-requirement/) | Необходимость, одна мысль, «что, а не как», проверяемость и согласованность; не сертификационный комплект документов | +| [INCOSE GtWR v4 Summary, с. 2–3](https://www.incose.org/wp-content/uploads/legacy/working-groups/requirements-wg/guidetowritingrequirements/incose_rwg_gtwr_v4_summary_sheet.pdf) | C1/C3/C5/C7 для отдельного требования, C10–C14 для набора; R4/R7/R33–R36 — термины, величины, время. Полный платный Guide не заявлен как проверенный | +| [EARS, автор методики](https://alistairmavin.com/ears/) | Каркасы условия/события/состояния/ошибки; русский язык — адаптация, не буквальная английская грамматика | +| [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119.html), [8174 §2](https://www.rfc-editor.org/rfc/rfc8174.html#section-2) | Значения uppercase SHALL/MUST и запретов; наличие ключевого слова само по себе не гарантирует качество | +| [Cucumber, Given/When/Then](https://cucumber.io/docs/gherkin/reference/) | Исходное состояние, событие, наблюдаемый исход; Markdown Scenario не становится исполняемым Gherkin-тестом | + +Из предложений не приняты: жёсткие лимиты слов/сценариев, подсчёт SHALL вместо +атомарности, обязательные REQ-ID и скрытые атрибуты, JSON-first, новые линтеры и gates. +Из нормоконтроля конструкторской документации заимствовано разделение проверки формы +и смысла; соответствие ГОСТ, DO-178C или ISO/IEC/IEEE 29148 не заявляется. Таблицы и +инварианты используются по риску; обязательная формальная модель каждому change не нужна. diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/nfr.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/nfr.md index 6d37f60..6fafc56 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/nfr.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/nfr.md @@ -1,13 +1,16 @@ # Non-Functional Requirements + строки есть согласованный порог с единицами, условия/нагрузка и способ измерения. + Для времени укажи точки начала/конца, для статистики — окно и агрегат. + Не превращай пример числа из исследования в утверждённую цель. --> -| ID | Категория | Требование | Порог | Измерение / evidence | Обоснование / источник | -| --- | --- | --- | --- | --- | --- | +| ID | Категория | Требование | Порог и единицы | Условия измерения | Измерение / evidence | Обоснование / источник | +| --- | --- | --- | --- | --- | --- | --- | ## Constraints Without Thresholds - + ## Open Questions diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/process-record.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/process-record.md index 138a5fb..7808107 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/process-record.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/process-record.md @@ -36,6 +36,8 @@ `changes requested` или `invalidated: <причина>`. Никогда не записывай решение, которого владелец не давал. ПОСЛЕДНЯЯ строка gate — его состояние; более поздняя rejected / changes requested / invalidated снимает этот gate и все последующие. + Для Specs: Validation отмечает нормоконтроль и смысловую проверку набора по + spec-writing.md; Findings — конкретные неясности/пропуски и их разрешение. Пример: | G1 | 2026-10-29 | proposal, change-profile | `openspec validate` OK; readiness: plan OK | product-analyst: 1 major — закрыт в Open Decisions | approved "ок, идём дальше" (сессия) | | G2 | 2026-10-30 | specs | `openspec validate --strict` OK; readiness: plan OK | qa-engineer: в Scenario нет значения THEN | changes requested | diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/proposal.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/proposal.md index 099715e..d45abe7 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/proposal.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/proposal.md @@ -34,4 +34,6 @@ ## Open Decisions + зависимое требование/артефакт и что блокируется до ответа. Несогласованное + правило, термин, порог или вариант поведения не заменяй допущением в Specs. + Пусто, только если таких вопросов нет. --> diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/qa-analysis.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/qa-analysis.md index 32bf794..a7e472b 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/qa-analysis.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/qa-analysis.md @@ -10,19 +10,25 @@ ## Coverage Matrix - + | `example-report` — `Отбор операций за календарный период` | Последний день периода и следующий день | Отчёт за октябрь включает X за 31.10 и исключает Y за 01.11 | API | ссылка на Scenario | --> -| Requirement | Проверка | Уровень | Test cases | -| --- | --- | --- | --- | +| Requirement / регрессионный baseline | Сценарии / ветви правила | Проверка / ожидаемое наблюдение | Уровень | Test cases | +| --- | --- | --- | --- | --- | ## Negative and Boundary Focus + + ## Cross-system Verification ## Test Data and Environment Needs @@ -34,3 +40,6 @@ ## Regression Impact ## Gaps / Blockers + + diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md index ecaad36..c850685 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md @@ -1,5 +1,8 @@ -- 2.54.0 From a8047ed0600bd803a2ebc2bb4d63392a4cb6ff4b Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Fri, 30 Oct 2026 13:34:08 +0300 Subject: [PATCH 3/3] spec: clarify sdd-lab requirement guidance (WealthLedger/specs#66) --- .../wealth-ledger-sdd-lab/spec-writing.md | 38 +++++++++++++++---- .../wealth-ledger-sdd-lab/templates/spec.md | 6 +++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md b/openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md index ccfbad5..1a6aa71 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/spec-writing.md @@ -20,6 +20,12 @@ Specs определяют наблюдаемое поведение. Обосн существующего контракта. Наблюдение в коде, гипотеза и пример — не решение владельца. Неизвестное запиши в Open Decisions: вопрос, кто решает, зависимое требование и что блокируется. Несогласованные числа и варианты не становятся нормой. + Для спорного или выведенного при анализе Requirement перед первым Scenario добавь + `**Источник (ненормативно):**` — ссылку на конкретное решение Change Owner в Issue + или пункт согласованной редакции контракта. Ссылка должна оставаться пригодной из + canonical spec после archive; относительной ссылки на активный Proposal недостаточно. + Источник объясняет происхождение, но не заменяет полную норму или approval; + обоснование остаётся в Proposal. 2. **Термины.** Используй названия из затронутых canonical specs и предоставленного проектного глоссария. Один термин — одно значение в названном контексте. «Счёт», «брокерский счёт» и «учётная запись» не взаимозаменяемы. Новый или спорный термин @@ -63,8 +69,9 @@ Specs определяют наблюдаемое поведение. Обосн У ADDED/MODIFIED Requirement минимум один Scenario. GIVEN нужен, когда исходное состояние влияет на результат; WHEN задаёт событие; THEN — наблюдаемый исход с -определённым ожидаемым значением или составом, не «работает правильно». AND уточняет -тот же исход. Шаги не описывают внутренние вызовы и селекторы UI. +определённым ожидаемым значением или составом, не «работает правильно». AND продолжает +предыдущий тип шага: дополняет исходный контекст, событие или ожидаемый исход. +Шаги не описывают внутренние вызовы и селекторы UI. Сначала общее правило, затем различающие примеры: основной путь, существенная граница, иной исход, отказ, повтор или конкуренция — по применимости. Каждый сценарий @@ -168,7 +175,7 @@ Specs определяют наблюдаемое поведение. Обосн | Проход | Что проверить | | --- | --- | | Нормоконтроль | Native headings/операции; термины и единицы; явные субъект/условие/исход; атомарность; корректные ссылки; Scenario с проверяемым THEN | -| Смысл и набор | Необходимость и происхождение норм; основной путь, альтернативы, отказы и границы; повторы/конкуренция/сохранность по риску; непротиворечивость таблиц и итогового baseline; отсутствие выдуманных решений | +| Смысл и набор | Необходимость и происхождение норм (у спорных/выведенных — источник действительно подтверждает норму, ссылка пригодна после archive); основной путь, альтернативы, отказы и границы; повторы/конкуренция/сохранность по риску; непротиворечивость таблиц и итогового baseline; отсутствие выдуманных решений | Проверь не только delta, но и получающийся набор вместе с canonical specs: сохранились ли действующие ограничения, исключения, инварианты и сценарии? MODIFIED @@ -193,11 +200,26 @@ Gate Log, без нового отчёта на каждый Requirement. ### Trial -Для проверки эффекта дай одним и тем же авторам/моделям одинаковые входы: простое -правило, ветвление, повтор/состояние и MODIFIED. До сравнения зафиксируй согласованные -исходы и намеренно оставленные неизвестные. Сравни ответы независимых читателей на -контрольные вопросы, пропуски и выдуманные нормы, время уточнения и ревью. Совпадение -формулировок и успешный CLI не считаются доказательством одинакового понимания. +Эффект профиля проверяется сравнительным пилотом; до результатов он не подтверждён. + +1. До запуска зафиксируй четыре одинаковых для обеих версий задания: простое правило, + ветвление, повтор/состояние и MODIFIED с исходной canonical spec. Для оценки отдельно + запиши согласованные исходы, намеренно оставленные неизвестные и контрольные вопросы. +2. Сравни прежнюю и изменённую инструкции минимум на двух авторах/моделях, каждый + выполняет обе версии. Сохрани входы, prompts, версии инструкций и моделей, доступные + настройки и результаты. Для LLM используй отдельные сессии без ответов другой версии; + для людей чередуй порядок версий, чтобы уменьшить эффект обучения. +3. Независимые читатели отвечают на одинаковые контрольные вопросы по полученным + спецификациям, не зная автора и версии инструкции. Ответы для оценки из шага 1 + раскрываются после чтения; согласие читателей само по себе не означает правильность. +4. По каждому заданию сравни расхождения трактовок, ошибки относительно согласованных + исходов, пропущенные случаи, выдуманные нормы и время уточнения/ревью. Сохрани + конкретные примеры ошибок вместе с результатами в Issue пилота. +5. Критерий улучшения согласуй до запуска: меньше смысловых расхождений без роста + ошибок, пропусков и выдуманных норм; допустимое изменение времени определяет владелец. + Если различий нет или данных недостаточно, эффект не подтверждён. Вывод ограничен + проверенными заданиями и авторами/моделями. Совпадение формулировок и успешный CLI + не считаются доказательством одинакового понимания. ## Sources and Adaptation diff --git a/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md b/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md index c850685..e675091 100644 --- a/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md +++ b/openspec/schemas/wealth-ledger-sdd-lab/templates/spec.md @@ -21,9 +21,15 @@ SHALL NOT — запрет; существующие MUST/MUST NOT равноз Сценарий: GIVEN — существенное исходное состояние, WHEN — событие, THEN — конкретный наблюдаемый исход. Минимум один Scenario; границы/отказы/повторы добавляй по смыслу. Новое правило в одном лишь сценарии недопустимо. +AND дополняет предыдущий тип шага GIVEN/WHEN/THEN. Термины определены, величины имеют единицы и границы. Неизвестное — вопрос в Open Decisions с владельцем и зависимым требованием, не придуманный ответ. +Для спорного/выведенного Requirement укажи источник перед первым Scenario по профилю. +Пример формата (подставь реальное согласованное решение): +**Источник (ненормативно):** [решение владельца](), пункт «Границы периода». +Ссылка остаётся пригодной после archive; норму полностью сформулируй в Requirement. + Учебный образец формы, не продуктовая политика: ## ADDED Requirements ### Requirement: Отбор операций за календарный период -- 2.54.0