From d2a98f31577cdd0730efa6fad73e132572e017f2 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Mon, 24 Aug 2026 23:43:35 +0300 Subject: [PATCH] docs: record add-instrument-logos completion evidence --- development/completion-evidence.md | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 development/completion-evidence.md diff --git a/development/completion-evidence.md b/development/completion-evidence.md new file mode 100644 index 0000000..8849d68 --- /dev/null +++ b/development/completion-evidence.md @@ -0,0 +1,52 @@ +# 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`, извлечение выполняется в сервисе +портфеля.