Files
docs/development/completion-evidence.md
T

532 lines
43 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.