docs: record backend refactor and close P1-12

This commit is contained in:
2026-09-13 13:54:24 +03:00
parent 66721eee62
commit b940d39946
9 changed files with 40 additions and 16 deletions
+24 -3
View File
@@ -76,11 +76,11 @@ remediation change создаётся после выбора владельце
| FE26-09 | Убрать механическое обязательное дробление каждого component. | [FE-G] F-07 | already-covered | done | 06.09.2026; [FE26-E]. [UI pattern](../../frontend/.ai/conventions/frontend-ui.md) сохраняет semantic ownership и допускает tightly-coupled renderers; это guidance, а не line-count gate. Конкретное разделение крупных modules учтено отдельно FE26-13. | | FE26-09 | Убрать механическое обязательное дробление каждого component. | [FE-G] F-07 | already-covered | done | 06.09.2026; [FE26-E]. [UI pattern](../../frontend/.ai/conventions/frontend-ui.md) сохраняет semantic ownership и допускает tightly-coupled renderers; это guidance, а не line-count gate. Конкретное разделение крупных modules учтено отдельно FE26-13. |
| FE26-10 | Объединить protected query policy и endpoint query identity ownership. | [FE-G] F-08; [FE-S] F-05 | already-covered | done | 06.09.2026; [FE26-E]. [App defaults](../../frontend/src/app/ui/App.tsx), [T-Bank VM](../../frontend/src/features/tbank-connection/ui/TbankConnectionSection.vm.ts) и entity-owned options operations/portfolio; status использует общий authenticated query seam. | | FE26-10 | Объединить protected query policy и endpoint query identity ownership. | [FE-G] F-08; [FE-S] F-05 | already-covered | done | 06.09.2026; [FE26-E]. [App defaults](../../frontend/src/app/ui/App.tsx), [T-Bank VM](../../frontend/src/features/tbank-connection/ui/TbankConnectionSection.vm.ts) и entity-owned options operations/portfolio; status использует общий authenticated query seam. |
| FE26-11 | Централизовать test cleanup и auth reset. | [FE-S] F-02 | already-covered | done | 06.09.2026; [FE26-E]. [Test setup](../../frontend/src/test/setup.ts): RTL cleanup, auth reset, MSW handler reset в общем afterEach. | | FE26-11 | Централизовать test cleanup и auth reset. | [FE-S] F-02 | already-covered | done | 06.09.2026; [FE26-E]. [Test setup](../../frontend/src/test/setup.ts): RTL cleanup, auth reset, MSW handler reset в общем afterEach. |
| FE26-12 | Убрать повтор server identity из Income view/model. | [FE-S] F-03 | confirmed | done | 06.09.2026; [FE26-E]. [Backend income service](../../backend/src/tbank/income-analytics.service.ts) передаёт instrumentKey; [Income VM](../../frontend/src/pages/account-income/ui/AccountIncomePage.vm.ts) проверяет и группирует готовую связь, не вычисляя identity. | | FE26-12 | Убрать повтор server identity из Income view/model. | [FE-S] F-03 | confirmed | done | 06.09.2026; [FE26-E]. [Backend income service](../../backend/src/modules/investments/income/income-analytics.service.ts) передаёт instrumentKey; [Income VM](../../frontend/src/pages/account-income/ui/AccountIncomePage.vm.ts) проверяет и группирует готовую связь, не вычисляя identity. |
| FE26-13 | Выделить самостоятельные ответственности семи крупных TSX modules. | [FE-S] F-04 | already-covered | done | 06.09.2026; [FE26-E]. Income/Events/Accounts/Account state views, [route fallback](../../frontend/src/app/routes/RouteFallback.tsx), [guards](../../frontend/src/app/routes/RouteGuards.tsx), breadcrumbs и T-Bank loaded section выделены во frontend `c97f62b`. | | FE26-13 | Выделить самостоятельные ответственности семи крупных TSX modules. | [FE-S] F-04 | already-covered | done | 06.09.2026; [FE26-E]. Income/Events/Accounts/Account state views, [route fallback](../../frontend/src/app/routes/RouteFallback.tsx), [guards](../../frontend/src/app/routes/RouteGuards.tsx), breadcrumbs и T-Bank loaded section выделены во frontend `c97f62b`. |
| FE26-14 | Устранить повтор test client policy и нестабильный cache lifetime. | [FE-S] F-06 | confirmed | done | 06.09.2026; [FE26-E]. [Test query factory](../../frontend/src/test/query.tsx) используется оставшимися auth/T-Bank harnesses; [auth test](../../frontend/src/features/auth/model/auth.test.tsx) проверяет сохранение client и seeded cache при rerender. | | FE26-14 | Устранить повтор test client policy и нестабильный cache lifetime. | [FE-S] F-06 | confirmed | done | 06.09.2026; [FE26-E]. [Test query factory](../../frontend/src/test/query.tsx) используется оставшимися auth/T-Bank harnesses; [auth test](../../frontend/src/features/auth/model/auth.test.tsx) проверяет сохранение client и seeded cache при rerender. |
| FE26-15 | Перенести компонентные стили из global CSS к владельцам. | [FE-S] F-08 | already-covered | done | 06.09.2026; [FE26-E]. [Global styles](../../frontend/src/shared/theme/styles.css) содержат базовые правила; AppShell, breadcrumbs и auth используют CSS Modules, StateView — Mantine props. | | FE26-15 | Перенести компонентные стили из global CSS к владельцам. | [FE-S] F-08 | already-covered | done | 06.09.2026; [FE26-E]. [Global styles](../../frontend/src/shared/theme/styles.css) содержат базовые правила; AppShell, breadcrumbs и auth используют CSS Modules, StateView — Mantine props. |
| FE26-16 | Исправить source connectedAt contract вместо String coercion. | [FE-S] F-09 | already-covered | done | 06.09.2026; [FE26-E]. [Backend DTO](../../backend/src/tbank/tbank-connection.dto.ts) задаёт nullable date-time string; [frontend consumer](../../frontend/src/features/tbank-connection/ui/TbankConnectionSectionLoaded.tsx) не скрывает неверный transport type через String. | | FE26-16 | Исправить source connectedAt contract вместо String coercion. | [FE-S] F-09 | already-covered | done | 06.09.2026; [FE26-E]. [Backend DTO](../../backend/src/modules/investments/tbank-connection/tbank-connection.dto.ts) задаёт nullable date-time string; [frontend consumer](../../frontend/src/features/tbank-connection/ui/TbankConnectionSectionLoaded.tsx) не скрывает неверный transport type через String. |
| FE26-17 | Перенести auth validation и payment invariants из JSX к model owners. | [FE-S] F-10 | already-covered | done | 06.09.2026; [FE26-E]. [Auth validation](../../frontend/src/features/auth/model/validation.ts), [ledger display](../../frontend/src/entities/broker-operation/model/display.ts) владеют соответствующими правилами. | | FE26-17 | Перенести auth validation и payment invariants из JSX к model owners. | [FE-S] F-10 | already-covered | done | 06.09.2026; [FE26-E]. [Auth validation](../../frontend/src/features/auth/model/validation.ts), [ledger display](../../frontend/src/entities/broker-operation/model/display.ts) владеют соответствующими правилами. |
| FE26-18 | Удалить redundant position modes и test-only proxy exports. | [FE-S] F-11 | already-covered | done | 06.09.2026; [FE26-E]. [PositionCard](../../frontend/src/pages/account/ui/components/PositionCard.view.tsx) выводит mode из kind; [StateView](../../frontend/src/shared/ui/StateView.tsx) не экспортирует Mantine Button; page barrels сохраняют product surface. | | FE26-18 | Удалить redundant position modes и test-only proxy exports. | [FE-S] F-11 | already-covered | done | 06.09.2026; [FE26-E]. [PositionCard](../../frontend/src/pages/account/ui/components/PositionCard.view.tsx) выводит mode из kind; [StateView](../../frontend/src/shared/ui/StateView.tsx) не экспортирует Mantine Button; page barrels сохраняют product surface. |
@@ -253,6 +253,27 @@ authority.
Terminal evidence добавляется сюда только после завершения соответствующего change. Terminal evidence добавляется сюда только после завершения соответствующего change.
### 2026-09-13 — P1-12: backend responsibilities
Статус: `done`. Backend commit `8ba0053`.
BankCards разделён на services карт, операций и категорий, сценарий сводки и
конкретный repository. Общая transaction/retry boundary, ownership, idempotency,
optimistic concurrency и ограничения возвратов сохранены. Stock/bond services
разделены по каталогу, рынку и доходам; связные operations и T-Bank client
сохранены. Business modules отделены от integrations; сложные modules используют
слои ответственности, компактные остаются плоскими.
- `npm run verify` — passed: lint, app/test typecheck, 35 suites / 257 tests, build.
- Восемь существующих HTTP/e2e suites выполнены временным runner
`/tmp/wl-modular-http.cjs`: отдельная SQLite DB на suite, migrations с
`RUST_LOG=info`, configured HTTP, 118 tests passed. OpenAPI совпадает с frontend
snapshot. Общий e2e blocker и статус задачи 03 этим не закрываются.
- Финальный перенос 47 файлов проверен сравнением 142 исходников/tests:
различий кроме относительных путей и форматирования нет.
- Formatter, docs `npm run verify`, lint backend conventions и `git diff --check`
прошли. Новые dependencies и architecture tests не добавлены.
### 2026-09-13 — P1-11: реальная SQLite ### 2026-09-13 — P1-11: реальная SQLite
P1-11 поставлена в backend commit `7fde3ec`. Дополнено доказательство P1-11 поставлена в backend commit `7fde3ec`. Дополнено доказательство
@@ -294,7 +315,7 @@ WL-P2-03; статус общего e2e WL-P2-05 не меняется. Кома
принадлежит Nest/class-transformer, ответные DTO описывают возвращаемые объекты. принадлежит Nest/class-transformer, ответные DTO описывают возвращаемые объекты.
`declare` не генерирует поля со значением `undefined` и не подменяет проверку `declare` не генерирует поля со значением `undefined` и не подменяет проверку
входных данных. Optional/nullable-типы, декораторы и валидация сохранены. входных данных. Optional/nullable-типы, декораторы и валидация сохранены.
В [TbankClient](../../backend/src/tbank/tbank.client.ts) В [TbankClient](../../backend/src/integrations/tbank/tbank.client.ts)
`getOpenAccounts` и `getDividends` задают тип результата на `call<Response>`, `getOpenAccounts` и `getDividends` задают тип результата на `call<Response>`,
как соседние RPC; тип параметра `.then` выводится из этого результата. как соседние RPC; тип параметра `.then` выводится из этого результата.
+4 -2
View File
@@ -136,7 +136,9 @@ HTML-источник, общий кэш и поведение при измен
и [журнала](../../../specs/openspec/specs/brokerage-account-ledger/spec.md) и [журнала](../../../specs/openspec/specs/brokerage-account-ledger/spec.md)
описывают исходные финансовые понятия. Отдельная основная спецификация описывают исходные финансовые понятия. Отдельная основная спецификация
страницы облигации в текущем OpenSpec Store не найдена; условия вычислений страницы облигации в текущем OpenSpec Store не найдена; условия вычислений
подтверждены [сервисом облигаций](../../../backend/src/tbank/bond.service.ts) подтверждены [каталогом](../../../backend/src/modules/investments/instruments/bonds/application/bond-catalog.service.ts),
и его [проверками](../../../backend/src/tbank/bond.service.spec.ts). [рыночными данными](../../../backend/src/modules/investments/instruments/bonds/application/bond-market.service.ts),
[выплатами](../../../backend/src/modules/investments/instruments/bonds/application/bond-income.service.ts)
и [проверками](../../../backend/src/modules/investments/instruments/bonds/application/bond.spec.ts).
Границы источников описаны в [разделе интеграций](../../integrations/README.md), Границы источников описаны в [разделе интеграций](../../integrations/README.md),
сходное разделение рыночных и личных данных — в [акциях](stocks.md). сходное разделение рыночных и личных данных — в [акциях](stocks.md).
+3 -2
View File
@@ -173,6 +173,7 @@ TTM означает последние 12 месяцев, MRQ — послед
и [журнала](../../../specs/openspec/specs/brokerage-account-ledger/spec.md) и [журнала](../../../specs/openspec/specs/brokerage-account-ledger/spec.md)
задают исходные финансовые понятия. Отдельная основная спецификация страницы задают исходные финансовые понятия. Отдельная основная спецификация страницы
акции в текущем OpenSpec Store не найдена; описанные механизмы проверяются акции в текущем OpenSpec Store не найдена; описанные механизмы проверяются
по [сервису акций](../../../backend/src/tbank/stock.service.ts) и его по [каталогу](../../../backend/src/modules/investments/instruments/stocks/application/stock-catalog.service.ts),
[проверкам](../../../backend/src/tbank/stock.service.spec.ts). [рыночным данным](../../../backend/src/modules/investments/instruments/stocks/application/stock-market.service.ts),
[выплатам](../../../backend/src/modules/investments/instruments/stocks/application/stock-income.service.ts) и [проверкам](../../../backend/src/modules/investments/instruments/stocks/application/stock.spec.ts).
Сопоставление с облигациями — на [странице облигаций](bonds.md). Сопоставление с облигациями — на [странице облигаций](bonds.md).
+1 -1
View File
@@ -114,6 +114,6 @@ Backend публикует статические маршруты под `/api/
[дохода](../../../specs/openspec/specs/brokerage-account-income-analytics/spec.md) [дохода](../../../specs/openspec/specs/brokerage-account-income-analytics/spec.md)
и [событий](../../../specs/openspec/specs/brokerage-account-upcoming-events/spec.md) и [событий](../../../specs/openspec/specs/brokerage-account-upcoming-events/spec.md)
описывают отдельный счёт. Общий режим подтверждён действующими маршрутизаторами, описывают отдельный счёт. Общий режим подтверждён действующими маршрутизаторами,
сервисами и [проверками агрегации](../../../backend/src/tbank/all-accounts.spec.ts), сервисами и [проверками агрегации](../../../backend/src/modules/investments/all-accounts.spec.ts),
но не выделен в самостоятельную основную спецификацию. Не следует считать но не выделен в самостоятельную основную спецификацию. Не следует считать
описание общего режима изменением требований к отдельному счёту. описание общего режима изменением требований к отдельному счёту.
+2 -2
View File
@@ -79,8 +79,8 @@ sequenceDiagram
| Метаданные инструмента | Успешный поиск или подтверждённое отсутствие | Свежими считаются 24 часа; общий кэш на 500 ключей UID/FIGI, ошибки не сохраняются | | Метаданные инструмента | Успешный поиск или подтверждённое отсутствие | Свежими считаются 24 часа; общий кэш на 500 ключей UID/FIGI, ошибки не сохраняются |
Это параметры текущей реализации, а не самостоятельная политика этого Это параметры текущей реализации, а не самостоятельная политика этого
документа: [снимки](../../../../backend/src/tbank/portfolio.service.ts), документа: [снимки](../../../../backend/src/modules/investments/portfolio/application/portfolio.service.ts),
[метаданные](../../../../backend/src/tbank/instrument-metadata.service.ts) и [метаданные](../../../../backend/src/integrations/tbank/instrument-metadata.service.ts) и
[клиентский запрос](../../../../frontend/src/entities/portfolio/api/usePortfolio.ts). [клиентский запрос](../../../../frontend/src/entities/portfolio/api/usePortfolio.ts).
Пять минут — предельный возраст успешного снимка, а не дополнительные Пять минут — предельный возраст успешного снимка, а не дополнительные
@@ -43,9 +43,9 @@
и реализации. и реализации.
Для адресной проверки исходников владельцами служат Для адресной проверки исходников владельцами служат
[сервис снимков](../../../../backend/src/tbank/portfolio.service.ts), [сервис снимков](../../../../backend/src/modules/investments/portfolio/application/portfolio.service.ts),
[валютные итоги](../../../../backend/src/tbank/portfolio-totals.ts), [валютные итоги](../../../../backend/src/modules/investments/portfolio/infrastructure/tbank-portfolio.mapper.ts),
[структура](../../../../backend/src/tbank/portfolio-structure.ts) и [структура](../../../../backend/src/modules/investments/portfolio/domain/portfolio-structure.ts) и
[подготовка экрана](../../../../frontend/src/pages/account/ui/AccountPage.vm.ts). [подготовка экрана](../../../../frontend/src/pages/account/ui/AccountPage.vm.ts).
Это точки продолжения расследования; смысл вычислений изложен выше. Это точки продолжения расследования; смысл вычислений изложен выше.
+1 -1
View File
@@ -50,4 +50,4 @@ HTTP-запрос ограничен таймаутом. Сеть, неуспе
Условия обработки источника в прогнозе закреплены в Условия обработки источника в прогнозе закреплены в
[спецификации будущих событий](../../specs/openspec/specs/brokerage-account-upcoming-events/spec.md#requirement-upcoming-events-use-complete-source-results). [спецификации будущих событий](../../specs/openspec/specs/brokerage-account-upcoming-events/spec.md#requirement-upcoming-events-use-complete-source-results).
Точный механизм транспорта, разбора и сопоставления реализован в Точный механизм транспорта, разбора и сопоставления реализован в
[клиенте MOEX](../../backend/src/tbank/moex.client.ts). [клиенте MOEX](../../backend/src/integrations/moex/moex.client.ts).
+1 -1
View File
@@ -36,7 +36,7 @@ ISIN, даты и ссылки на выпуск. Изменение табли
После ошибки новая загрузка ограничена минутным интервалом; внутри одного После ошибки новая загрузка ограничена минутным интервалом; внутри одного
HTTP-запроса повторных попыток нет. Обновление запускается следующим обращением HTTP-запроса повторных попыток нет. Обновление запускается следующим обращением
после истечения кэша, без фонового задания. Точный механизм и сроки принадлежат после истечения кэша, без фонового задания. Точный механизм и сроки принадлежат
[клиенту НКР](../../backend/src/tbank/ncr-ratings.client.ts). [клиенту НКР](../../backend/src/integrations/ncr/ncr-ratings.client.ts).
При отказе реестра показатели облигации отмечают недоступность рейтинга, При отказе реестра показатели облигации отмечают недоступность рейтинга,
сохраняя остальные доступные показатели. Готовый ответ метрик имеет сохраняя остальные доступные показатели. Готовый ответ метрик имеет
+1 -1
View File
@@ -139,7 +139,7 @@ Backend хранит token в шифротексте AES-256-GCM с новым n
отсутствие инструмента, а не временный сбой. Остальные RPC при полной отсутствие инструмента, а не временный сбой. Остальные RPC при полной
очереди завершаются сразу. очереди завершаются сразу.
Параметры попыток принадлежат Параметры попыток принадлежат
[T-Bank client](../../backend/src/tbank/tbank.client.ts) (workspace-ссылка); [T-Bank client](../../backend/src/integrations/tbank/tbank.client.ts) (workspace-ссылка);
решение об ограниченных повторах — [ADR 005](../adr/005-tbank-upstream-resilience.md). решение об ограниченных повторах — [ADR 005](../adr/005-tbank-upstream-resilience.md).
Большое число ранее неизвестных инструментов требует отдельных запросов Большое число ранее неизвестных инструментов требует отдельных запросов