Files
docs/development/completion-evidence.md
T

246 lines
19 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.
## 2026-08-25-remove-frontend-hook-token-params
**Change:** remove-frontend-hook-token-params (schema `wealth-ledger-sdd`)
**Archive path:** `specs/openspec/changes/archive/2026-08-25-remove-frontend-hook-token-params`
**Specs sync:** `skip_specs: true`; change закрывает audit-derived frontend
architecture item без изменения observable product requirements.
### Delivery Map
| Area | Status | Outcome |
| --- | --- | --- |
| frontend | affected | `usePortfolio`, `useBrokerageAccounts`, `useBrokerageOperations` и `useBrokerageEvents` больше не принимают `accessToken`; protected query gating централизован в shared `useAuthenticatedQuery`; page/app callers перестали читать auth state только ради token plumbing; добавлены regression tests |
| backend | N/A | API contract и backend behavior не менялись |
| specs | affected | OpenSpec change заархивирован как process/audit remediation без delta specs |
| docs | N/A | As-built product docs не менялись; Completion Evidence добавлен отдельным финальным docs-коммитом |
### Delivery commits
| Repo | Commit | Subject |
| --- | --- | --- |
| frontend | `268acdf2e1057ed0f6c19384bfb6477aff773d1d` | refactor: centralize frontend auth query gating |
| backend | — | N/A |
| specs | `6e2890f86f5316fdb821b043084461314eb8cf13` | docs(specs): archive frontend auth query gating change |
| docs | current evidence commit | docs: record frontend auth query gating evidence |
### Verification
| Command (repo) | Наблюдённый результат |
| --- | --- |
| `npm run test:run -- src/shared/api` (frontend, RED baseline before implementation) | failed as expected because `./authenticated-query` did not exist |
| `npm run test:run -- src/shared/api` (frontend) | pass; 2 files / 4 tests |
| `npm run test:run -- src/entities/portfolio/api/usePortfolio.test.tsx src/entities/broker-operation/api/useBrokerageOperations.test.tsx src/entities/brokerage-account/api/useBrokerageAccounts.test.tsx src/entities/brokerage-event/api/useBrokerageEvents.test.tsx` (frontend) | pass; 4 files / 4 tests |
| `npm run test:run -- src/pages/accounts src/pages/account src/pages/account-operations src/pages/account-events src/app/ui` (frontend) | pass; 6 files / 29 tests |
| `npm run typecheck` (frontend) | pass |
| `rg "usePortfolio\\([^\\n,]+,\\s*accessToken\|useBrokerageAccounts\\(accessToken\|useBrokerageOperations\\([^\\n]+accessToken\|useBrokerageEvents\\([^\\n]+accessToken" frontend/src -n` (workspace) | no matches |
| `bash specs/scripts/verify-workspace-change.sh remove-frontend-hook-token-params` (workspace, pre-archive, Node 22.21.0) | pass; Delivery Map verified frontend/specs=affected, backend/docs/runtime-openapi=N/A; frontend canonical verification passed |
| `openspec archive remove-frontend-hook-token-params --skip-specs --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-25-remove-frontend-hook-token-params` |
| `npm run verify` (frontend, post-archive, Node 22.21.0) | pass; runtime/openapi/hygiene/typecheck/lint/vitest/knip/deps/build/bundle-budget без ошибок; 21 test files / 67 tests; initial JavaScript payload 510597 bytes |
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 20 passed, 0 failed |
| `bash scripts/verify-openspec-authority.sh` (specs, post-archive) | pass; OpenSpec CLI 1.10.0, authority `wealth-ledger-specs` |
### Independent read-only review
Verdict: **PASS**. Critical и Important findings отсутствовали; Minor findings
отсутствовали. Reviewer подтвердил, что четыре targeted hooks и их callers
больше не передают `accessToken`, auth gating централизован в shared API layer,
query params/keys, `staleTime` и `retry: false` сохранены, а оставшееся
использование `accessToken` в T-Bank connection ViewModel соответствует
явному non-goal Design. Residual risk: full AuthProvider login/refresh/logout
path enabling/disabling authenticated queries покрыт ограниченно; direct
session snapshot transition через `configureAuthClient` покрыт regression test.
## 2026-08-25-codify-frontend-component-style
**Change:** codify-frontend-component-style (schema `wealth-ledger-sdd`)
**Archive path:** `specs/openspec/changes/archive/2026-08-25-codify-frontend-component-style`
**Specs sync:** дельта `frontend-quality-guardrails` слита в main spec; `openspec validate --specs --strict --store wealth-ledger-specs` — `20 passed, 0 failed`.
### Delivery Map
| Area | Status | Outcome |
| --- | --- | --- |
| frontend | affected | Authored React components мигрированы на const-valued `FC` declarations; props destructuring перенесён внутрь component body; лишние children-only props aliases удалены в пользу `FC<PropsWithChildren>`; чистые barrels используют direct re-exports; Biome gate блокирует проверяемую часть style |
| backend | N/A | Backend behavior, routes, DTOs, persistence и runtime OpenAPI contract не менялись |
| specs | affected | Delta `frontend-quality-guardrails` синхронизирована в main spec, change заархивирован |
| docs | N/A | As-built product docs не менялись; Completion Evidence добавлен отдельным финальным docs-коммитом |
### Delivery commits
| Repo | Commit | Subject |
| --- | --- | --- |
| frontend | `d10e1dd1827094e6e52768f0ccd2ea060aef95a1` | chore: codify React component style |
| backend | — | N/A |
| specs | `6898732dd8e933e9d6a587aef48ebe0eddaa0cf2` | docs: archive React component style change |
| docs | current evidence commit | docs: record React component style evidence |
### Verification
| Command (repo) | Наблюдённый результат |
| --- | --- |
| `npm run typecheck` (frontend, baseline before structural edits) | pass |
| `npm run test:coverage` (frontend, baseline before structural edits) | pass; 21 test files / 67 tests |
| `npm exec biome -- check .tmp-biome-style/compliant.tsx` (frontend) | pass; compliant representative sample accepted |
| `npm exec biome -- check .tmp-biome-style/function-component.tsx` (frontend) | failed as expected with `lint/nursery/useReactFunctionComponentDefinition` |
| `npm exec biome -- check .tmp-biome-style/default-export.tsx` (frontend) | failed as expected with `lint/style/noDefaultExport` |
| `npm exec biome -- check .tmp-biome-style/export-order.tsx` (frontend) | failed as expected with `lint/style/useExportsLast` |
| `rg "type \\w+Props = PropsWithChildren;" frontend/src -g '!shared/api/generated/**'` (workspace) | no matches |
| `rg -n "^import \\{ .+ \\} from \\\"\\." frontend/src/**/index.ts` (workspace) | no matches |
| `PATH=/Users/ksv741/.nvm/versions/node/v22.21.0/bin:$PATH npm run verify` (frontend) | pass; runtime Node 22.21.0, OpenAPI/hygiene/typecheck/lint/vitest/knip/deps/build/bundle checks passed; 21 test files / 67 tests; initial JavaScript payload 510523 bytes |
| `bash specs/scripts/verify-workspace-change.sh codify-frontend-component-style` (workspace, Node 22.21.0) | pass; Delivery Map verified frontend/specs=affected, backend/docs/runtime-openapi=N/A; main specs 20 passed, frontend canonical verification passed |
| `openspec archive codify-frontend-component-style --yes --store wealth-ledger-specs` (specs) | pass; archived as `2026-08-25-codify-frontend-component-style` |
| `openspec validate --specs --strict --store wealth-ledger-specs` (specs, post-archive) | pass; 20 passed, 0 failed |
| `git diff --check` (frontend/specs) | pass |
### Independent read-only review
Verdict: **PASS**. Critical и Important findings отсутствовали. Minor findings
о mixed-language summary и stale wording устранены до archive. После уточнения
Change Owner дополнительно удалены children-only aliases вида
`type TestWrapperProps = PropsWithChildren` и чистые barrel imports ради
последующего re-export; обе convention-проверки подтверждены пустыми `rg`
результатами. Generated OpenAPI source остался вне manual migration.