## 1. Backend: expose ISIN - [x] 1.1 Расширить тип `TbankInstrument` полем `isin?: string` в `tbank.client.ts` - [x] 1.2 Добавить nullable `isin` в `PortfolioPositionDto` в `portfolio.dto.ts` - [x] 1.3 Возвращать `isin: metadata?.isin?.trim() || null` в `position()` в `portfolio.service.ts` - [x] 1.4 Обновить `portfolio.service.spec.ts`: моки и ожидания `isin`, включая отсутствие ISIN - [x] 1.5 Проверить backend: `npm run lint`, `npm test`, `npm run build` ## 2. Frontend: OpenAPI contract и display-helper - [x] 2.1 Обновить snapshot и `schema.d.ts`: `npm run openapi:sync` (поле `isin`) - [x] 2.2 Добавить helper `formatShare(numerator, denominator)` в `display.ts` (строка %, 1 знак, `null` при недоступности) - [x] 2.3 Добавить unit-тесты `formatShare` в `display.test.ts` ## 3. Frontend: Position Card grid-плитки - [x] 3.1 Заменить `Card`-строки в `PositionSection` на `SimpleGrid cols={{ base: 1, sm: 2, md: 3 }}` в `AccountPage.view.tsx` - [x] 3.2 Вычислить во view сумму `currentValue` позиций по каждой валюте (без Cash Balance) и передать её плиткам - [x] 3.3 Рендерить плитку: имя, `isin` (mono, dim), количество, `currentValue`, `absoluteReturn` (зелёный/красный), `averagePurchasePrice`, долю; скрывать null-метрики - [x] 3.4 Добавить стили плитки в `AccountPage.module.css` - [x] 3.5 Добавить i18n-ключи в `ru.ts` (средняя цена покупки, доля, ISIN) ## 4. Frontend: тесты - [x] 4.1 Обновить `AccountPage.test.tsx`: заменить проверку «—» на скрытие null, добавить проверки плиток, `isin`, доли и сохранения upstream-порядка - [x] 4.2 Проверить frontend: `npm run verify` ## 5. Документация - [x] 5.1 Добавить термин Instrument в `CONTEXT.md` - [x] 5.2 Обновить `docs/features/portfolio-view.md`: grid-плитки, метрики, `isin`, доля; API-секция про `isin` ## 6. Верификация и архив - [x] 6.1 Прогнать `opsx-verify` по change - [x] 6.2 Архив change через `openspec archive` и синхронизация delta в main spec - [x] 6.3 Закоммитить по репозиториям: specs, docs, backend, frontend ## Сверка evidence — 2026-08-23 Задачи 6.2–6.3 были незакрытыми administrative tasks после фактического archive. Их статус согласован по текущему read-only evidence; эта запись не меняет archive date, implementation files, delta specs или прошлые Git commits. - `git -C specs show --stat --oneline --summary 6795ee6` — commit `6795ee6` от 2026-08-17 создаёт `openspec/changes/archive/2026-08-17-redesign-position-cards/` и одновременно изменяет `openspec/specs/portfolio-view/spec.md`; это подтверждает archive и sync delta. - `git -C docs show --stat --oneline --summary c628535` — commit `c628535` от 2026-08-17 обновляет `features/portfolio-view.md`. - `git -C backend show --stat --oneline --summary 5aa9bd3` — commit `5aa9bd3` от 2026-08-17 содержит ISIN DTO/service/client/spec changes. - `git -C frontend show --stat --oneline --summary 5168870` — commit `5168870` от 2026-08-17 содержит Position Card, OpenAPI, i18n и tests changes. В local history отсутствует отдельный terminal transcript вызова `openspec archive`; evidence выше подтверждает его наблюдаемый результат и связанные commits, не приписывая прошлому workflow незафиксированные команды.