Files

277 lines
20 KiB
Markdown
Raw Permalink 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.
## Context
WealthLedger использует project-local OpenSpec schema поверх CLI 1.10.0,
canonical store в отдельном specs-репозитории и project-owned OpenCode
entrypoints в unversioned workspace root. Schema уже задаёт последовательный
artifact graph, а repository scripts защищают store authority, Delivery Map и
terminal verification. Однако planning quality до Apply проверяется
неравномерно, Tasks не имеют машиночитаемой связи с requirements и delivery
areas, а root agent projection проверяется только как локально существующее
состояние и не восстанавливается из четырёх Git-репозиториев.
Custom schema API остаётся experimental, поэтому совместимость нельзя безопасно
выводить только из SemVer. Root workspace не является Git-репозиторием;
versioned authority для новых guardrails и projection recovery должен
принадлежать `specs`, а as-built policy, audit snapshots и dispositions —
`docs`. Других active OpenSpec changes нет. Этот change создан по schema version
1, поэтому его собственные Tasks должны вручную соответствовать утверждённому
v2 contract до того, как Apply сделает этот contract default для будущих
changes.
## Goals / Non-Goals
**Goals:**
- сделать planning structure, task ownership и requirement coverage
детерминированно проверяемыми до Apply;
- восстановить project-owned agent workflow из versioned inputs и обнаруживать
drift derived projection;
- сохранить один exact supported CLI contract, пригодный для контролируемого
будущего upgrade;
- распределить guidance между schema, config, durable policy и verifiers без
конкурирующих источников;
- сохранить все source assessments и нормализовать их claims с доказательными
dispositions;
- сохранить пропорциональность workflow и существующие human approval gates.
**Non-Goals:**
- обновление OpenSpec CLI в этом change;
- изменение frontend, backend, runtime API или deployment behavior;
- универсальная схема для других проектов, Fast Track или второй lifecycle;
- собственный workflow engine, identity/signature system для approvals или
общий dependency scheduler для changes;
- автоматическое доказательство смысловой полноты Proposal, Specs или Design;
- новые review, completion, blocker, revision либо traceability artifacts.
## Decisions
### 1. Native schema v2 остаётся workflow engine
`wealth-ledger-sdd` повышается до version 2, сохраняя граф
`Proposal → Delta Specs → Design → Tasks → Apply`. Изменяется contract
существующих artifacts, а не их число. Schema и templates задают обязательную
форму Tasks, условный rollback contract, stage validation guidance, полный
feedback path и компактные примеры сложных delta operations. Minimal spec
template остаётся ориентированным на `ADDED`; неиспользуемые delta sections не
генерируются как пустые placeholders.
Artifact approval остаётся человеческим фактом разговора. File existence и
CLI status продолжают означать только structural state. Форматное исправление,
не меняющее approved semantics, повторяет structural checks без каскадного
reapproval; любое изменение intent, behavior, architecture или task scope
возвращает workflow к самому раннему затронутому artifact и инвалидирует его
downstream approvals.
### 2. Guidance имеет явных владельцев
Ответственность разделяется так:
| Surface | Authority |
| --- | --- |
| schema instructions | artifact semantics, native syntax и workflow behavior |
| templates | только форма создаваемого Markdown |
| config context | стабильные факты workspace и язык project artifacts |
| config rules | только краткие additive project constraints, отсутствующие в schema |
| governance и ADR | durable rationale, ownership и upgrade policy |
| non-mutating verifiers | Enforceable Engineering Invariants |
Текущие config rules, дословно повторяющие schema, удаляются или сокращаются;
произвольный `_rules.md` не вводится. Project explanations пишутся по-русски,
а OpenSpec tokens, headings, commands и normative keywords сохраняются в их
точной английской форме.
### 3. Planning verifier отделён от full delivery dispatcher
`specs` получает один stage-aware non-mutating planning verifier. Он разрешает
change через canonical store и применяет только доступные на текущем этапе
checks:
- Proposal — metadata, обязательную структуру и разрешимость declared existing
capability paths;
- Delta Specs — strict change validation и соответствие capability set
Proposal;
- Design — Delivery Map, Contract Gate Decision и rollback decision;
- Tasks — checkbox shape, area ownership, canonical gate coverage и точные
requirement references, включая explicit `N/A` rationale.
Verifier не пытается машинно оценивать качество мотивации, архитектурного
rationale или semantic correctness. Full workspace dispatcher вызывает его
перед affected-area gates, а artifact entrypoints запускают доступный stage до
запроса approval. Проверяемая логика получает compliant fixtures и
representative failures для uncovered requirement, invalid area, malformed
rollback decision и projection/version drift. Существующие parsers Delivery Map
переиспользуются либо извлекаются, а не дублируются вторым несовместимым
разбором.
### 4. Tasks используют area owner и встроенную coverage metadata
Каждый checkbox использует формат `X.Y [area] action`, где `area` — ровно одна
из `frontend`, `backend`, `specs`, `docs`, `workspace`. Следующие indented
metadata lines содержат:
- `Covers`: одна или несколько пар `capability path — exact Requirement
heading` либо `N/A — concrete reason`;
- `Verification`: planned command, observable check или delivered artifact.
OpenSpec продолжает отслеживать progress по checkbox line, а planning verifier
связывает последующие metadata lines с ближайшим checkbox. Cross-repository
implementation разбивается по repository owners; `workspace` используется
только для orchestration и verification. Requirement heading остаётся native
identity OpenSpec; дополнительный ID namespace не создаётся.
### 5. Root agent projection получает versioned canonical source
Текущие project-owned `commands` и `skills` импортируются как canonical source
tree под `specs/agent-projection/opencode`. Package manifests, installed
dependencies и machine-local runtime state не входят в source. Явная sync
команда атомарно обновляет соответствующие каталоги root `.opencode`, а
отдельный non-mutating verifier сравнивает required file set и contents с
canonical source.
На upgrade новая upstream projection сначала создаётся в isolated staging.
Upstream delta и минимальные WealthLedger overlays — fixed store,
one-artifact-at-a-time approvals, feedback path и hard archive blockers —
переносятся в canonical source, после чего sync обновляет root derived output.
Authority verifier получает expected version из единственного version contract
и проверяет совпадение каждого required generated marker. Concrete CLI version
не закрепляется в verifier logic или fixtures независимо от contract.
Canonical source tree выбран вместо:
- patch set: меньше committed content, но patches хрупки к upstream text churn;
- custom generator: устраняет дублирование, но создаёт новый transformation
engine и повышает maintenance cost;
- symlink: устраняет copy drift, но связывает agent discovery с filesystem и
tool-specific symlink behavior;
- manual staging only: сохраняет текущую простоту, но не обеспечивает recovery
из clean checkouts.
### 6. Rollback contract является условной частью Design
Design template получает внутри Migration Plan структурированный rollback
decision. Для auth/security, data integrity или migration, public contract и
других труднообратимых решений status `required` раскрывает trigger, actions,
data safety и verification. Для остальных changes status `N/A` требует
конкретной причины. Отдельный rollback artifact не создаётся.
У этого change rollback contract имеет status `N/A`: application data,
security behavior и public contracts не меняются, а committed specs/docs
обратимы через Git. Initial projection cutover выполняется атомарно и сохраняет
предыдущее local derived state до успешного verification, чтобы failed sync не
оставил частично обновлённый workspace.
### 7. Multi-source assessment хранит raw evidence и отдельный triage
Пять исходных model reports переносятся byte-for-byte в один dated audit
snapshot set под `docs/audits`; index обозначает их как external, non-authority
claims и фиксирует checksums. После проверки совпадения исходная unversioned
папка удаляется, чтобы не оставить competing copy.
Live registry получает нормализованные Audit IDs. Повторяющиеся claims имеют
одну запись со ссылками на все sources. Triage disposition
`confirmed | already-covered | rejected | deferred` хранится отдельно от
remediation status. Confirmed findings этого scope связываются с текущим active
change; already-covered получают existing evidence; rejected — rationale;
deferred — review trigger. Следующим planned remediation после завершения этого
change снова становится ранее выбранная auth platform assessment.
### 8. Version contract фиксирует совместимость, а не вечную версию
Текущая exact version остаётся неизменной. Появление новой stable версии не
блокирует delivery и не меняет contract автоматически. Future upgrade является
отдельным SDD change и проходит staged projection comparison, schema/status/
instructions compatibility, canonical-store checks, disposable lifecycle и
positive/negative authority fixtures. Historical archives и Completion Evidence
сохраняют фактические версии своих запусков.
## Delivery Map
| Area | Status | Architectural outcome or N/A reason |
| --- | --- | --- |
| frontend | `N/A` | Change не меняет frontend behavior, source, contract или canonical gate. |
| backend | `N/A` | Change не меняет backend behavior, source, contract или canonical gate. |
| specs | `affected` | Schema v2, planning/projection guardrails, canonical agent source и нормативные lifecycle requirements образуют единый проверяемый SDD contract. |
| docs | `affected` | Immutable multi-source audit, dispositions, governance, lifecycle documentation и ADR отражают поставленную SDD-систему. |
### Contract Gate Decision
| Gate | Status | Reason |
| --- | --- | --- |
| runtime-openapi | `N/A` | Change не затрагивает backend runtime API, frontend generated client или committed OpenAPI snapshot. |
## Solution Assessment
Change существенно меняет общую project tooling infrastructure, поэтому
сравнение alternatives обязательно.
### Workflow enforcement
| Option | Fit и maturity | Security / operating cost | Constraints / migration cost | Decision |
| --- | --- | --- | --- | --- |
| Native OpenSpec schema/config + thin project verifiers | Полностью сохраняет canonical artifact graph; используемые extension points уже работают в 1.10, хотя schema API experimental | Local-only, без новых secrets/services; низкая стоимость поверх существующих gates | Требует exact compatibility contract и fixtures при upgrade; incremental migration | Selected |
| Prompt/docs-only conventions | Markdown mature и дёшев, но не отклоняет нарушения | Низкая стоимость, высокий риск silent drift | Не выполняет требования machine validation и reproducibility | Rejected |
| Собственный workflow engine | Максимальный theoretical fit, но custom maturity отсутствует | Новый privileged control surface и высокая постоянная стоимость | Дублирует OpenSpec lifecycle, требует migration всех entrypoints и state | Rejected |
| Общая monorepo/CI platform | Зрелые продукты существуют, но workspace не имеет общего build/dependency graph и CI | Существенная installation и operating cost | Не решает approval semantics или audit traceability сама по себе | Rejected |
### Projection recovery
| Option | Fit и maturity | Operating cost | Main constraint | Decision |
| --- | --- | --- | --- | --- |
| Versioned canonical source tree + sync/check | Простая file projection с детерминированным сравнением | Низкая; около 115 KB source Markdown | Source и derived copy должны проверяться на drift | Selected |
| Versioned overlay patches | Компактно | Средняя/высокая при каждом upstream text change | Patch fragility | Rejected |
| Programmatic overlay generator | Гибко | Высокая; собственная transformation logic | Риск второго workflow engine | Rejected |
| Symlink в specs-owned tree | Минимум duplication | Низкая локально | Tool/filesystem portability и смешение machine-local package state | Rejected |
Выбранный вариант не реализует OpenSpec behavior самостоятельно: native CLI
остаётся engine, а project scripts только синхронизируют derived files и
проверяют детерминированные инварианты.
## Risks / Trade-offs
- **Canonical source и derived projection дублируют Markdown.** Drift блокирует
verifier; изменения вносятся только в source и распространяются explicit
sync-командой.
- **Markdown parser может стать хрупким.** Машиночитаемые prefixes и metadata
намеренно узкие, fixture suite покрывает compliant и representative invalid
inputs, а semantic review остаётся отдельным gate.
- **Traceability создаёт ложное ощущение semantic coverage.** Verifier
подтверждает наличие ссылок, но semantic verification и independent review
продолжают проверять полноту реализации.
- **Форматное исключение может скрыть semantic edit.** Оно ограничено ошибками,
не меняющими intent, behavior, decisions или tasks; сомнение возвращает
artifact на обычный reapproval path.
- **Schema instructions могут разрастись.** Duplicate config rules удаляются,
examples остаются короткими, а final instruction size сравнивается с
baseline без жёсткого token threshold.
- **Raw model reports могут выглядеть authoritative.** Snapshot index и registry
явно разделяют source claims, triage evidence и project authority.
- **Initial source-tree bootstrap не имеет прежней versioned baseline.** Sync
сохраняет local pre-cutover state до успешного gate; после поставки все
дальнейшие projection versions становятся восстановимыми через Git history.
- **Future OpenSpec release может изменить experimental interfaces.** Exact
contract блокирует silent adoption, а отдельный upgrade change выполняет
staged compatibility assessment.
## Migration Plan
1. Ввести canonical projection source и non-mutating planning/projection checks,
подтвердив compliant и controlled-invalid fixtures до переключения schema.
2. Обновить schema, templates, config и canonical agent source до v2 contract;
собственные Tasks этого change оформить уже в новом формате.
3. Атомарно синхронизировать root derived projection и отклонить delivery при
любом content/version drift.
4. Перенести raw assessments в immutable indexed snapshot, проверить
byte-for-byte equality, удалить unversioned copy и обновить live registry.
5. Обновить governance, lifecycle docs и ADR до фактической архитектуры, затем
выполнить specs/docs gates, semantic verification и independent review.
### Rollback Contract
| Field | Decision |
| --- | --- |
| Status | `N/A` |
| Reason | Change не меняет application data, security behavior или public contracts; committed state обратим через Git, а projection является derived output с atomic cutover. |
| Failed cutover handling | Sync восстанавливает сохранённое pre-cutover local state и не объявляет source/projection согласованными. |
| Verification | Planning, projection, authority, strict OpenSpec и docs gates должны снова подтвердить выбранное состояние. |