4.2 KiB
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, извлечение выполняется в сервисе
портфеля.