143 lines
10 KiB
Markdown
143 lines
10 KiB
Markdown
# Completion Evidence
|
||
|
||
<!-- markdownlint-disable MD024 -->
|
||
|
||
Фактические записи о поставке завершённых 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.
|