diff --git a/apps/docs/docs/backend/api.md b/apps/docs/docs/backend/api.md
index 6945f10..cd1d285 100644
--- a/apps/docs/docs/backend/api.md
+++ b/apps/docs/docs/backend/api.md
@@ -392,3 +392,16 @@
`DELETE` endpoints возвращают `{ data: null, meta }`, что отражено в OpenAPI schema и frontend
codegen types.
+
+## Broker (T-Bank Invest)
+
+Все broker endpoints защищены JWT и возвращают envelope `{ data, meta }`.
+
+| Endpoint | Method | Описание |
+|---|---|---|
+| `/api/v1/broker/accounts` | GET | Список брокерских счетов и ИИС |
+| `/api/v1/broker/accounts/:accountId/portfolio` | GET | Портфель счёта: позиции, cash, метаданные |
+| `/api/v1/broker/accounts/:accountId/events` | GET | События и будущие выплаты (дивиденды, купоны) с фильтром по датам |
+| `/api/v1/broker/accounts/:accountId/operations` | GET | История операций (cursor pagination) |
+| `/api/v1/broker/accounts/:accountId/operations/refresh` | POST | Принудительная синхронизация операций из T-Bank |
+| `/api/v1/broker/accounts/:accountId/positions` | GET | Позиции счёта (с пагинацией) |
diff --git a/apps/docs/docs/backend/overview.md b/apps/docs/docs/backend/overview.md
index 2702eec..c1d9925 100644
--- a/apps/docs/docs/backend/overview.md
+++ b/apps/docs/docs/backend/overview.md
@@ -48,5 +48,7 @@ apps/backend/src/
├── securities/
├── shares/
├── bonds/
- └── candles/
+ ├── candles/
+ ├── portfolio/
+ └── tbank/
```
diff --git a/apps/docs/docs/backend/tbank-invest.md b/apps/docs/docs/backend/tbank-invest.md
index 794b1fb..c9bdb26 100644
--- a/apps/docs/docs/backend/tbank-invest.md
+++ b/apps/docs/docs/backend/tbank-invest.md
@@ -40,9 +40,44 @@ root CA, которым локальная сеть или proxy подписы
|---|---|
| `GET /api/v1/broker/accounts` | Открытые брокерские счета и ИИС |
| `GET /api/v1/broker/accounts/:accountId/portfolio` | Итоги портфеля, позиции, деньги и заблокированные деньги |
+| `GET /api/v1/broker/accounts/:accountId/events` | Будущие события (дивиденды, купоны, погашения, оферты) и прошедшие фактические выплаты с фильтром по датам и типам |
| `GET /api/v1/broker/accounts/:accountId/operations` | История операций с cursor pagination |
| `POST /api/v1/broker/accounts/:accountId/operations/sync` | Синхронизация истории операций в локальные Prisma-таблицы |
+## Поток данных для `/events`
+
+Endpoint `/events` агрегирует будущие события и прошедшие выплаты из нескольких источников:
+
+```mermaid
+sequenceDiagram
+ actor User
+ participant Frontend
+ participant Backend
+ participant TBank as T-Bank gRPC
+ participant MOEX as MOEX ISS (cache)
+
+ User->>Frontend: Открывает вкладку «События»
+ Frontend->>Backend: GET /broker/accounts/:id/events?from=X&to=Y&types=Z
+ Backend->>TBank: GetPositions (текущие позиции счёта)
+ TBank-->>Backend: positions[]
+ loop Для каждой позиции
+ Backend->>MOEX: Получить график купонов / дивидендов
+ MOEX-->>Backend: futureEvents[]
+ end
+ Backend->>TBank: GetOperationsByCursor (фактические выплаты за период)
+ TBank-->>Backend: pastPayouts[]
+ Note over Backend: Агрегация + фильтр по from/to/types
+ Backend-->>Frontend: { events[], summary }
+ Frontend->>User: Отображает таблицу событий и сумму выплат
+```
+
+- **Будущие события** — строятся на лету по текущим позициям счёта и MOEX-метаданным (график купонов, даты дивидендов). Не записываются в БД.
+- **Прошедшие выплаты** — извлекаются из истории операций T-Bank за указанный период.
+- **Summary** — агрегированная оценка будущих выплат (не является гарантированной суммой).
+- Кешируется через `CACHE_TBANK_EVENTS_TTL`.
+
+Типы событий: `dividend`, `coupon`, `maturity`, `offer`. Первые три относятся к `cashflow`, `offer` — к `corporate`.
+
## Методы T-Bank
| Задача | Метод T-Bank |
@@ -51,6 +86,7 @@ root CA, которым локальная сеть или proxy подписы
| Итоги портфеля | `OperationsService/GetPortfolio` |
| Деньги и settled-позиции | `OperationsService/GetPositions` |
| История операций | `OperationsService/GetOperationsByCursor` |
+| События и выплаты | Агрегация из позиций счёта + фактических операций |
| Метаданные инструментов | `InstrumentsService/GetInstrumentBy` |
## Кеширование и синхронизация
@@ -62,6 +98,7 @@ Direct-read endpoints используют короткий in-memory cache, ч
- портфель: `CACHE_TBANK_PORTFOLIO_TTL`
- позиции: `CACHE_TBANK_POSITIONS_TTL`
- страницы операций: `CACHE_TBANK_OPERATIONS_TTL`
+- события и прогноз выплат: `CACHE_TBANK_EVENTS_TTL`
- метаданные инструментов: `CACHE_TBANK_INSTRUMENT_TTL`
Для долговременной истории операций есть отдельные таблицы Prisma:
diff --git a/apps/docs/docs/development/commands.md b/apps/docs/docs/development/commands.md
index 1d66501..da8fc43 100644
--- a/apps/docs/docs/development/commands.md
+++ b/apps/docs/docs/development/commands.md
@@ -7,11 +7,16 @@
| `npm run dev:backend` | Запуск NestJS в режиме watch на :3000 |
| `npm run dev:frontend` | Vite dev-сервер на `:5173`, проксирует `/api` на backend |
| `npm run dev:docs` | Docusaurus dev-сервер документации |
+| `npm run dev:design-system` | Storybook dev-сервер дизайн-системы |
| `npm run build:backend` | `nest build` |
| `npm run build:frontend` | `tsc -b && vite build` |
| `npm run build:docs` | `docusaurus build` |
+| `npm run build:design-system` | TypeScript build дизайн-системы |
+| `npm run build:storybook` | Production build Storybook |
| `npm run test:backend` | Offline backend unit tests через Vitest |
| `npm run test:frontend` | Frontend tests через Vitest + Testing Library |
+| `npm run test:design-system` | Design system tests через Vitest |
+| `npm run test:storybook` | Storybook browser tests (Playwright) |
| `npm run lint` | ESLint для backend и frontend |
| `npm run format` | Prettier для всех `*.{ts,tsx}` |
| `npm run format:check` | Проверка Prettier для всех `*.{ts,tsx}` |
@@ -39,6 +44,15 @@
| `npm run lint -w apps/frontend` | ESLint для `src/**/*.{ts,tsx}` |
| `npm run test -w apps/frontend` | Frontend Vitest suite |
+## Design system workspace
+
+| Команда | Описание |
+|---|---|
+| `npm run dev -w packages/design-system` | Storybook dev-server |
+| `npm run build -w packages/design-system` | TypeScript build |
+| `npm run build:storybook -w packages/design-system` | Production build Storybook |
+| `npm run test -w packages/design-system` | Vitest suite |
+
## Docs workspace
| Команда | Описание |
diff --git a/apps/docs/docs/development/testing.md b/apps/docs/docs/development/testing.md
index 0b5e1d9..7c8906d 100644
--- a/apps/docs/docs/development/testing.md
+++ b/apps/docs/docs/development/testing.md
@@ -51,6 +51,28 @@ npm run test -w apps/frontend
Тесты покрывают API-клиент, auth context, hooks, базовые pages и shared components.
+## Тесты design system
+
+Фреймворк: **Vitest** + **React Testing Library** + **Accessibility check**.
+
+Запуск:
+
+```bash
+npm run test:design-system
+# или
+npm run test -w packages/design-system
+```
+
+Тесты покрывают компоненты дизайн-системы: Button, DataTable, Select, Skeleton, Money и др.
+
+## Storybook browser tests
+
+Интерактивные тесты Storybook через Playwright.
+
+```bash
+npm run test:storybook
+```
+
## Live MOEX integration tests
Live MOEX checks вынесены из default backend suite.
diff --git a/apps/docs/docs/frontend/components.md b/apps/docs/docs/frontend/components.md
index c043ae0..d04a767 100644
--- a/apps/docs/docs/frontend/components.md
+++ b/apps/docs/docs/frontend/components.md
@@ -1,7 +1,7 @@
# Компоненты
-Published docs ниже перечисляют primary entrypoints. Legacy файлы в `components/` сохранены как
-тонкие re-export shim'ы для coexistence со старыми импортами.
+Published docs ниже перечисляют primary entrypoints. Все legacy-файлы в `components/` удалены,
+компоненты используют FSD-структуру.
## Layout (`app/layouts/AppLayout.tsx`, legacy shim: `components/Layout.tsx`)
@@ -19,7 +19,7 @@ Published docs ниже перечисляют primary entrypoints. Legacy фа
- При клике на результат переходит на `/stocks/:secid` или `/bonds/:secid`
- Закрывается при клике вне компонента
-Legacy path `components/SearchBar.tsx` остаётся shim-файлом и не является primary entrypoint.
+Legacy path `components/SearchBar.tsx` удалён.
## PriceChart (`widgets/price-chart/ui/PriceChart.tsx`, public API: `widgets/price-chart`)
@@ -30,7 +30,7 @@ Legacy path `components/SearchBar.tsx` остаётся shim-файлом и н
- Цвета: зелёный для роста, красный для падения
- Адаптивная ширина (resize listener)
-Legacy path `components/PriceChart.tsx` остаётся shim-файлом.
+Legacy path `components/PriceChart.tsx` удалён.
## StockDetails (`widgets/stock-details/ui/StockDetails.tsx`, public API: `widgets/stock-details`)
@@ -39,7 +39,7 @@ Legacy path `components/PriceChart.tsx` остаётся shim-файлом.
- Принимает `ShareResponse`
- Отображает: название, тикер, ISIN, цена, изменение (%), open/high/low, объём, капитализация, уровень листинга
-Legacy path `components/StockDetails.tsx` остаётся shim-файлом.
+Legacy path `components/StockDetails.tsx` удалён.
## BondDetails (`widgets/bond-details/ui/BondDetails.tsx`, public API: `widgets/bond-details`)
@@ -48,7 +48,7 @@ Legacy path `components/StockDetails.tsx` остаётся shim-файлом.
- Принимает `BondResponse`
- Отображает: название, ISIN, цена (в % от номинала), номинал, дата погашения, купон (сумма/%), период купона, НКД, доходность к погашению, дюрация, тип
-Legacy path `components/BondDetails.tsx` остаётся shim-файлом.
+Legacy path `components/BondDetails.tsx` удалён.
## DividendsTable (`widgets/dividends-table/ui/DividendsTable.tsx`, public API: `widgets/dividends-table`)
@@ -57,3 +57,12 @@ Legacy path `components/BondDetails.tsx` остаётся shim-файлом.
- Принимает готовый список дивидендов через props
- Рендерит payout-историю без собственных query-вызовов
- Используется page-layer как prop-driven widget
+
+## BrokerEventsOverview (`widgets/broker-events-overview/ui/BrokerEventsOverview.tsx`, public API: `widgets/broker-events-overview`)
+
+Обзор ближайших событий и будущих выплат брокерского счёта.
+
+- Принимает `accountId`
+- Показывает до 5 ближайших событий (дивиденды, купоны)
+- Ссылка на полную страницу событий
+- Состояния: загрузка, ошибка, пустой список
diff --git a/apps/docs/docs/frontend/hooks.md b/apps/docs/docs/frontend/hooks.md
index f09ef4d..52fd35f 100644
--- a/apps/docs/docs/frontend/hooks.md
+++ b/apps/docs/docs/frontend/hooks.md
@@ -10,6 +10,7 @@
| `useStockDividends(secid)` | `['stockDividends', secid]` | 86400s | Дивиденды акции |
| `useBond(secid)` | `['bond', secid]` | 900s | Спецификация облигации |
| `useBondCandles(secid, interval, from, till)` | `['bondCandles', secid, interval, from, till]` | 3600s | Свечи облигации |
+| `useBrokerEvents(accountId, { from, to, types })` | `['broker', 'events', accountId, from, to, types]` | 300s | Будущие события и прошедшие выплаты брокерского счёта |
## Public API
@@ -20,6 +21,7 @@
- broker-account hooks: `entities/broker-account/index.ts`
- broker-position hooks: `entities/broker-position/index.ts`
- broker-operation hooks: `entities/broker-operation/index.ts`
+- broker-event hooks: `entities/broker-event/index.ts`
- session hooks: `entities/session/index.ts`
## Конфигурация Query
diff --git a/apps/docs/docs/frontend/overview.md b/apps/docs/docs/frontend/overview.md
index 46db3ab..78a54db 100644
--- a/apps/docs/docs/frontend/overview.md
+++ b/apps/docs/docs/frontend/overview.md
@@ -14,8 +14,8 @@ React SPA, собранная с Vite.
## Структура исходников
-Published-структура ниже описывает primary FSD entrypoints. Исторические каталоги `api/`, `context/`,
-`hooks/`, `components/` ещё присутствуют в кодовой базе для ещё не мигрированных доменов.
+Published-структура ниже описывает primary FSD entrypoints. Исторические каталоги полностью
+мигрированы.
```
apps/frontend/src/
@@ -34,6 +34,8 @@ apps/frontend/src/
│ └── layouts/
│ ├── AppLayout.tsx # Шапка +
│ └── index.ts
+├── features/ # FSD features
+│ └── screener/ # Скринер ценных бумаг (api, model, ui)
├── shared/
│ ├── api/ # shared API client, response types, generated OpenAPI types
│ └── ui/ # shared UI primitives without domain logic
@@ -55,6 +57,7 @@ apps/frontend/src/
│ ├── broker-account-card/ # Карточка брокерского счёта
│ ├── broker-accounts-summary/ # Сводка брокерских счетов
│ ├── broker-allocation-chart/ # График распределения
+│ ├── broker-events-overview/ # Ближайшие события (обзор)
│ ├── broker-operations-table/ # Таблица операций
│ ├── portfolio-card/ # Карточка портфеля
│ ├── portfolio-form/ # Форма портфеля
@@ -73,14 +76,9 @@ apps/frontend/src/
│ ├── screener/ # Скринер (не мигрирован)
│ ├── broker-accounts/ # FSD: page entrypoint
│ ├── broker-account/ # FSD: page entrypoint
+│ ├── broker-events/ # FSD: page entrypoint
│ ├── broker-positions/ # FSD: page entrypoint
│ └── broker-operations/ # FSD: page entrypoint
-├── api/
-│ └── screener.ts # Screener API helpers (не мигрирован)
-├── hooks/
-│ └── useScreener.ts # Screener hook (не мигрирован)
-├── components/
-│ └── screener/ # Screener UI (не мигрирован)
├── test/
│ ├── factories.ts # Фабрики тестовых данных
│ ├── handlers.ts # MSW handlers
@@ -116,6 +114,7 @@ apps/frontend/src/
| `broker-account` | API брокерских счетов | useBrokerAccounts, useBrokerAccountPortfolios | BrokerAccountLayout |
| `broker-position` | API брокерских позиций | useBrokerPositions | — |
| `broker-operation` | API брокерских операций | useBrokerOperations | — |
+| `broker-event` | API брокерских событий и выплат | useBrokerEvents | — |
Каждая сущность имеет barrel-файл `index.ts`, реэкспортирующий публичное API.
@@ -135,17 +134,10 @@ apps/frontend/src/
- `pages/home`, `pages/stock`, `pages/bond` — FSD page entrypoints для market pages
- `pages/broker-*` — FSD page entrypoints для брокерского домена
-- Временно не мигрированы: `portfolios/`, `screener/`, `LoginPage.tsx`, `RegisterPage.tsx`, `ProfilePage.tsx`
+- `pages/portfolios/` — FSD page entrypoints для портфелей
+- `pages/screener/` — FSD page entrypoint для скринера
+- `pages/LoginPage.tsx`, `RegisterPage.tsx`, `ProfilePage.tsx` — auth страницы, используют FSD-imports из `entities/session`
-### Не мигрировано
+### features
-Скринер остаётся в исторической структуре:
-
-- `api/screener.ts` — API-вызовы
-- `hooks/useScreener.ts` — логика с URLSearchParams
-- `components/screener/` — FilterPanel, FilterPanelBond, FilterPanelShare, ScreenerTable
-- `pages/screener/ScreenerPage.tsx` — страница
-
-Страницы аутентификации (`LoginPage`, `RegisterPage`, `ProfilePage`) — плоские, но используют FSD-импорты из `entities/session`.
-
-ESLint-правила на границы импортов FSD пока не введены.
+- `features/screener/` — скринер: FilterPanel, FilterPanelBond, FilterPanelShare, ScreenerTable, useScreener hook
diff --git a/apps/docs/docs/frontend/routes.md b/apps/docs/docs/frontend/routes.md
index fb5fe9d..cd4f5ee 100644
--- a/apps/docs/docs/frontend/routes.md
+++ b/apps/docs/docs/frontend/routes.md
@@ -15,6 +15,7 @@ Source of truth для маршрутов: `apps/frontend/src/app/routing/AppRou
| `/portfolios/:id` | `PortfolioDetailPage` | Protected | Детальная страница портфеля |
| `/broker` | `BrokerAccountsPage` from `pages/broker-accounts` | Protected | Список брокерских счетов |
| `/broker/:accountId` | `BrokerAccountLayout` + nested pages | Protected | Детальная область брокерского счёта |
+| `/broker/:accountId/events` | `BrokerEventsPage` from `pages/broker-events` | Protected | Календарь событий и выплат |
Все page entrypoints живут в FSD-слоях:
@@ -25,6 +26,7 @@ Source of truth для маршрутов: `apps/frontend/src/app/routing/AppRou
- `pages/broker-account`
- `pages/broker-positions`
- `pages/broker-operations`
+- `pages/broker-events`
Все страницы обёрнуты в `AppLayout`, который содержит:
@@ -87,7 +89,37 @@ Source of truth для маршрутов: `apps/frontend/src/app/routing/AppRou
} />
} />
} />
+ } />
```
+
+## Композиция страницы событий
+
+Страница `/broker/:accountId/events` собирается из FSD-слоёв:
+
+```mermaid
+flowchart TB
+ BrokerEventsPage["pages/broker-events
BrokerEventsPage"]
+ useBrokerEvents["entities/broker-event
useBrokerEvents"]
+ BrokerEventApi["entities/broker-event/api
brokerEventApi"]
+ BrokerEventsOverview["widgets/broker-events-overview
BrokerEventsOverview"]
+ DS["@moex-vibe/design-system
DatePicker, Select, Button
DataTable, Metric, LoadingState"]
+
+ BrokerEventsPage --> useBrokerEvents
+ BrokerEventsPage --> BrokerEventsOverview
+ BrokerEventsPage --> DS
+
+ useBrokerEvents --> BrokerEventApi
+
+ subgraph Overview["Обзор на dashboard счёта"]
+ BrokerAccountOverview["pages/broker-account
BrokerAccountOverviewPage"]
+ BrokerAccountOverview --> BrokerEventsOverview
+ end
+```
+
+- `BrokerEventsPage` — entrypoint страницы: фильтр по датам/типам, таблица событий, summary
+- `BrokerEventsOverview` — компактный блок 5 ближайших событий (используется на overview счёта)
+- `useBrokerEvents` — TanStack Query hook с ключом `['broker', 'events', accountId, from, to, types]`
+```
diff --git a/apps/docs/docs/infrastructure/ci.md b/apps/docs/docs/infrastructure/ci.md
index 80a8723..af48e19 100644
--- a/apps/docs/docs/infrastructure/ci.md
+++ b/apps/docs/docs/infrastructure/ci.md
@@ -18,25 +18,21 @@ env:
## Jobs
-### lint
+Единый job `ci` выполняет последовательно:
-- `actions/checkout@v4`
-- `actions/setup-node@v4` (Node 20)
-- `npm ci`
-- `npm run lint` (ESLint для бэкенда)
-- `npx prettier --check "**/*.{ts,tsx}"` (проверка форматирования)
+1. **Checkout** — `actions/checkout@v4`
+2. **Setup Node** — `actions/setup-node@v4` (Node 20)
+3. **Install** — `npm ci`
+4. **Lint** — `npm run lint`
+5. **Format check** — `npm run format:check`
+6. **Test backend** — `npm run test:backend`
+7. **Test frontend** — `npm run test:frontend`
+8. **Test design system** — `npm run test:design-system`
+9. **Test Storybook (browser)** — `npm run test:storybook`
+10. **Build backend** — `npm run build:backend`
+11. **Build frontend** — `npm run build:frontend`
+12. **Build design system** — `npm run build:design-system`
+13. **Build Storybook** — `npm run build:storybook`
+14. **Build docs** — `npm run build:docs`
-### test
-
-- `actions/checkout@v4`
-- `actions/setup-node@v4` (Node 20)
-- `npm ci`
-- `npm run test:backend` (vitest)
-
-### build
-
-- `actions/checkout@v4`
-- `actions/setup-node@v4` (Node 20)
-- `npm ci`
-- `npm run build:backend` (nest build)
-- `npm run build:frontend` (tsc -b && vite build)
+При failure Storybook build артефакты загружаются для диагностики.
diff --git a/apps/docs/sidebars.ts b/apps/docs/sidebars.ts
index 001d74c..b2f0197 100644
--- a/apps/docs/sidebars.ts
+++ b/apps/docs/sidebars.ts
@@ -78,6 +78,11 @@ const sidebars: SidebarsConfig = {
'adr/ADR-009-portfolio-domain',
'adr/ADR-010-backend-price-computation',
'adr/ADR-011-tbank-invest-grpc',
+ 'adr/ADR-012-frontend-broker-account-aggregation',
+ 'adr/ADR-013-frontend-fsd-broker-pilot',
+ 'adr/ADR-014-frontend-fsd-market-pages',
+ 'adr/ADR-015-frontend-libraries-modernization',
+ 'adr/ADR-016-design-system',
],
},
],
diff --git a/apps/frontend/src/widgets/broker-events-overview/ui/BrokerEventsOverview.test.tsx b/apps/frontend/src/widgets/broker-events-overview/ui/BrokerEventsOverview.test.tsx
index 3b9f21c..73f7922 100644
--- a/apps/frontend/src/widgets/broker-events-overview/ui/BrokerEventsOverview.test.tsx
+++ b/apps/frontend/src/widgets/broker-events-overview/ui/BrokerEventsOverview.test.tsx
@@ -109,7 +109,7 @@ describe('BrokerEventsOverview', () => {
isPlaceholderData: false,
isStale: false,
refetch: vi.fn(),
- promise: Promise.reject(new Error('fail')),
+ promise: new Promise(() => {}),
status: 'error',
fetchStatus: 'idle',
} as unknown as ReturnType);
diff --git a/docs/epics/Authentication.md b/docs/epics/Authentication.md
index e81d11e..e9215e6 100644
--- a/docs/epics/Authentication.md
+++ b/docs/epics/Authentication.md
@@ -1,4 +1,6 @@
-Авторизация
+# Аутентификация
+
+Статус: завершён
Features:
-- auth-system
+- [x] [auth-system](../features/auth-system/spec.md) — регистрация, вход, JWT + refresh token, страницы
diff --git a/docs/epics/BrokerPortfolio.md b/docs/epics/BrokerPortfolio.md
index a107dde..d7d6635 100644
--- a/docs/epics/BrokerPortfolio.md
+++ b/docs/epics/BrokerPortfolio.md
@@ -24,14 +24,14 @@
## Features
-- [T-Bank broker portfolios](../features/tbank-broker-portfolios/spec.md)
-- [Отображение брокерского портфеля](../features/broker-portfolio-display/spec.md)
+- [x] [T-Bank broker portfolios](../features/tbank-broker-portfolios/spec.md) — реализовано
+- [x] [Отображение брокерского портфеля](../features/broker-portfolio-display/spec.md) — реализовано
- [x] [Разделы брокерского счёта](../features/broker-account-sections/spec.md) — реализовано
-- [Информативный обзор брокерских счетов](../features/broker-accounts-overview/spec.md)
+- [x] [Информативный обзор брокерских счетов](../features/broker-accounts-overview/spec.md) — реализовано
- [x] [Календарь событий и прогноз будущих выплат брокерского счёта](../features/broker-events-and-payouts/spec.md) — реализовано
-- [Улучшение UI операций](../features/broker-operations-ui-improvements/spec.md)
-- [Пагинация и загрузка позиций](../features/broker-positions-pagination-and-loading/spec.md)
-- [Исправление deadline и очереди T-Bank](../features/tbank-deadline-queue-fix/spec.md)
+- [x] [Исправление deadline и очереди T-Bank](../features/tbank-deadline-queue-fix/spec.md) — реализовано
+- [~] [Улучшение UI операций](../features/broker-operations-ui-improvements/spec.md) — черновик, частично
+- [~] [Пагинация и загрузка позиций](../features/broker-positions-pagination-and-loading/spec.md) — черновик, частично
## Критерий завершения эпика
diff --git a/docs/epics/DevOps.md b/docs/epics/DevOps.md
index 31653c2..be92676 100644
--- a/docs/epics/DevOps.md
+++ b/docs/epics/DevOps.md
@@ -1,5 +1,7 @@
-Developer Operations
+# Developer Operations
+
+Статус: завершён
Features:
-- ci-cd
-- pre-commit-checks
+- [x] [ci-cd](../features/ci-cd/spec.md) — Gitea Actions pipeline
+- [x] [pre-commit-checks](../features/pre-commit-checks/spec.md) — Husky + lint-staged
diff --git a/docs/epics/Documentation.md b/docs/epics/Documentation.md
index fecac13..221482b 100644
--- a/docs/epics/Documentation.md
+++ b/docs/epics/Documentation.md
@@ -1,5 +1,7 @@
-Документация
+# Документация
+
+Статус: завершён
Features:
-- docusaurus-docs
-- russian-docs-and-architecture-diagrams
+- [x] [docusaurus-docs](../features/docusaurus-docs/spec.md)
+- [x] [russian-docs-and-architecture-diagrams](../features/russian-docs-and-architecture-diagrams/spec.md)
diff --git a/docs/epics/PortfolioDasboard.md b/docs/epics/PortfolioDasboard.md
deleted file mode 100644
index 7ecabfc..0000000
--- a/docs/epics/PortfolioDasboard.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Страница портфеля
-
-Features:
-- pagination-loading-overlay
-- portfolio
-- portfolio-allocation-chart
-- portfolio-analytics
-- portfolio-enricher-optimization
-- portfolio-list-enrichment
diff --git a/docs/epics/PortfolioDashboard.md b/docs/epics/PortfolioDashboard.md
new file mode 100644
index 0000000..3b65093
--- /dev/null
+++ b/docs/epics/PortfolioDashboard.md
@@ -0,0 +1,16 @@
+# Портфельная страница
+
+Статус: активный
+
+## Цель
+
+Страница управления ручными портфелями — создание, редактирование, аналитика, распределение активов.
+
+## Features
+
+- [x] [pagination-loading-overlay](../features/pagination-loading-overlay/spec.md)
+- [x] [portfolio](../features/portfolio/spec.md)
+- [x] [portfolio-allocation-chart](../features/portfolio-allocation-chart/spec.md)
+- [x] [portfolio-analytics](../features/portfolio-analytics/spec.md)
+- [x] [portfolio-enricher-optimization](../features/portfolio-enricher-optimization/spec.md)
+- [x] [portfolio-list-enrichment](../features/portfolio-list-enrichment/spec.md)
diff --git a/docs/epics/QualityAssurance.md b/docs/epics/QualityAssurance.md
index 37929b5..6d37526 100644
--- a/docs/epics/QualityAssurance.md
+++ b/docs/epics/QualityAssurance.md
@@ -1,5 +1,7 @@
-Контроль качества
+# Контроль качества
+
+Статус: активный
Features:
-- frontend-test-coverage
-- quality-gate-contract-docs
+- [x] [frontend-test-coverage](../features/frontend-test-coverage/spec.md)
+- [~] [quality-gate-contract-docs](../features/quality-gate-contract-docs/spec.md) — частично
diff --git a/docs/roadmap.md b/docs/roadmap.md
index 07c19ee..322720b 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -4,25 +4,87 @@ Roadmap отражает порядок продуктовой работы, н
Требования и разрешение на реализацию определяются спецификацией конкретной фичи и текущей задачей
пользователя.
+## Завершённые эпики
+
+### [Аутентификация](epics/Authentication.md)
+
+- [x] [auth-system](features/auth-system/spec.md) — полноценная регистрация, вход, JWT + refresh token,
+ страницы login/register/profile, session provider.
+
+### [Документация](epics/Documentation.md)
+
+- [x] [docusaurus-docs](features/docusaurus-docs/spec.md) — 30+ страниц документации, ADR, диаграммы.
+- [x] [russian-docs-and-architecture-diagrams](features/russian-docs-and-architecture-diagrams/spec.md) —
+ документация на русском, декомпозированные схемы архитектуры.
+
+### [DevOps](epics/DevOps.md)
+
+- [x] [ci-cd](features/ci-cd/spec.md) — Gitea Actions: lint, test, build всех пакетов + Storybook.
+- [x] [pre-commit-checks](features/pre-commit-checks/spec.md) — Husky + lint-staged.
+
## Активные эпики
### [Портфель брокера](epics/BrokerPortfolio.md)
-Цель: сделать реальные брокерские счета понятными на уровне обзора, позиций и операций.
+Цель: дать пользователю целостный доступ к реальным брокерским счетам T-Bank.
-- [x] [Разделы брокерского счёта](features/broker-account-sections/spec.md) — реализовано.
-- [x] [Информативный обзор брокерских счетов](features/broker-accounts-overview/spec.md) — реализовано.
-- [x] [Календарь событий и прогноз будущих выплат брокерского счёта](features/broker-events-and-payouts/spec.md)
- — отдельная вкладка событий и прогноз будущих выплат по выбранному диапазону дат для T-Bank
- счёта.
+- [x] [T-Bank broker portfolios](features/tbank-broker-portfolios/spec.md) — интеграция с gRPC,
+ синхронизация счетов/позиций/операций.
+- [x] [Отображение брокерского портфеля](features/broker-portfolio-display/spec.md) — таблицы позиций
+ по классам, история операций с пагинацией.
+- [x] [Разделы брокерского счёта](features/broker-account-sections/spec.md) — навигация по вкладкам,
+ обзор/позиции/операции/события.
+- [x] [Информативный обзор брокерских счетов](features/broker-accounts-overview/spec.md) —
+ сводка по всем счетам с агрегацией.
+- [x] [Календарь событий и прогноз будущих выплат](features/broker-events-and-payouts/spec.md) —
+ вкладка событий и прогноз выплат по диапазону дат.
+- [x] [Исправление deadline и очереди T-Bank](features/tbank-deadline-queue-fix/spec.md) — deadline
+ внутри PQueue, best-effort обогащение.
+- [~] [Улучшение UI операций](features/broker-operations-ui-improvements/spec.md) — черновик,
+ `keepPreviousData` внедрён, `formatMoney` с префиксом не реализован.
+- [~] [Пагинация и загрузка позиций](features/broker-positions-pagination-and-loading/spec.md) —
+ черновик, пагинация и скелетоны есть, отдельная секция позиций не выделена.
-## Следующие этапы для активной фичи
+### [Портфельная страница](epics/PortfolioDashboard.md)
-1. [x] Проверить и утвердить `spec.md` для планирования.
-2. [x] Проверить и утвердить подготовленные `plan.md` и `tasks.md`.
-3. [x] Получить отдельное подтверждение пользователя перед началом реализации.
+Цель: страница управления портфелями — создание, аналитика, распределение.
+
+- [x] [Portfolio CRUD](features/portfolio/spec.md) — создание/редактирование ручных портфелей,
+ добавление позиций.
+- [x] [График распределения](features/portfolio-allocation-chart/spec.md) — SVG donut chart.
+- [x] [Обогащение списка портфелей](features/portfolio-list-enrichment/spec.md) — batch MOEX
+ обогащение (totalValue, positionCount).
+- [x] [Оптимизация обогащения](features/portfolio-enricher-optimization/spec.md) — batch-методы
+ MoexClient.
+- [~] [Аналитика портфеля](features/portfolio-analytics/spec.md) — Phase 1 (cost basis + PnL)
+ реализован; Phase 2 (дивиденды) и Phase 3 (target allocation) частично.
+- [~] [Пагинация и overlay загрузки](features/pagination-loading-overlay/spec.md) — черновик,
+ `keepPreviousData` и `loading-spinner` есть, компонент `TableLoadingOverlay` не выделен.
+
+### [Контроль качества](epics/QualityAssurance.md)
+
+- [x] [Покрытие frontend-тестами](features/frontend-test-coverage/spec.md) — Vitest + Testing Library +
+ MSW, тесты в colocation.
+- [~] [Quality gate и контрактная документация](features/quality-gate-contract-docs/spec.md) —
+ docs обновлены, OpenAPI актуален; некоторые AC в работе.
+
+## Крупные завершённые работы (вне эпиков)
+
+- [x] [FSD-миграция фронтенда](features/fsd-frontend-refactor/spec.md) — поэтапный переход на
+ Feature-Sliced Design через 10+ features: entities, shared, market pages, broker pilot,
+ portfolios, screener, app-auth, cleanup, final.
+- [x] [Дизайн-система](features/design-system-foundation/spec.md) — `@moex-vibe/design-system`:
+ три уровня токенов, MUI theme, DataTable, базовые компоненты, Storybook.
+- [x] [Миграция брокерских разделов на DS](features/broker-account-sections-ds-migration/spec.md)
+- [x] [Миграция страницы счетов на DS](features/broker-accounts-page-migration/spec.md)
+- [x] [Pilot-миграция](features/pilot-migration/spec.md) — HomePage + SearchBar на DS.
+- [x] [Security screener](features/security-screener/spec.md) — Phase 1: фильтры, таблица, backend.
+- [x] [MVP](features/moex-vibe/spec.md) — поиск, карточки акций/облигаций, графики, дивиденды.
## Кандидаты следующих фич
- [ ] [Миграция таблиц на дизайн-систему](features/table-migration/spec.md) — перевести legacy-таблицы
- frontend на `DataTable` поверх `TanStack Table` без изменения бизнес-логики.
+ на `DataTable` поверх `TanStack Table`.
+- [ ] Аналитика портфеля Phases 2–3 — дивидендный доход, сравнение с target allocation.
+- [ ] Quality gate — завершить оставшиеся AC.
+- [ ] Broker-events — UX доработки и смешанный календарь.