## 1. Backend Portfolio contract - [x] 1.1 [backend] Добавить nullable `ticker` в нормализованную Portfolio Position и её OpenAPI DTO, заполняя его из уже разрешённой metadata с `null` для пустого или недоступного значения; расширить focused Portfolio service tests для доступного и отсутствующего ticker. - **Covers:** `portfolio-view` — `Нормализованный состав Portfolio` - **Verification:** `npm test -- portfolio.service.spec.ts --runInBand` в `backend` подтверждает ticker и null fallback в ответе Portfolio. - [x] 1.2 [backend] Опубликовать обновлённый runtime OpenAPI из backend и выполнить canonical backend quality gate. - **Covers:** `N/A` — runtime schema — технический источник frontend snapshot для утверждённого additive public contract. - **Verification:** `npm run verify` в `backend`. ## 2. Frontend generated contract и карточка акции - [x] 2.1 [frontend] Скопировать опубликованный backend OpenAPI document в committed snapshot и регенерировать frontend types штатной командой без ручной правки generated файла. - **Covers:** `N/A` — generated contract синхронизирует утверждённое backend behavior с frontend consumer и не вводит самостоятельное observable behavior. - **Verification:** `npm run openapi:generate` в `frontend`; snapshot и generated `PortfolioPositionDto` содержат nullable `ticker`. - [x] 2.2 [frontend] Изменить presentation карточки так, чтобы `STOCK` показывал ticker с ISIN fallback, а `BOND` и другие типы сохраняли ISIN; добавить focused regression coverage этих трёх случаев. - **Covers:** `portfolio-view` — `Представление карточек позиций на клиенте` - **Verification:** focused frontend test card/account page подтверждает ticker-only stock, ISIN fallback и неизменённую облигацию. - [x] 2.3 [frontend] Выполнить canonical frontend gate после обновления generated contract и presentation. - **Covers:** `N/A` — canonical gate проверяет type safety, UI tests, boundaries и production build изменённого frontend. - **Verification:** `npm run verify` в `frontend`. ## 3. As-built documentation и canonical specs - [x] 3.1 [docs] После проверенной реализации обновить Portfolio feature documentation: nullable ticker в Position и правило его отображения только на карточке акции с ISIN fallback. - **Covers:** `N/A` — as-built documentation фиксирует delivered behavior, но не является source of normative requirement. - **Verification:** `npm run verify` в `docs` и scoped review, что документация не описывает планировочные артефакты. - [x] 3.2 [specs] Подтвердить, что approved Proposal, Delta Specs и Design остаются единственным canonical описанием change до archive. - **Covers:** `N/A` — change artifacts уже владеют спецификацией behavior; задача не добавляет отдельного runtime behavior. - **Verification:** `openspec validate show-stock-tickers-on-position-cards --type change --strict --store wealth-ledger-specs` в `specs`. ## 4. Cross-area contract и completion review - [x] 4.1 [workspace] Проверить обязательное совпадение backend runtime OpenAPI и committed frontend snapshot после их синхронизации. - **Covers:** `N/A` — cross-repository contract gate подтверждает delivery Decision, не создавая дополнительное observable behavior. - **Verification:** `npm run test:openapi-contract` в `backend`. - [x] 4.2 [workspace] Выполнить semantic verification против Proposal, Delta Specs и Design, затем independent read-only review backend mapping, generated contract, stock-card fallback и as-built docs. - **Covers:** `N/A` — cross-area verification подтверждает реализацию утверждённого behavior и rollback assumptions. - **Verification:** review фиксирует проверенные области и не содержит Critical или Important findings перед archive.