730 lines
60 KiB
Markdown
730 lines
60 KiB
Markdown
# Completion Evidence
|
||
|
||
<!-- markdownlint-disable MD024 -->
|
||
|
||
Фактические записи о поставке завершённых changes: Delivery Map, archive path,
|
||
delivery commits, точные verification commands с наблюдёнными результатами и
|
||
итог independent read-only review. Записи добавляются после archive и являются
|
||
неизменяемой историей поставки.
|
||
|
||
## 2026-08-26-simplify-verification-infrastructure
|
||
|
||
**Change:** simplify-verification-infrastructure (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-26-simplify-verification-infrastructure`
|
||
**Specs sync:** `skip_specs: true`; change упрощает локальную verification
|
||
инфраструктуру и lifecycle routing без изменения observable product
|
||
requirements или public API behavior.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | Local gate упрощён до прямых project tools: сохранены typecheck, Biome, Vitest coverage, Knip, dependency-cruiser и build; удалены hygiene wrappers, exact lazy-route baseline и meta-tests конфигурации |
|
||
| backend | affected | Local gate упрощён до lint/typecheck/Jest/build; shell runtime verifier заменён focused Jest OpenAPI contract test на integration boundary; project-owned hygiene wrappers удалены |
|
||
| specs | affected | Project-owned planning, authority, version, runtime-openapi и workspace verification scripts удалены; native OpenSpec validation и explicit completion sequencing закреплены в canonical store, затем change заархивирован |
|
||
| docs | affected | As-built workflow docs синхронизированы с direct repository/native gates, historical evidence сохранён как исторический факт без переписывания прошлых записей |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `3d9b61919c0254dc8f0e325db6416d0b24b377ca` | chore: simplify frontend verification |
|
||
| frontend | `f09baa68fcecfd210f95a7bfe8a67dc3741abce8` | chore: simplify frontend verification |
|
||
| backend | `fd4572a64563c588029af38cd7b4cddc3e014cdf` | chore: simplify backend verification |
|
||
| specs | `2faf4eb959e7cc37bdbb08d3fb40a170388cc7ae` | chore: use native OpenSpec validation |
|
||
| specs | `b6c141f4f3b5d95dbfcbd921959db910e8d1db66` | chore(specs): finish verification cleanup |
|
||
| specs (archive) | `15ce5b586da20ec2cf441a59547da5257c316b78` | docs(specs): archive verification simplification change |
|
||
| docs (as-built) | `4af0a9cf1f4408bd9824be6722df09a045e7954b` | docs: simplify verification workflow |
|
||
| docs (as-built) | `8eac3b0ffa0c1300eb85f83dd2504d56780abae5` | Update frontend verification docs |
|
||
| docs (evidence) | current evidence commit | docs: record verification simplification evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm run verify` (frontend) | pass; typecheck, Biome, coverage (`21` files / `73` tests), Knip, dependency-cruiser и production build прошли без ошибок |
|
||
| `npm run verify` (backend) | pass; lint, app/test typecheck, Jest (`23` suites / `82` tests) и build прошли без ошибок |
|
||
| `npm run verify` (docs) | pass; markdownlint checked `38` files, `0` issues, `git diff --check` clean |
|
||
| `openspec schema validate wealth-ledger-sdd --verbose` (specs, pre-archive) | pass; schema structure, templates и dependency graph valid |
|
||
| `openspec validate simplify-verification-infrastructure --type change --strict --store wealth-ledger-specs` (specs, pre-archive) | pass; change valid |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, pre-archive) | pass; `20 passed, 0 failed` |
|
||
| `npm run test:openapi-contract` (backend, first attempt) | failed due environment mismatch: `better-sqlite3` binary had `NODE_MODULE_VERSION 127`, current Node required `147` |
|
||
| `npm rebuild better-sqlite3` (backend) | pass; native module rebuilt successfully, no source changes observed in repo |
|
||
| `npm run test:openapi-contract` (backend, rerun) | pass; `1` suite / `1` test, runtime OpenAPI snapshot contract matched after rebuild |
|
||
| `openspec archive simplify-verification-infrastructure --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-26-simplify-verification-infrastructure` |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; `20 passed, 0 failed` |
|
||
| `openspec validate --archived --strict --store wealth-ledger-specs` (specs, post-archive) | pass; `36 passed, 0 failed` |
|
||
| `openspec schema validate wealth-ledger-sdd --verbose` (specs, post-archive) | pass; schema and dependency graph valid |
|
||
|
||
Все Tasks были завершены до archive. Semantic verification подтвердила
|
||
утверждённый Design: verification ownership действительно вернулся native
|
||
OpenSpec и repository-owned gates, focused backend contract check заменил shell
|
||
wrapper без изменения API behavior, а historical docs/evidence не были
|
||
переписаны под новый workflow задним числом.
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical findings — `0`, Important findings — `0`, Minor
|
||
findings — `0`. Review подтвердил, что change не расширил scope за пределы
|
||
tooling/process boundaries, `skip_specs: true` согласован с отсутствием runtime
|
||
requirement changes, affected repositories прошли свои canonical gates по одному
|
||
разу, а единственный observed failure был environment-only ABI mismatch у
|
||
`better-sqlite3`, устранённый локальным rebuild без source diff.
|
||
|
||
## 2026-08-26-improve-ledger-event-rows
|
||
|
||
**Change:** improve-ledger-event-rows (schema `wealth-ledger-sdd` v3)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-26-improve-ledger-event-rows`
|
||
**Specs sync:** три изменения в `brokerage-account-ledger` слиты в main spec;
|
||
post-archive strict validation подтвердил `20 passed, 0 failed`, archived
|
||
changes `34 passed, 0 failed`.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | `Последние события` и `Журнал операций` используют общий compact row с логотипом или буквенным fallback, русскими подписями `Поступление` / `Списание` / `Без движения денег`, знаком суммы и семантическими тонами; полный журнал переведён на `container -> ViewModel -> view` без потери фильтров, cursor-пагинации и состояний |
|
||
| backend | affected | Ledger entry DTO получил additive nullable `logoName`; общий resolver metadata переиспользуется между portfolio и ledger, сохраняет UID-first/FIGI-fallback и кэширует как найденные, так и отрицательные lookup results без скрытия операций при ошибках enrichment |
|
||
| specs | affected | Approved Proposal, Design, Tasks и Delta Spec заархивированы; изменения синхронизированы в `brokerage-account-ledger` |
|
||
| docs | affected | As-built documentation закрепляет nullable visual metadata и русскую семантику поступления, списания и отсутствия движения денег |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `488ccad540c771e862fb795edf2df6c6cea315af` | feat: improve ledger event rows |
|
||
| backend | `84fabd264fa539dfefb1172e27a038870a30d845` | feat: enrich ledger events with logo metadata |
|
||
| specs (archive) | `9a8687feda24edcc6ee6412313a844afce50f5eb` | docs(specs): archive improved ledger event rows |
|
||
| docs (as-built) | `d39a9d3df08d068b0c5fba97cfb7bb0d5755f329` | docs: describe improved ledger event rows |
|
||
| docs (evidence) | current evidence commit | docs: record improved ledger row evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH npm run verify` (backend) | pass; runtime/hygiene/lint/typecheck/Jest/build зелёные, `23` suites / `78` tests после регрессионных фиксов по metadata fallback и negative cache |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH bash specs/scripts/verify-workspace-change.sh improve-ledger-event-rows` (workspace, pre-archive final) | pass; Delivery Map verified frontend/backend/specs/docs=affected, runtime-openapi=required; frontend `21` files / `73` tests, backend `23` suites / `78` tests, docs lint clean, runtime OpenAPI SHA совпадает со snapshot |
|
||
| `openspec archive improve-ledger-event-rows --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-26-improve-ledger-event-rows`, `brokerage-account-ledger` updated with `3 modified` requirements |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; `20 passed, 0 failed` |
|
||
| `openspec validate --archived --strict --store wealth-ledger-specs` (specs, post-archive) | pass; `34 passed, 0 failed` |
|
||
| `openspec schema validate wealth-ledger-sdd --verbose` (specs, post-archive) | pass; schema and dependency graph valid |
|
||
| `bash scripts/verify-openspec-authority.sh` (specs, post-archive) | pass; OpenSpec CLI `1.10.0`, authority `wealth-ledger-specs` |
|
||
|
||
Все Tasks были завершены до archive. Semantic verification подтвердила, что
|
||
оба пользовательских surface (`Последние события` и `Журнал операций`) получили
|
||
одинаковую компактную композицию, денежное направление выражается не только
|
||
цветом, backend enrichment остаётся additive и nullable, а существующие суммы,
|
||
категории, курсоры, loading/error/empty states и runtime OpenAPI contract не
|
||
сломаны.
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Первый review обнаружил два Important findings:
|
||
page-local dedupe в журнале мог подавлять FIGI fallback после UID-only miss, а
|
||
negative metadata lookups не кэшировались и повторно били в upstream. Оба
|
||
finding устранены: ключ дедупликации учитывает `uid + figi`, `null`-results
|
||
кэшируются через sentinel, добавлены прямые regression tests. Повторный
|
||
read-only review подтвердил итог: Critical `0`, Important `0`, Minor `0`.
|
||
|
||
## 2026-08-26-polish-stock-position-cards
|
||
|
||
**Change:** polish-stock-position-cards (schema `wealth-ledger-sdd` v3)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-26-polish-stock-position-cards`
|
||
**Specs sync:** `skip_specs: true`; change уточняет presentation существующего
|
||
Portfolio Position без изменения observable requirements или API contract.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | Карточка акции получила двухзонную иерархию: identity и метаданные слева, стоимость и доходность справа, средняя цена и доля одной приглушённой строкой; мобильный перенос сохраняет количество и ISIN |
|
||
| backend | N/A | Backend behavior, финансовые расчёты и API contract не менялись |
|
||
| specs | affected | Утверждённые Proposal, Design и Tasks заархивированы с `skip_specs: true` |
|
||
| docs | affected | As-built Portfolio documentation описывает поставленную визуальную иерархию карточки акции |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `273778c4cfa6ef8bd3ab421e03c57b6e31f7d925` | feat: polish stock position cards |
|
||
| specs (archive) | `cf6bc1761140f06f44ea29e2eee1a2b24d075e2a` | docs(specs): archive stock card polish |
|
||
| docs (as-built) | `0c59ce788690ba6d17f33e0b57e122dd67e74904` | docs: describe polished stock cards |
|
||
| docs (evidence) | current evidence commit | docs: record stock card polish evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm run test:run -- src/pages/account/ui/AccountPage.test.tsx` (frontend, RED) | failed as expected: прежняя разметка не объединяла quantity/ISIN и average price/share в спокойные строки |
|
||
| `npm run test:run -- src/pages/account/ui/AccountPage.test.tsx` (frontend, responsive RED) | failed as expected: metadata имела `data-line-clamp=true`, способный скрыть ISIN на узком экране |
|
||
| `npm run test:run -- src/pages/account/ui/AccountPage.test.tsx` (frontend, final) | pass; 13/13 tests, metadata больше не line-clamped |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH bash specs/scripts/verify-workspace-change.sh polish-stock-position-cards` (workspace, pre-archive) | pass; frontend/specs/docs affected, backend/runtime-openapi N/A; 20/20 main specs; frontend 21 files / 68 tests, build and bundle check; docs 37 Markdown files / 0 issues |
|
||
| `openspec archive polish-stock-position-cards --skip-specs --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-26-polish-stock-position-cards`, spec updates skipped by approved metadata |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 20 passed, 0 failed |
|
||
| `openspec validate --archived --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 33 passed, 0 failed |
|
||
| `openspec schema validate wealth-ledger-sdd --verbose` (specs, post-archive) | pass; dependency graph and templates valid |
|
||
| `bash scripts/verify-openspec-authority.sh` (specs, post-archive) | pass; OpenSpec CLI 1.10.0, authority `wealth-ledger-specs` |
|
||
|
||
Все четыре Tasks завершены до archive. Semantic verification подтвердила
|
||
двухзонную компоновку только для секции акций, сохранение состава метрик,
|
||
nullable hiding, прежнего вида облигаций/прочих позиций и отсутствие изменений
|
||
API. Account lazy-route baseline зафиксирован на 24,695 bytes; initial
|
||
JavaScript payload — 510,523 bytes.
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Первый review выявил два Important findings: потенциальное
|
||
скрытие ISIN из-за `lineClamp` на узком экране и преждевременную отметку
|
||
workspace task. Task была возвращена в unchecked, metadata получила перенос
|
||
через `overflow-wrap: anywhere`, добавлен RED/GREEN regression assertion.
|
||
Повторный review подтвердил: Critical — 0, Important — 0; stock-only routing,
|
||
nullable hiding и неизменённый branch облигаций/прочих позиций сохранены.
|
||
|
||
## 2026-08-26-harden-openspec-sdd-agent-resilience
|
||
|
||
**Change:** harden-openspec-sdd-agent-resilience (schema `wealth-ledger-sdd` v3)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-agent-resilience`
|
||
**Specs sync:** три новых и три изменённых Requirements слиты в
|
||
`openspec-authority-and-lifecycle` и `multi-repository-delivery`; post-archive
|
||
strict validation — 20 main specs и 32 archived changes без ошибок.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | N/A | Client behavior, implementation и local gate не менялись |
|
||
| backend | N/A | API behavior, implementation и local gate не менялись |
|
||
| specs | affected | Schema v3, operation-neutral template, failure taxonomy, controlled fixtures, Delta Specs и archive/sync поставлены |
|
||
| docs | affected | Шесть reports сохранены одним snapshot, claims triaged, lifecycle/ADR/registry синхронизированы |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| specs (implementation) | `8462a3ba75d6dda491b9221699357c58d8f8e3cc` | feat: harden OpenSpec agent resilience |
|
||
| specs (archive/sync) | `779a1e1305f8c209a4f98fae7f87718e48d61b37` | docs(specs): archive OpenSpec resilience change |
|
||
| docs (as-built) | `d80e2e32b2ebadcd93a53105e1ac337fe2c1f4f6` | docs: record second OpenSpec schema review |
|
||
| docs (evidence) | current evidence commit | docs: record OpenSpec resilience evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `bash scripts/verify-openspec-planning.test.sh` (specs, RED before implementation) | failed as expected: прежний verifier не выдавал `artifact-validation`, schema оставалась v2 |
|
||
| `bash scripts/verify-openspec-planning.sh definitely-missing-change` (specs, review reproduction) | до fix: exit 1 `artifact-validation`; после fix: exit 2 `Planning invocation failed` |
|
||
| `bash scripts/verify-openspec-planning.test.sh` (specs) | pass; positive stage cases, controlled ADDED/MODIFIED/REMOVED/RENAMED, artifact/invocation/environment failures, N/A и instruction contracts |
|
||
| `bash scripts/verify-openspec-authority.test.sh` (specs) | pass; controlled-invalid authority cases отклонены по ожидаемым причинам |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH bash specs/scripts/verify-workspace-change.sh harden-openspec-sdd-agent-resilience` (workspace, pre-archive) | pass; specs/docs affected, frontend/backend/runtime-openapi N/A; schema/change valid, 20/20 main specs, docs 37 Markdown files / 0 issues |
|
||
| `openspec archive harden-openspec-sdd-agent-resilience --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-26-harden-openspec-sdd-agent-resilience`; +3/~3 Requirements synced |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 20 passed, 0 failed |
|
||
| `openspec validate --archived --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 32 passed, 0 failed |
|
||
| `openspec schema validate wealth-ledger-sdd --verbose` (specs, post-archive) | pass; dependency graph and templates valid |
|
||
| `bash scripts/verify-openspec-authority.sh` (specs, post-archive) | pass; OpenSpec CLI 1.10.0, authority `wealth-ledger-specs` |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH npm run verify` (docs) | pass; Node 22.21.0, 37 Markdown files, 0 issues |
|
||
| `git diff --check` (specs/docs) | pass |
|
||
|
||
Schema instruction source уменьшился с 348 строк / 22,215 bytes до 209 строк /
|
||
14,197 bytes без числового blocking threshold. Все 12 Tasks завершены до
|
||
archive; semantic verification сопоставила delivery со всеми 6 Requirements и
|
||
20 Scenarios.
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Итог после remediation review findings: Critical — 0,
|
||
Important — 0, Minor — 0. Reviewer подтвердил schema v3 и `Critical Rules`,
|
||
operation-neutral template и four-operation fixture, три failure category,
|
||
structural/semantic границу `N/A`, native `contextFiles` + local `AGENTS.md`,
|
||
cascade/mechanical assertions и snapshot/registry/as-built consistency без
|
||
scope creep.
|
||
|
||
## 2026-08-25-align-domain-model-and-money-contract
|
||
|
||
**Change:** align-domain-model-and-money-contract (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-25-align-domain-model-and-money-contract`
|
||
**Specs sync:** дельты `brokerage-account-upcoming-events`,
|
||
`brokerage-accounts`, `portfolio-view` и `project-documentation` слиты в main
|
||
specs; `openspec validate --specs --strict --store wealth-ledger-specs` —
|
||
`20 passed, 0 failed`.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| backend | affected | `UpcomingEventDto` заменил event-level `amount`/`currency` на nullable `projectedAmount` Money; mapping coupon/dividend/maturity возвращает Money, offer и неизвестная валюта возвращают `null`; focused tests покрывают новый contract |
|
||
| frontend | affected | OpenAPI snapshot/generated types синхронизированы; full events page, account overview recent events, hook tests и fixtures consume `projectedAmount` напрямую и сохраняют «Сумма неизвестна» для `null` |
|
||
| specs | affected | Delta specs синхронизированы в main specs, change заархивирован |
|
||
| docs | affected | Глоссарий и feature/system docs закрепляют Money, current-connection account accessibility, Portfolio Snapshot, Currency Instrument Position, Cash Balance и Future Cash Event terminology |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| backend | `f1df1044623862770ecb40fd735e1aea08dc2a68` | feat: use money for upcoming event projections |
|
||
| frontend | `1fd9a3a861a8b915b6c64861a018db39e2598a83` | feat: consume money projected event amounts |
|
||
| specs | `039b72eed38b07e89e2f0234e7c12c202b6cf262` | docs(specs): archive domain money contract change |
|
||
| docs | `68d975befda90c198a0287bb8d43ac5d6e386eb5` | docs: align investment domain terminology |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm test -- tbank/upcoming-events.service.spec.ts --runInBand` (backend, RED) | failed as expected before implementation because response lacked `projectedAmount`; later failed as expected for omitted currency until `null` behavior was implemented |
|
||
| `npm test -- tbank/upcoming-events.service.spec.ts --runInBand` (backend) | pass; 1 suite / 7 tests |
|
||
| `npm run lint && npm run typecheck:app && npm run typecheck:test && npm test -- --runInBand` (backend) | pass; Jest 22 suites / 71 tests |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH npm run verify` (backend) | pass; runtime/hygiene/lint/typecheck/Jest/build passed; Jest 22 suites / 71 tests |
|
||
| `VITE_API_BASE_URL=http://localhost:3001 npm run openapi:sync` (frontend) | pass; updated only OpenAPI snapshot and generated types for `UpcomingEventDto.projectedAmount` |
|
||
| `npm run test:run -- brokerage-event AccountEventsPage AccountPage.vm` (frontend, RED) | failed as expected before UI change because renderer still read old amount/currency fields |
|
||
| `npm run test:run -- brokerage-event AccountEventsPage AccountPage.vm` (frontend) | pass; 3 files / 6 tests |
|
||
| `npm run openapi:check && npm run typecheck` (frontend) | pass |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH npm run verify` (frontend) | pass; 21 test files / 67 tests, build and bundle budget passed |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH npm run verify` (docs) | pass; Node 22.21.0, markdownlint 35 files, 0 issues |
|
||
| `bash specs/scripts/verify-runtime-openapi.sh` (workspace) | pass; runtime SHA-256 = snapshot SHA-256 = `aa4db3d4d3bb5e6e4e8b6bf4641a2024d00c827ee612e09709c1b6fda75d3e50` |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH bash specs/scripts/verify-workspace-change.sh align-domain-model-and-money-contract` (workspace, pre-archive) | pass; Delivery Map verified frontend/backend/specs/docs=affected, runtime-openapi=required; all gates green |
|
||
| `openspec archive align-domain-model-and-money-contract --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-25-align-domain-model-and-money-contract`, 8 modified requirements applied |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 20 passed, 0 failed |
|
||
| `bash scripts/verify-openspec-authority.sh` (specs, post-archive) | pass; OpenSpec CLI 1.10.0, authority `wealth-ledger-specs` |
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical и Important findings отсутствовали. Reviewer
|
||
подтвердил, что breaking contract ограничен Future Cash Event projected amount,
|
||
backend не создаёт Money без валюты, frontend не читает removed
|
||
`event.amount`/`event.currency`, docs не стали параллельным SDD artifact, а
|
||
routes, storage, supported account policy, cache TTLs, sorting и upstream
|
||
sources не менялись.
|
||
|
||
## 2026-08-24-add-instrument-logos
|
||
|
||
**Change:** add-instrument-logos (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-24-add-instrument-logos`
|
||
**Specs sync:** дельта `portfolio-view` слита в main spec (`openspec/specs/portfolio-view/spec.md`); повторная сверка блоков requirements подтвердила идентичность, `openspec validate --specs --strict --store wealth-ledger-specs` — `20 passed, 0 failed`.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| backend | affected | `logoName` из бренда upstream через instrument lookup и 24h metadata cache в nullable поле Portfolio Position DTO; OpenAPI артефакт перегенерирован |
|
||
| frontend | affected | generated types из snapshot; хелпер URL логотипа x160; секция STOCK одноколоночная с Avatar-логотипом (фолбэк-буква) и доходностью со знаком без подписи; тесты страницы обновлены |
|
||
| specs | affected | delta `portfolio-view` синхронизирована в main spec, change заархивирован |
|
||
| docs | affected | глоссарий: термин «Instrument Logo»; as-built `features/portfolio-view.md`: поле контракта и новый вид секции акций |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| backend | `5375e55` | feat: expose instrument brand logo name in portfolio positions |
|
||
| frontend | `a6d3051` | feat: render stock logos with signed returns on account page |
|
||
| specs | `70a200e` | docs(specs): archive add-instrument-logos |
|
||
| docs | `30e5699` | docs: document instrument logos in portfolio |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm ci && npm run verify` (backend) | pass; Jest 19 suites / 59 tests, prisma generate + nest build без ошибок (прогон повторён после исправления извлечения `brand.logoName`) |
|
||
| `npm ci && npm run verify` (frontend) | pass; runtime/hygiene/typecheck/lint/vitest/knip/deps/build/bundle-budget без ошибок |
|
||
| `bash specs/scripts/verify-runtime-openapi.sh` (workspace) | pass; runtime SHA-256 = snapshot SHA-256 = `db6133d0ad89b02851a6e2df9f23099e243e6bab72bc4e15ffe5317017bcf454` |
|
||
| `npx vitest run src/entities/portfolio/model/display.test.ts src/pages/account/ui/AccountPage.test.tsx` (frontend) | pass; 12 тестов (позже 12 с учётом zero-return кейса в том же файле — финальный прогон страницы 9/9) |
|
||
| `bash specs/scripts/verify-workspace-change.sh add-instrument-logos` (workspace) | pass; Delivery Map verified frontend/backend/specs/docs=affected, runtime-openapi=required; все gates зелёные, «Workspace verification passed» |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs) | pass; 20 passed, 0 failed |
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical и Important findings отсутствовали. Minor findings
|
||
устранены до archive: добавлен тест нулевой доходности акций (`0 ₽` без знака)
|
||
в `AccountPage.test.tsx`; baseline lazy-route бандла подтверждённо
|
||
перегенерирован скриптом `npm run bundle:baseline` после подключения Mantine
|
||
Avatar (17018 → 21868 bytes для `src/pages/account/index.ts`). В ходе
|
||
реализации найдено и исправлено расхождение с upstream: gRPC отдаёт имя файла
|
||
логотипа вложенно в `brand.logo_name`, извлечение выполняется в сервисе
|
||
портфеля.
|
||
|
||
## 2026-08-25-extend-instrument-logo-to-bonds
|
||
|
||
**Change:** extend-instrument-logo-to-bonds (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-25-extend-instrument-logo-to-bonds`
|
||
**Specs sync:** дельта `portfolio-view` слита в main spec; старое требование «Ошибки и состояния Portfolio на клиенте» удалено, добавлены два фокусированных: «Состояния и ошибки Portfolio на клиенте» и «Представление карточек позиций на клиенте»; `openspec validate --specs --store wealth-ledger-specs` — `20 passed, 0 failed`.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | Презентационный флаг `stock` переименован в `wide`; секции STOCK и BOND передают `wide`; карточки облигаций получили логотип бренда, фолбэк первой буквы, знаковый доход без подписи, одноколоночную раскладку; регрессионный тест секции иных типов добавлен |
|
||
| backend | N/A | `logoName` уже потоковый для всех типов позиций; правки не требовались |
|
||
| specs | affected | Delta `portfolio-view` синхронизирована в main spec, change заархивирован |
|
||
| docs | affected | `features/portfolio-view.md` обновлён: облигации в едином стиле с акциями |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `c04025a` | feat(portfolio): extend instrument logo rendering to bonds |
|
||
| backend | — | N/A |
|
||
| specs | `bfaa04b` | feat(portfolio-view): sync delta spec and archive change |
|
||
| docs | `2e9e403` | docs(portfolio-view): update as-built for bond parity |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm run test:run` (frontend) | pass; 17 suites, 61 tests, 0 failures |
|
||
| `npm ci && npm run verify` (frontend) | pass; runtime/hygiene/typecheck/lint/vitest/knip/deps/build/bundle-budget без ошибок |
|
||
| `bash specs/scripts/verify-workspace-change.sh extend-instrument-logo-to-bonds` (workspace) | pass; Delivery Map verified frontend/backend=N/A/specs/docs=affected; все gates зелёные, «Workspace verification passed» |
|
||
| `openspec validate --specs --store wealth-ledger-specs` (specs) | pass; 20 passed, 0 failed |
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical findings отсутствовали. 2 WARNING устранены до
|
||
archive: (1) изменение ассерта в stale-тесте объяснено осознанным изменением
|
||
поведения облигаций согласно дельте; (2) хрупкий глобальный скан стилей
|
||
усилен до `toHaveLength(1)` вместо `some()`. 2 SUGGESTION приняты без
|
||
действий (существующий паттерн хардкода URL в тестах, именование тестов).
|
||
|
||
## 2026-08-25-codify-frontend-view-model-boundary
|
||
|
||
**Change:** codify-frontend-view-model-boundary (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-25-codify-frontend-view-model-boundary`
|
||
**Specs sync:** `skip_specs: true`; change закрепляет frontend/docs/process
|
||
границы View/ViewModel без изменения runtime product requirements.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | `AccountPage` разделён на thin container, ViewModel и props-only view; VM владеет data/auth/router/application hooks и derived presentation model; view оставлен только с `useTranslation`; крупные смысловые секции вынесены в небольшие presentation components; добавлены VM regression tests |
|
||
| backend | N/A | API и backend-поведение не менялись |
|
||
| specs | affected | OpenSpec change заархивирован после workspace verification |
|
||
| docs | N/A | As-built product docs не менялись; Completion Evidence добавлен отдельным финальным docs-коммитом |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `fff36f252aa1a7bb18042c8fc2d06262b687b0b1` | refactor: enforce account page view model boundary |
|
||
| backend | — | N/A |
|
||
| specs | `5cc42f30cab997a6d0889c124279d06d64fc8e07` | docs(specs): archive frontend view model boundary change |
|
||
| docs | current evidence commit | docs: record frontend view model boundary evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm run test:run -- src/pages/account/ui/AccountPage.test.tsx` (frontend, baseline) | pass; 1 файл, 12 тестов |
|
||
| `npm run test:run -- src/pages/account/ui/AccountPage.test.tsx src/pages/account/ui/AccountPage.vm.test.tsx` (frontend) | pass; 2 файла, 15 тестов |
|
||
| `npm run typecheck` (frontend) | pass |
|
||
| `npm run lint` (frontend) | pass |
|
||
| `npm run knip` (frontend) | pass |
|
||
| `npm run deps` (frontend) | pass |
|
||
| `npm ci && npm run verify` (frontend, Node 22.21.0) | pass; runtime/hygiene/typecheck/lint/vitest/knip/deps/build/bundle-budget без ошибок; 18 test files / 64 tests |
|
||
| `openspec validate codify-frontend-view-model-boundary --type change --strict --store wealth-ledger-specs` (specs) | pass |
|
||
| `bash specs/scripts/verify-workspace-change.sh codify-frontend-view-model-boundary` (workspace, Node 22.21.0) | pass; Delivery Map verified frontend/specs=affected, backend/docs/runtime-openapi=N/A |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs) | pass; 20 passed, 0 failed |
|
||
| `bash specs/scripts/verify-openspec-authority.sh` (workspace) | pass |
|
||
| `git diff --check` (frontend/specs) | pass |
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical и Important findings отсутствовали. Minor hygiene:
|
||
удалены случайные `.DS_Store` файлы из `specs` до archive/commit.
|
||
|
||
## 2026-08-25-remove-frontend-hook-token-params
|
||
|
||
**Change:** remove-frontend-hook-token-params (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-25-remove-frontend-hook-token-params`
|
||
**Specs sync:** `skip_specs: true`; change закрывает audit-derived frontend
|
||
architecture item без изменения observable product requirements.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | `usePortfolio`, `useBrokerageAccounts`, `useBrokerageOperations` и `useBrokerageEvents` больше не принимают `accessToken`; protected query gating централизован в shared `useAuthenticatedQuery`; page/app callers перестали читать auth state только ради token plumbing; добавлены regression tests |
|
||
| backend | N/A | API contract и backend behavior не менялись |
|
||
| specs | affected | OpenSpec change заархивирован как process/audit remediation без delta specs |
|
||
| docs | N/A | As-built product docs не менялись; Completion Evidence добавлен отдельным финальным docs-коммитом |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `268acdf2e1057ed0f6c19384bfb6477aff773d1d` | refactor: centralize frontend auth query gating |
|
||
| backend | — | N/A |
|
||
| specs | `6e2890f86f5316fdb821b043084461314eb8cf13` | docs(specs): archive frontend auth query gating change |
|
||
| docs | current evidence commit | docs: record frontend auth query gating evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm run test:run -- src/shared/api` (frontend, RED baseline before implementation) | failed as expected because `./authenticated-query` did not exist |
|
||
| `npm run test:run -- src/shared/api` (frontend) | pass; 2 files / 4 tests |
|
||
| `npm run test:run -- src/entities/portfolio/api/usePortfolio.test.tsx src/entities/broker-operation/api/useBrokerageOperations.test.tsx src/entities/brokerage-account/api/useBrokerageAccounts.test.tsx src/entities/brokerage-event/api/useBrokerageEvents.test.tsx` (frontend) | pass; 4 files / 4 tests |
|
||
| `npm run test:run -- src/pages/accounts src/pages/account src/pages/account-operations src/pages/account-events src/app/ui` (frontend) | pass; 6 files / 29 tests |
|
||
| `npm run typecheck` (frontend) | pass |
|
||
| `rg "usePortfolio\\([^\\n,]+,\\s*accessToken\|useBrokerageAccounts\\(accessToken\|useBrokerageOperations\\([^\\n]+accessToken\|useBrokerageEvents\\([^\\n]+accessToken" frontend/src -n` (workspace) | no matches |
|
||
| `bash specs/scripts/verify-workspace-change.sh remove-frontend-hook-token-params` (workspace, pre-archive, Node 22.21.0) | pass; Delivery Map verified frontend/specs=affected, backend/docs/runtime-openapi=N/A; frontend canonical verification passed |
|
||
| `openspec archive remove-frontend-hook-token-params --skip-specs --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-25-remove-frontend-hook-token-params` |
|
||
| `npm run verify` (frontend, post-archive, Node 22.21.0) | pass; runtime/openapi/hygiene/typecheck/lint/vitest/knip/deps/build/bundle-budget без ошибок; 21 test files / 67 tests; initial JavaScript payload 510597 bytes |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 20 passed, 0 failed |
|
||
| `bash scripts/verify-openspec-authority.sh` (specs, post-archive) | pass; OpenSpec CLI 1.10.0, authority `wealth-ledger-specs` |
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical и Important findings отсутствовали; Minor findings
|
||
отсутствовали. Reviewer подтвердил, что четыре targeted hooks и их callers
|
||
больше не передают `accessToken`, auth gating централизован в shared API layer,
|
||
query params/keys, `staleTime` и `retry: false` сохранены, а оставшееся
|
||
использование `accessToken` в T-Bank connection ViewModel соответствует
|
||
явному non-goal Design. Residual risk: full AuthProvider login/refresh/logout
|
||
path enabling/disabling authenticated queries покрыт ограниченно; direct
|
||
session snapshot transition через `configureAuthClient` покрыт regression test.
|
||
|
||
## 2026-08-25-codify-frontend-component-style
|
||
|
||
**Change:** codify-frontend-component-style (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-25-codify-frontend-component-style`
|
||
**Specs sync:** дельта `frontend-quality-guardrails` слита в main spec; `openspec validate --specs --strict --store wealth-ledger-specs` — `20 passed, 0 failed`.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | Authored React components мигрированы на const-valued `FC` declarations; props destructuring перенесён внутрь component body; лишние children-only props aliases удалены в пользу `FC<PropsWithChildren>`; чистые barrels используют direct re-exports; Biome gate блокирует проверяемую часть style |
|
||
| backend | N/A | Backend behavior, routes, DTOs, persistence и runtime OpenAPI contract не менялись |
|
||
| specs | affected | Delta `frontend-quality-guardrails` синхронизирована в main spec, change заархивирован |
|
||
| docs | N/A | As-built product docs не менялись; Completion Evidence добавлен отдельным финальным docs-коммитом |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `d10e1dd1827094e6e52768f0ccd2ea060aef95a1` | chore: codify React component style |
|
||
| backend | — | N/A |
|
||
| specs | `6898732dd8e933e9d6a587aef48ebe0eddaa0cf2` | docs: archive React component style change |
|
||
| docs | current evidence commit | docs: record React component style evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm run typecheck` (frontend, baseline before structural edits) | pass |
|
||
| `npm run test:coverage` (frontend, baseline before structural edits) | pass; 21 test files / 67 tests |
|
||
| `npm exec biome -- check .tmp-biome-style/compliant.tsx` (frontend) | pass; compliant representative sample accepted |
|
||
| `npm exec biome -- check .tmp-biome-style/function-component.tsx` (frontend) | failed as expected with `lint/nursery/useReactFunctionComponentDefinition` |
|
||
| `npm exec biome -- check .tmp-biome-style/default-export.tsx` (frontend) | failed as expected with `lint/style/noDefaultExport` |
|
||
| `npm exec biome -- check .tmp-biome-style/export-order.tsx` (frontend) | failed as expected with `lint/style/useExportsLast` |
|
||
| `rg "type \\w+Props = PropsWithChildren;" frontend/src -g '!shared/api/generated/**'` (workspace) | no matches |
|
||
| `rg -n "^import \\{ .+ \\} from \\\"\\." frontend/src/**/index.ts` (workspace) | no matches |
|
||
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH npm run verify` (frontend) | pass; runtime Node 22.21.0, OpenAPI/hygiene/typecheck/lint/vitest/knip/deps/build/bundle checks passed; 21 test files / 67 tests; initial JavaScript payload 510523 bytes |
|
||
| `bash specs/scripts/verify-workspace-change.sh codify-frontend-component-style` (workspace, Node 22.21.0) | pass; Delivery Map verified frontend/specs=affected, backend/docs/runtime-openapi=N/A; main specs 20 passed, frontend canonical verification passed |
|
||
| `openspec archive codify-frontend-component-style --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-25-codify-frontend-component-style` |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 20 passed, 0 failed |
|
||
| `git diff --check` (frontend/specs) | pass |
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical и Important findings отсутствовали. Minor findings
|
||
о mixed-language summary и stale wording устранены до archive. После уточнения
|
||
Change Owner дополнительно удалены children-only aliases вида
|
||
`type TestWrapperProps = PropsWithChildren` и чистые barrel imports ради
|
||
последующего re-export; обе convention-проверки подтверждены пустыми `rg`
|
||
результатами. Generated OpenAPI source остался вне manual migration.
|
||
|
||
## 2026-08-27-ledger-entry-type-label
|
||
|
||
**Change:** ledger-entry-type-label (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-27-ledger-entry-type-label`
|
||
**Specs sync:** дельта `brokerage-account-ledger` — «Full ledger presents
|
||
compact rows» слита в main spec (1 модифицированный Requirement с новыми
|
||
scenarios «Отображение купона», «Отображение дивиденда» и «Подпись типа не
|
||
дублируется»); post-archive strict validation — `20 passed, 0 failed` для main
|
||
specs и `38 passed, 0 failed` для archived changes.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | `LedgerEntryRow` показывает подпись типа события вместо цветной подписи направления: для income по upstream `type` — «Купон» (`OPERATION_TYPE_COUPON`) или «Дивиденд» (остальные income-типы), иначе — подпись категории; категория убрана из вторичной метадаты (дата · инструмент); знак «+»/«−» и семантический цвет остаются носителями направления; без денежного движения — «Без движения денег»; добавлены i18n-ключи `ledger.entryLabel.income.*`, удалены неиспользуемые `ledger.direction.*`; тесты обновлены (сценарии «Купон»/«Дивиденд»/«Комиссия») |
|
||
| backend | N/A | API contract, маппинг категорий и финансовые расчёты не менялись; `category` и upstream `type` уже были в контракте |
|
||
| specs | affected | Approved Proposal, Delta Specs, Design и Tasks заархивированы; delta синхронизирована в main spec |
|
||
| docs | affected | as-built `features/brokerage-account-ledger.md` описывает подпись типа события, знак и цвет как носители направления, отсутствие дублирования категории во вторичной метадате |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `d53ce50e2842e8d69a709b92417888ba851774b4` | feat(broker-operation): show operation type label in ledger entries |
|
||
| specs (archive) | `37c0133e8baf15959a0c38e45e7b7ac320b8084f` | docs(specs): archive ledger-entry-type-label change and sync main spec |
|
||
| docs (as-built) | `2abb5912b2db23d4984ca3b99578310596d66555` | docs(brokerage-account-ledger): describe operation type label and no category duplication |
|
||
| docs (evidence) | current evidence commit | docs: record ledger entry type label evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npm ci` (frontend, Node 22) | pass; 419 packages from offline cache, 0 vulnerabilities |
|
||
| `npm run verify` (frontend) | pass (exit 0); strict TypeScript, Biome, coverage (`21` files / tests зелёные), Knip, dependency-cruiser и production build прошли без ошибок |
|
||
| `npm ci` (docs) | pass |
|
||
| `npm run verify` (docs) | pass (exit 0); markdownlint `38` files, `0` issues, `git diff --check` clean |
|
||
| `openspec validate ledger-entry-type-label --type change --strict --store wealth-ledger-specs` (specs, pre-archive) | pass; change valid |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, pre/post-archive) | pass; `20 passed, 0 failed` |
|
||
| `openspec archive ledger-entry-type-label --store wealth-ledger-specs --yes` (specs) | pass; Task status Complete, main spec `brokerage-account-ledger` обновлён (`~ 1 modified`), archived as `2026-08-27-ledger-entry-type-label` |
|
||
| `openspec validate --archived --strict --store wealth-ledger-specs` (specs, post-archive) | pass; `38 passed, 0 failed` |
|
||
| `git diff --check` (frontend/docs/specs) | pass (clean) |
|
||
|
||
Environment note: `specs/scripts/verify-workspace-change.sh` and
|
||
`verify-openspec-version.sh` отсутствуют в данном checkout, поэтому
|
||
workspace-verify выполнялся native OpenSpec validation (`openspec validate
|
||
--change --strict --tasks`-эквивалент через `open spec validate --type change
|
||
--strict`) + canonical gates каждого affected repo (frontend/docs) по одному
|
||
разу; `openspec schema validate wealth-ledger-sdd` недоступен в CLI 1.10.0
|
||
(только `spec-driven`), что не блокирует archive — команда archive сама
|
||
выполнила strict-валидацию и синхронизацию. Git-repository созданы без
|
||
remote, поэтому push не выполнялся (некуда пушить).
|
||
|
||
Все Tasks были завершены до archive. Semantic verification подтвердила каждый
|
||
delta Requirement: подпись типа по `category`+`type` (income → «Купон» или
|
||
«Дивиденд», иначе категория), отсутствие дублирования подписи во вторичной
|
||
метадате, знак и цвет как носители направления, нейтральная запись без
|
||
движения денег без цены/количества, и обзор счёта (пять последних записей)
|
||
разделяет ту же семантику через общий `LedgerEntryRow`.
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical findings — `0`, Important findings — `0`, Minor
|
||
findings — `0`. Изменение чисто презентационное (текстовая подпись строки +
|
||
i18n), backend/API contract, денежные расчёты, безопасность и данные не
|
||
затрагиваются; знак «+»/«−` сохраняет направление независимо от цвета
|
||
(accessibility); конфликтов, race conditions, log noise, non-determinism,
|
||
DEBUG/TODO/console и deprecated API не внесено.
|
||
|
||
## 2026-08-27-consume-mantine-components
|
||
|
||
**Change:** consume-mantine-components (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-27-consume-mantine-components`
|
||
**Specs sync:** `skip_specs: true`; технический рефакторинг заменяет ручную
|
||
реализацию хлебных крошек на штатный `Mantine Breadcrumbs` без изменения
|
||
observable requirements или API contract (capability `app-breadcrumb-navigation`
|
||
не меняется).
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | `AppBreadcrumbs` переведён на `Mantine Breadcrumbs` (`component="nav"`, `aria-label`, `data-depth`, `separator`); цепочки/пропсы `AccountBreadcrumbs` и `AppBreadcrumbs` не изменены; кастомные `breadcrumbs-*` классы удалены из `styles.css`, сохранены только адаптивное правило `data-depth="3"` (медиа, узкий экран) и базовое оформление ссылок; тест обновлён под Mantine DOM (navigation role, `aria-label`, `aria-current="page"`, `data-depth`, ссылки, fallback «Счет», `aria-hidden` у сепараторов) |
|
||
| backend | N/A | API contract, данные и backend-поведение не менялись |
|
||
| specs | affected | Approved Proposal, Design и Tasks заархивированы с `skip_specs: true` |
|
||
| docs | N/A | Ни один as-built документ в `docs/` не описывает эти компоненты; правки product docs не требовались — итог подводит только Completion Evidence |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `3c459e6` | refactor: use Mantine Breadcrumbs for app navigation |
|
||
| backend | — | N/A |
|
||
| specs (archive) | `b5df309` | docs(specs): archive consume-mantine-components change |
|
||
| docs (as-built) | — | N/A (docs as-built не изменялись — компонент не задокументирован) |
|
||
| docs (evidence) | current evidence commit | docs: record Mantine breadcrumbs evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `npx vitest run src/app/ui/AppBreadcrumbs.test.tsx` (frontend) | pass; 6 tests (включая `aria-hidden` сепараторов и прежние поведенческие ассерты) |
|
||
| `npm run verify` (frontend, Node 22) | pass (exit 0); strict TypeScript, Biome, coverage, Knip, dependency-cruiser и production build без ошибок |
|
||
| `openspec validate consume-mantine-components --type change --strict --store wealth-ledger-specs` (specs, pre-archive) | pass; change valid |
|
||
| `git diff --check` (specs) | pass (clean) |
|
||
| `openspec validate consume-mantine-components --type change --strict --store wealth-ledger-specs` (specs, post-tasks-edit) | pass; change valid |
|
||
|
||
Environment note: `specs/scripts/verify-workspace-change.sh` и
|
||
`verify-openspec-version.sh` отсутствуют в данном checkout, поэтому workspace
|
||
verification выполнялся native OpenSpec validation (`openspec validate --type
|
||
change --strict`) + canonical gate affected repo (frontend `npm run verify`) и
|
||
`git diff --check`; OpenSpec CLI `1.10.0` проверен напрямую (совпадает с pinned
|
||
`.cli-version`). Git-репозитории созданы без remote, поэтому push не выполнялся.
|
||
|
||
Все Tasks завершены до archive. Semantic verification подтвердила соответствие
|
||
утверждённому Design (D1–D3): Mantine `Breadcrumbs` с `component="nav"`,
|
||
`aria-label`, `data-depth` и `separator="→"`; предшествующие крошки — `Link`
|
||
children, текущая — `<span aria-current="page">`; удалены кастомные
|
||
`breadcrumbs-*` классы, адаптивное правило `data-depth="3"` и базовое
|
||
оформление ссылок сохранены; маршруты, цепочки, aria и ссылки не изменились.
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Первый review выявил 1 Important и 2 Minor findings:
|
||
(1) сепаратор «→» потерял `aria-hidden`, что меняло доступный tree — исправлено
|
||
на `separator={<span aria-hidden="true">→</span>}` с добавлением теста; (2)
|
||
потерян `margin-bottom: 1rem` — восстановлен через `[data-depth]`; (3) потерян
|
||
accent-цвет ссылок — восстановлен через `[data-depth] a`. Повторная проверка
|
||
подтвердила: Critical — `0`, Important — `0`, Minor — `0`. Review также
|
||
подтвердил неизменность routing/chain-логики, сохранение `<nav>`/`aria-label`/
|
||
`data-depth`, адаптивного скрытия промежуточных крошек и отсутствие остаточных
|
||
`breadcrumbs-*` ссылок во `frontend/src`.
|
||
|
||
## 2026-08-27-account-ledger-explicit-filters
|
||
|
||
**Change:** account-ledger-explicit-filters (schema `wealth-ledger-sdd`)
|
||
**Archive path:** `specs/openspec/changes/archive/2026-08-27-account-ledger-explicit-filters`
|
||
**Specs sync:** в main spec `brokerage-account-ledger` добавлен Requirement
|
||
`User can explicitly apply ledger filters` с четырьмя scenarios: черновик не
|
||
делает запрос до `Применить`, `Применить` коммитит draft и сбрасывает cursor,
|
||
`Сбросить` очищает фильтр и пагинацию, пагинация остаётся привязанной к
|
||
последнему применённому фильтру.
|
||
|
||
### Delivery Map
|
||
|
||
| Area | Status | Outcome |
|
||
| --- | --- | --- |
|
||
| frontend | affected | Страница `account-operations` переведена на draft/applied семантику фильтров: два `DateInput` c `DD.MM.YYYY`, `min/max` и русской локалью через `DatesProvider`; категории собраны в `MultiSelect` с placeholder `Выберите категории`; кнопки `Применить`/`Сбросить` управляют применённым состоянием; `Сбросить` дополнительно инвалидирует unfiltered query key, чтобы React Query не подменял обязательный повторный запрос свежим cache hit; добавлены risk-based тесты для сценариев «черновик без запроса» и «reset перезапрашивает без categories» |
|
||
| backend | N/A | API `/api/v1/brokerage-accounts/{accountId}/operations`, query params `from`/`to`/`categories`/`cursor`/`limit`, серверный дефолт периода и cache identity не менялись |
|
||
| specs | affected | Approved Proposal, Design, Tasks и delta spec заархивированы; Requirement синхронизирован в main spec `brokerage-account-ledger` |
|
||
| docs | affected | `features/brokerage-account-ledger.md` описывает staged draft/applied поведение, явные `Применить`/`Сбросить` и пагинацию по последнему применённому фильтру |
|
||
|
||
### Delivery commits
|
||
|
||
| Repo | Commit | Subject |
|
||
| --- | --- | --- |
|
||
| frontend | `7d748a65d384e76220e234aa37a21b05b81e442a` | feat(account-operations): require explicit ledger filters |
|
||
| specs (archive) | `69d4e63a5110f744a2428dd9d40525bf025a2db8` | docs(specs): archive account-ledger-explicit-filters |
|
||
| docs (as-built) | `820cf5510318e0868eba46a6ff0b556053cb9806` | docs(brokerage-account-ledger): describe explicit filters |
|
||
| docs (evidence) | current evidence commit | docs: record explicit ledger filters evidence |
|
||
|
||
### Verification
|
||
|
||
| Command (repo) | Наблюдённый результат |
|
||
| --- | --- |
|
||
| `source ~/.nvm/nvm.sh && nvm use 22 >/dev/null && node -v && npm run verify` (frontend) | pass; Node `v22.21.0`, canonical gate прошёл: strict TypeScript, Biome, coverage (`21` files / `79` tests), Knip, dependency-cruiser и production build без ошибок |
|
||
| `npm ci` (frontend) | pass; lockfile не изменился, install завершён |
|
||
| `npm run verify` (docs) | pass; markdownlint `38` files, `0` issues, `git diff --check` clean |
|
||
| `openspec validate account-ledger-explicit-filters --type change --strict --store wealth-ledger-specs` (specs, pre-archive) | pass; change valid |
|
||
| `openspec archive account-ledger-explicit-filters --yes --store wealth-ledger-specs` (specs) | pass; Task status `✓ Complete`, main spec `brokerage-account-ledger` обновлён, change archived as `2026-08-27-account-ledger-explicit-filters` |
|
||
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, pre/post-archive) | pass; `20 passed, 0 failed` |
|
||
| `git diff --check` (frontend/docs/specs) | pass |
|
||
| `openspec validate --archived --strict --store wealth-ledger-specs` (specs, post-archive) | external failure; `39 passed, 1 failed` because unrelated archived change `2026-08-27-consume-mantine-components` still has `1 incomplete task`; `2026-08-27-account-ledger-explicit-filters` itself passed archived validation |
|
||
|
||
Environment note: during `npm ci` the default shell used Node `v26.7.0` and
|
||
printed an `EBADENGINE` warning, поэтому canonical frontend gate был повторно
|
||
запущен под `nvm use 22` и именно этот результат считается verification
|
||
evidence. В `specs` рабочее дерево после archive остаётся с незафиксированным
|
||
соседним change `add-session-oriented-sdd-skills`; он не входит в delivery
|
||
этой фичи и не включался в archive commit.
|
||
|
||
Все Tasks были отмечены completed до archive. Semantic verification подтвердила
|
||
утверждённые Proposal, Design и delta scenarios: черновик фильтров не меняет
|
||
видимый ledger и не делает новый запрос до `Применить`; `Применить` коммитит
|
||
draft и сбрасывает cursor; `Сбросить` очищает draft/applied state и принуждает
|
||
повторный unfiltered fetch; кнопки пагинации продолжают работать по последнему
|
||
применённому фильтру; backend contract и server default period не меняются.
|
||
|
||
### Independent read-only review
|
||
|
||
Verdict: **PASS**. Critical findings — `0`, Important findings — `0`, Minor
|
||
findings — `0`. Проверка diff и post-archive состояния подтвердила, что
|
||
изменение локализовано во frontend/docs/specs, не меняет backend/API contract,
|
||
не затрагивает денежные вычисления, auth, data integrity или security, не
|
||
вводит лишних зависимостей сверх `@mantine/dates` и `dayjs`, а дополнительная
|
||
invalidate-on-reset логика закрывает реальный cache edge case вместо тестового
|
||
костыля. Residual blocker относится не к этой фиче, а к чужому archived change
|
||
`consume-mantine-components`.
|