20 KiB
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/Arationale.
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
- Ввести canonical projection source и non-mutating planning/projection checks, подтвердив compliant и controlled-invalid fixtures до переключения schema.
- Обновить schema, templates, config и canonical agent source до v2 contract; собственные Tasks этого change оформить уже в новом формате.
- Атомарно синхронизировать root derived projection и отклонить delivery при любом content/version drift.
- Перенести raw assessments в immutable indexed snapshot, проверить byte-for-byte equality, удалить unversioned copy и обновить live registry.
- Обновить 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 должны снова подтвердить выбранное состояние. |