Files
docs/development/completion-evidence.md
T

94 lines
7.3 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
Фактические записи о поставке завершённых 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 в тестах, именование тестов).