Completion Evidence
Фактические записи о поставке завершённых changes: Delivery Map, archive path,
delivery commits, точные verification commands с наблюдёнными результатами и
итог independent read-only review. Записи добавляются после archive и являются
неизменяемой историей поставки.
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.