Files
docs/development/completion-evidence.md
T

143 lines
10 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-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.