spec: finalize wealth-ledger SDD migration
This commit was merged in pull request #26.
This commit is contained in:
@@ -0,0 +1,239 @@
|
||||
# План перехода frontend
|
||||
|
||||
**На 2026-09-22 выполнены и проверены 1.1–1.2, 2.1–2.2, 3.1–3.3, 4.1–4.2, 5.1–5.4 и 7.1–7.3** по отдельному
|
||||
разрешению пользователя. Остальные задачи — предложения, не разрешение
|
||||
на реализацию или публикацию. Результаты и ограничения приведены ниже.
|
||||
Прочитать [proposal](proposal.md), затем нужное решение [design](design.md).
|
||||
Здесь единственный backlog инициативы, отдельного roadmap нет.
|
||||
|
||||
## Дорожная карта и зависимости
|
||||
|
||||
```text
|
||||
1.1 AppShell owner ────────┐
|
||||
1.2 import enforcement ────┴─ 2.1 tokens/workspaces ─ 2.2 ui theme
|
||||
│
|
||||
3.1 common states
|
||||
│
|
||||
3.2 EntryCard + pilot ─ 3.3 roles
|
||||
2.1 ─ 4.1 icons ─ 4.2 Card/Cards consumers
|
||||
2.2 ─ 5.1 Modal review
|
||||
1.2 ─ 5.2 operation vocabulary ─ 5.4 form boundary
|
||||
1.2 ─ 5.3 income period helper boundary
|
||||
|
||||
3.3 + 4.2 + packed consumer proof ─ 7.1 retire facades
|
||||
Выполненные локальные 1–5 ─ 7.2 текущее as-built описание
|
||||
3.2–3.3 + 5.1–5.4 + 7.1–7.2 ─ 7.3 acceptance всей инициативы
|
||||
```
|
||||
|
||||
1.1 и 1.2 независимы по смыслу, но могут менять общие конфиги: параллельные PR
|
||||
согласуют diff. 5.1–5.4 не блокируют выпуск основы и не входят скрыто в пилот.
|
||||
Иконки не нужны read-only пилоту RecentEvents. Пункты внешней публикации удалены из текущего плана по решению пользователя:
|
||||
пакеты остаются приватными workspaces frontend. Остальные
|
||||
задачи используют предложенные defaults после отдельного запроса реализации.
|
||||
|
||||
### Общие условия каждой будущей сессии
|
||||
|
||||
- Работать в repo владельца, сначала его AGENTS и только triggered conventions;
|
||||
проверить Git status, текущий HEAD и чужие изменения. План привязан к
|
||||
исследованным ревизиям, не к обещанию актуального remote develop.
|
||||
- Перед Node-командой активировать местную `.nvmrc`: `nvm use --silent`.
|
||||
Для code/dependency PR frontend требует `npm ci` и итоговый `npm run verify`;
|
||||
targeted команды ниже дополняют этот gate, не заменяют его.
|
||||
- Scope PR — одна задача. Не смешивать перемещение с новым поведением,
|
||||
обновлением версий библиотек и исправлением соседнего продукта.
|
||||
- Значимый тест начинается с наблюдаемого результата/риска; сохранять имеющиеся
|
||||
regression tests. Не добавлять тест wrapper existence, Mantine internals
|
||||
или snapshots всех вариантов ради переноса.
|
||||
- По завершении повторить routing, проверить diff/новые файлы, Boy Scout review,
|
||||
`git diff --check`, записать реально выполненные команды и ограничения.
|
||||
Непройденная проверка не отмечается как выполненная задача.
|
||||
|
||||
### Реальные команды и будущие проверки
|
||||
|
||||
Сейчас доступны: `npm run deps`, `npm run deps:storybook`, `npm run knip`,
|
||||
`npm run lint`, `npm run typecheck`, `npm run openapi:check`,
|
||||
`npm run test:run -- <существующий path>`, `npm run test:coverage`,
|
||||
`npm run build`, `npm run build:catalog`, `npm run verify`,
|
||||
`npm run release:preview`. Их поведение исследовано, но они **не запускались**
|
||||
в текущей Markdown-сессии. `typecheck` может записать tsbuildinfo;
|
||||
tests/builds пишут cache/coverage/dist/catalog. `openapi:generate` меняет
|
||||
tracked declarations и не нужен этой миграции.
|
||||
|
||||
Package build/declarations/check scopes и packed consumer проверены.
|
||||
Независимый package release не входит в текущий план. Не
|
||||
считать вымышленный `test:packages` или `release:packages` действующей командой.
|
||||
Native `npm pack --dry-run`, `npm pack`, `npm ls` использованы для проверки пакетов. `release:prepare` приложения
|
||||
создаёт commit; не использовать для пробного package release.
|
||||
|
||||
## 1. Уточнить владельцев и существующие ограничения
|
||||
|
||||
- [x] 1.1 [frontend] Перенести route-aware AppShell к владельцу приложения.
|
||||
- **Covers:** `N/A` — техническое исправление F3; product shell не должен стать публичной частью ui, согласно design §1/4.
|
||||
- **Verification:** `npm run deps`, `npm run typecheck`, `npm run knip`, существующие route/navigation tests, итоговый `npm run verify`; browser navigation/focus и active route.
|
||||
- **Читать / область:** `.ai/architecture.md`, UI, `src/app/ui/AppShell.tsx` и CSS (до переноса — shared/ui), его callers в `app/routes`, связанные auth/route tests. Найти все imports до переноса.
|
||||
- **Изменить / готово:** AppShell и принадлежащие ему navigation styles находятся в `app/ui` с допустимым public import. Labels, links, Outlet, transitions, responsive shell прежние; shared/ui не знает product routes. Коротко уточнён legacy пункт architecture.
|
||||
- **Не входит / сохранить:** Новая навигация, новый wrapper shell, миграция всех SVG, auth policy. Никаких изменений URL и bootstrap states.
|
||||
- **Откат:** Вернуть перенос и imports одним PR; данных/внешних artifacts нет. Зависимость: нет.
|
||||
|
||||
- [x] 1.2 [frontend] Закрыть same-layer imports действующим dependency-cruiser.
|
||||
- **Covers:** `N/A` — enforcement уже принятого FSD profile, F4; не новая пользовательская возможность.
|
||||
- **Verification:** Зафиксировать вывод существующего `npm run deps` до правки; после неё тот же gate отклоняет временный контролируемый forbidden import между двумя slices, чистый graph проходит; удалить пробный import, затем `npm run verify`.
|
||||
- **Читать / область:** Architecture/imports, `dependency-cruiser.cjs`, реальные alias/relative imports в pages/features/entities; public API примеры account-operations и bank-card.
|
||||
- **Изменить / готово:** Точные запреты соседних slices pages/features/entities, без запрета imports внутри одного slice и без ошибочного применения к shared segments. Если baseline выявит legacy, правило включается для чистой области с адресным исключением и условием удаления, без broad ignore.
|
||||
- **Не входит / сохранить:** Новый analyzer, автоматический fixer, массовая раскладка FSD, запрет page-local composition. Не писать постоянный анализатор проверки анализатора.
|
||||
- **Откат:** Вернуть только rule change, обязательный semantic review остаётся. Зависимость: нет.
|
||||
|
||||
## 2. Подготовить пакеты без изменения представления
|
||||
|
||||
- [x] 2.1 [frontend] Ввести workspace tokens и охват его контрактов.
|
||||
- **Covers:** `frontend-design-system` — `Общий фундамент доступен через проверяемые локальные пакеты`
|
||||
- **Verification:** Будущая package-конфигурация: `npm pack --dry-run` показывает JSON; чистый временный consumer вне workspace читает JSON обычным parser; `npm ci`, расширенные существующие type/lint/Knip/deps scopes, `npm run verify`; чистые Docker builds development/production с новым workspace manifest и JSON.
|
||||
- **Читать / область:** Engineering/dependencies, package/lock, TS/Knip/deps configs, `Dockerfile`, `.dockerignore`, `packages/tokens/tokens.json`, `shared/theme/theme.ts`, `theme.test.ts`; design §1–3/10. После 1.1–1.2; имена остаются предлагаемыми до принятия design.
|
||||
- **Изменить / готово:** `packages/tokens` владеет тем же JSON v1; root app private; один npm workspace lock, прямые зависимости, ограниченные files/exports. Адаптер читает package JSON. Проверки явно видят packages и запрещают package → app. Docker получает workspace manifests перед npm ci и только нужные package inputs через узкую allowlist, без host node_modules/dist/.env.
|
||||
- **Не входит / сохранить:** Новая schema, Style Dictionary, mobile/dark, преобразование всех токенов и CSS. Не поддерживать две редактируемые копии JSON; app appearance и все units прежние.
|
||||
- **Откат:** Вернуть JSON/imports/manifest/lock как связанный diff; package ещё не опубликован.
|
||||
|
||||
- [x] 2.2 [frontend] Упаковать Mantine adapter и общие стили в ui.
|
||||
- **Covers:** `frontend-design-system` — `Общий фундамент доступен через проверяемые локальные пакеты`
|
||||
- **Verification:** Существующие theme tests на новом owner; будущие Vite library build + declaration emit и packed consumer type/build/render без app alias; на чистом checkout после `npm ci`, без прежнего package dist/cache, `npm run verify` сначала собирает packages, затем проверяет consumer. `npm ls react react-dom @mantine/core`; отдельные чистые Docker development/production builds и render темы.
|
||||
- **Читать / область:** `packages/ui/src/{theme.ts,styles.css,theme.test.ts}`, facade `shared/theme/index.ts`, `app/ui/App.tsx`, `.storybook/{main.ts,preview.tsx,dependency-cruiser.cjs}`, `vite.config.ts`, `vitest.config.ts`, package scripts, `Dockerfile`, `.dockerignore`, design §2–4. Зависимость: 2.1.
|
||||
- **Изменить / готово:** `ui/theme`/`ui/styles.css`, dependency tokens, peers/external React/Mantine, CSS side effects, JS/d.ts/CSS в package. App/preview явно подключают styles и прежние providers. Package build предшествует всем проверкам потребителя в local/CI/Docker; scope tests/coverage следует owner. `shared/theme` только re-export. Host dev допускает package watch; в Docker изменение packages требует документированного rebuild dev image, без нового root orchestration.
|
||||
- **Не входит / сохранить:** Новый global provider, новый Storybook app, component wrappers, Modal animation cleanup. Library build не наследует app PWA/service-worker/proxy plugins. Не менять light scheme, source values, CSS order и effective theme; сравнить фактический bundle size с baseline, не заявляя отсутствующий budget gate F12.
|
||||
- **Откат:** Вернуть adapter/styles/imports и manifest/lock единым PR. Временный facade удаляется в 7.1, новые consumers его не расширяют.
|
||||
|
||||
## 3. Общие компоненты и продуктовый пилот
|
||||
|
||||
- [x] 3.1 [frontend] Перенести StateView и LoadingSkeleton с их stories.
|
||||
- **Covers:** `frontend-design-system` — `Общий фундамент доступен через проверяемые локальные пакеты`
|
||||
- **Verification:** `npm run deps:storybook`, `npm run build:catalog`, существующие проверки StateView/LoadingSkeleton/composeStories в новом scope, будущий packed component render, `npm run verify`.
|
||||
- **Читать / область:** Три UI-conventions темы, два `src/shared/ui` компонента/stories и callers, `src/test/storybook.test.tsx`, package ui. Зависимость: 2.2.
|
||||
- **Изменить / готово:** Реализации и CSF stories у ui, один catalog glob включает package stories. Props без query/i18n/router; busy label/status и error alert/action сохраняются. Проверка Storybook reachability включает новый каталог. Если нужен facade, он только переэкспортирует.
|
||||
- **Не входит / сохранить:** Перемещение page skeleton shapes, новый loading framework, полный набор stories для Mantine. No backend и реальные финансовые данные.
|
||||
- **Откат:** Вернуть перенос; содержимое/поведение исходных components не менялось. Удаление facade — 7.1.
|
||||
|
||||
- [x] 3.2 [frontend] Перенести EntryCard и подтвердить пилот RecentEvents.
|
||||
- **Статус 2026-09-22:** Реализация, 278 tests/full verify, Docker, packed consumer и browser desktop/375px прошли. Пользователь подтвердил успешную ручную проверку coarse pointer/reduced motion по предложенному чек-листу; browser-ограничение закрыто. CSS перенесён побайтово.
|
||||
- **Covers:** `frontend-design-system` — `Общий фундамент доступен через проверяемые локальные пакеты`
|
||||
- **Verification:** `npm run test:run -- src/pages/account/ui/AccountPage.test.tsx`, существующие ledger/CardPage cases использующих EntryCard; минимальный UI-test собственного image fallback при необходимости; `npm run deps:storybook`, `npm run build:catalog`, packed consumer render, `npm run verify`; browser сравнение 375px/desktop.
|
||||
- **Читать / область:** `EntryCard.tsx`/CSS и все callers; `AccountPage.vm.ts::toRecentEvents`, `useBrokerageEvents`, `BrokerageEventsPreview`, `BrokerageEventCard` и их stories, design UI/UX scope. Зависимость: 3.1.
|
||||
- **Изменить / готово:** Один EntryCard в ui с тем же CSS/props; entity пилота импортирует публичный ui package. В Storybook — существующие RecentEvents states и малая generic story длинного контента/image fallback/actions. Пилот реально проходит через API owner до прежнего presentation, без смены data flow. Остальные callers могут пока использовать re-export.
|
||||
- **Не входит / сохранить:** Generic icons, PositionCard rewrite, исправление F8. Сохраняются unknown≠zero, currency/date/account, logo fallback, preview limit/full-list link; у других callers — sign и disabled placeholder/archive guards.
|
||||
- **Откат:** Вернуть consumer import и extraction PR. Не вводить вторую реализацию EntryCard для пилота. Facade removal — 7.1.
|
||||
|
||||
- [x] 3.3 [frontend] Подключить существующие semantic roles внутри EntryCard.
|
||||
- **Статус 2026-09-22:** Реализованы border/subtle/surface. Positive/negative уже были semantic (shade 9); neutral gray-7 оставлен без неточного сопоставления. npm ci/full verify (278 tests) и browser computed colors/narrow/focus прошли. Пользователь подтвердил ручную проверку coarse pointer/reduced motion по чек-листу; пункт закрыт.
|
||||
- **Covers:** `N/A` — F1: применение уже существующей темы после структурного переноса, без нового UI behavior.
|
||||
- **Verification:** Сравнить computed colors и выбранные EntryCard/RecentEvents states до/после; gray-3→border, gray-0→subtle эквивалентны; текущие positive/negative (shade 9) сохранены; background tint/white→surface проверен; `npm run verify` и browser narrow/focus/coarse-pointer/reduced-motion.
|
||||
- **Читать / область:** ui EntryCard/CSS, tokens color.roles, ui/theme resolver, generic и product stories. Зависимость: 3.2.
|
||||
- **Изменить / готово:** Прямые эквиваленты заменены semantic CSS variables; текущий вид и actions не меняются. Если эквивалентность конкретной пары не доказана, оставить её локальной и пояснить, не создавать токен автоматически.
|
||||
- **Не входит / сохранить:** Новые palettes, card brand gradients, компонентный токен на каждое свойство, массовый CSS sweep.
|
||||
- **Откат:** Вернуть только CSS/inline-role diff; package ownership остаётся.
|
||||
|
||||
## 4. Собственные общие иконки
|
||||
|
||||
- [x] 4.1 [frontend] Подготовить минимальный icons package.
|
||||
- **Covers:** `frontend-design-system` — `Собственные общие иконки имеют доступный контракт`; `frontend-design-system` — `Общий фундамент доступен через проверяемые локальные пакеты`
|
||||
- **Verification:** Будущие package build/declarations/pack consumer checks; synthetic decorative и meaningful icon examples с именем/размером/currentColor; `npm ls react`, `npm run deps:storybook`, `npm run verify`.
|
||||
- **Читать / область:** Card/Cards inline plus/pencil/trash, `BankOperationIcon` как пример accessibility, `bind-icon-animation` только для границ ответственности, design §5. Зависимость: 2.1; после 2.2 можно переиспользовать package build pattern без общего самописного генератора.
|
||||
- **Изменить / готово:** Именованные Add/Edit/Delete SVG-компоненты, один TSX source на рисунок, React peer/external, public types, ограниченные exports. Static package не тянет motion/UI/domain; декоративность по умолчанию и доступное meaningful использование документированы.
|
||||
- **Не входит / сохранить:** SVG registry по строке, raw SVG+TSX дубли, SVGR/dependency, перенос категорий/навигационных анимаций. Сохранить geometry/stroke/size существующих рисунков, без редизайна.
|
||||
- **Откат:** Удалить ещё не используемый package diff; до публикации внешнего контракта нет. Если 4.2 уже интегрирован, откатывать согласованно.
|
||||
|
||||
- [x] 4.2 [frontend] Перевести только повторяющиеся Card/Cards actions на icons.
|
||||
- **Covers:** `frontend-design-system` — `Собственные общие иконки имеют доступный контракт`
|
||||
- **Verification:** `npm run test:run -- src/pages/card/ui/CardPage.test.tsx`, `npm run test:run -- src/pages/cards/ui/CardsPage.test.tsx`, `npm run verify`; browser accessible names/keyboard и appearance выбранных Add/Edit/Delete actions.
|
||||
- **Читать / область:** `pages/card/ui/CardPage.view.tsx`, `pages/cards/ui/CardsPage.view.tsx`, ActionIcon consumers и imports. Зависимость: 4.1.
|
||||
- **Изменить / готово:** Повторяющиеся SVG заменены named imports; размеры/strokeWidth задаются явно, если раньше различались. Имя и disabled остаются на action; внутри SVG нет дополнительного focus. В изменённом scope больше нет старых копий этих рисунков.
|
||||
- **Не входит / сохранить:** BankOperationIcon mappings, формы/mutations, поведение edit/delete и confirm dialogs, иной визуальный стиль.
|
||||
- **Откат:** Вернуть caller diff; пакет может оставаться неиспользуемым до отдельного решения, опубликованную версию не удалять.
|
||||
|
||||
## 5. Адресные улучшения после основы
|
||||
|
||||
Эти задачи самостоятельны. Их незавершённость не оправдывает расширение
|
||||
пакетного PR или утверждение, что изменено поведение формы в пилоте.
|
||||
|
||||
- [x] 5.1 [frontend] Проверить и при необходимости свести Modal animation к одному владельцу.
|
||||
- **Статус 2026-09-22:** BankCardForm browser A/B показал различный lifecycle: CSS даёт mount entrance, Mantine — exit/callback. Production-код сохранён; причины документированы в UI convention. Пользователь подтвердил ручную проверку reduced motion, Escape/Отмена и возврата фокуса; пункт закрыт.
|
||||
- **Covers:** `N/A` — F5, устранение подтверждённого дублирования механизмов без нового продукта.
|
||||
- **Verification:** Browser comparison открытия/закрытия существующей банковской Modal: overlay, motion, focus return, reduced motion; relevant Modal/form tests и `npm run verify` только при code diff.
|
||||
- **Читать / область:** ui theme Modal defaults, ui global styles, BankCardForm/OperationForm consumers. Зависимость: 2.2.
|
||||
- **Изменить / готово:** Выбран один механизм либо документирован конкретный различный смысл обоих. При эквивалентности предпочтён Mantine transition и убран только лишний CSS. Наблюдение «видимых проблем нет» само по себе не требует нового кода.
|
||||
- **Не входит / сохранить:** Новые timings, анимационная система, замена motion маршрутов. Keyboard/focus/closing rules неизменны.
|
||||
- **Откат:** Вернуть animation-only diff; component API/data не меняются.
|
||||
|
||||
- [x] 5.2 [frontend] Свести runtime vocabulary банковских operation kinds у entity.
|
||||
- **Covers:** `N/A` — часть F6, одна типизированная коллекция для существующих schema/choices без изменения wire contract.
|
||||
- **Verification:** `npm run typecheck`, `npm run test:run -- src/pages/card/ui/OperationForm.test.tsx`, `npm run deps`, `npm run verify`; все четыре прежних вида и defaults сохранены.
|
||||
- **Читать / область:** `entities/bank-card/api/queries.ts` и index, `OperationForm.tsx`/`.view.tsx`/`.types.ts`, TypeScript/data conventions. Зависимость: 1.2.
|
||||
- **Изменить / готово:** Schema и choices используют один `as const` набор, проверенный относительно generated `BankOperation['kind']`. Не добавлен enum, DTO copy или cast неизвестного code; строки UI остаются i18n.
|
||||
- **Не входит / сохранить:** Generic errors registry, backend enum generation, механическое именование каждого literal, controller refactor.
|
||||
- **Откат:** Вернуть маленький vocabulary/import diff; значения wire прежние.
|
||||
|
||||
- [x] 5.3 [frontend] Отделить pure period helpers от AccountIncomePage VM.
|
||||
- **Covers:** `N/A` — F7, устранение транзитивной зависимости presentation story от VM по design §6/10.
|
||||
- **Verification:** Existing account-income targeted tests, `npm run deps:storybook`, `npm run build:catalog`, `npm run verify`; synthetic form submit/reset/error states без API/query providers.
|
||||
- **Читать / область:** `AccountIncomePage.vm.ts`, `components/IncomePeriodForm.view.tsx`, их imports/tests, соседний page model и Storybook convention. Зависимость: 1.2.
|
||||
- **Изменить / готово:** Только реально используемые pure date helpers у page model и оба callers используют их; полезная isolated presentation story проходит reachability. Нового global date helper/service нет.
|
||||
- **Не входит / сохранить:** Общий DateRangePicker, изменение диапазонов/часового пояса и перенос логики в UI package. Moscow dates, validation и submit/reset прежние.
|
||||
- **Откат:** Вернуть helper move/story diff; URL/API поведение не менялось.
|
||||
|
||||
- [x] 5.4 [frontend] Отделить controller банковской OperationForm от presentation.
|
||||
- **Covers:** `N/A` — часть F6, применение существующей container/VM/view границы без изменения денежных сценариев.
|
||||
- **Verification:** До и после `npm run test:run -- src/pages/card/ui/OperationForm.test.tsx`; особенно conflict/draft/explicit version adoption, retained UUID, full refund и max money; `npm run deps:storybook`, затем `npm run verify`.
|
||||
- **Читать / область:** Полные OperationForm/OperationForm.view/types/tests, entity form-validation/mutations и UI/data/testing conventions. Зависимость: 5.2.
|
||||
- **Изменить / готово:** Query/mutation/recovery orchestration принадлежит page VM/controller; существующий fields view расширен только нужными presentation props/callbacks/slots. Runtime helpers сейчас приходят из banking barrel, который переэкспортирует API/hooks: эту транзитивную связь убрать через props/callbacks, type-only DTO imports допустимы. Не вводить deep-import exception и не ослаблять story gate. RHF context в fields остаётся; `CardPage` целиком не переписывается.
|
||||
- **Не входит / сохранить:** Generic form engine, extraction в feature/package без второго consumer, новые requests/optimistic updates. Не менять amount string/BigInt, intent lifecycle, version adoption, source constraints, pending close guards и вложенное создание категории.
|
||||
- **Откат:** Вернуть этот behavior-preserving PR. Любое необходимое изменение поведения остановить и согласовать отдельно, не прятать в refactor.
|
||||
|
||||
## 7. Закончить переход и описать поставленное состояние
|
||||
|
||||
- [x] 7.1 [frontend] Удалить только исчерпанные compatibility facades.
|
||||
- **Уточнение scope:** Пользователь разрешил удалить локальные facades с проверкой packed consumer вместо registry consumer. Nexus и независимый release остаются отложенными.
|
||||
- **Covers:** `N/A` — прекращение временного двойного import path после подтверждённого потребления, design Migration Plan.
|
||||
- **Verification:** `rg` по runtime/test/story imports старых theme/UI paths даёт ноль; `npm run knip`, `npm run deps`, `npm run deps:storybook`, app/catalog/packed consumer checks и `npm run verify`.
|
||||
- **Читать / область:** Facades `shared/theme` и EntryCard/StateView/LoadingSkeleton, все оставшиеся callers, component source catalog, frontend README и conventions. Зависимости: 3.3, 4.2 и подтверждённый packed consumer без workspace/source aliases.
|
||||
- **Изменить / готово:** Оставшиеся consumers используют package API, ненужные re-exports удалены, нет дубля JSON/CSS/implementation. В existing conventions закреплены каталог и import rules, AGENTS только маршрутизирует темы.
|
||||
- **Не входит / сохранить:** Массовая чистка unrelated shared/lib, запрет прямого Mantine, перенос domain UI. Старые подходы вне migrated scope не блокируются новым широким правилом.
|
||||
- **Откат:** Вернуть thin facades/imports; они не восстанавливают копии реализаций. Условия удаления снова проверяются перед повтором.
|
||||
|
||||
- [x] 7.2 [docs] Обновить только подтверждённое as-built описание.
|
||||
- **Уточнение scope 2026-09-22:** По запросу следующего пункта без browser verification описано текущее локальное состояние после 5.4. Завершение 7.1 не требуется для этого описания: переходное состояние и отсутствие registry-поставки указаны явно; после 7.1 описание facades актуализировано. После будущей поставки документация обновляется вместе с ней.
|
||||
- **Covers:** `N/A` — описание фактически принятой реализации и поставки; не новый behavior contract.
|
||||
- **Verification:** Docs `npm run verify` по местному CONTRIBUTING, проверка локальных ссылок/диаграмм и semantic review по поставленному frontend; `git diff --check`.
|
||||
- **Читать / область:** Docs AGENTS/README/CONTRIBUTING, `design/overview.md`, `architecture/containers.md`, при необходимости release boundary в `architecture/deployment.md`; frontend принятый package contract. Основание текущего описания: выполненные 1–5; удаление facades по 7.1 отражено в документации.
|
||||
- **Изменить / готово:** Тематические страницы говорят о реально используемой теме/пакетах/границах frontend и каталога. Указывается, что raw SVG/mobile/dark/API package не поставлены. При неполной 5.x не обещать завершение этих пунктов.
|
||||
- **Не входит / сохранить:** Анализ/план в permanent docs, новый roadmap, переописание backend, ADR на каждый маленький выбор. Один устойчивый ADR возможен лишь если принято значимое repository/release решение и нужен его rationale.
|
||||
- **Откат:** Вернуть описание вместе с отменённой поставкой; не менять исторические archives.
|
||||
|
||||
- [x] 7.3 [specs] Сверить реализацию с delta и закрыть плановые расхождения.
|
||||
- **Статус 2026-09-22:** Semantic сверка завершена для согласованного локального объёма: proposal/design/delta согласованы с private workspaces и packed consumer; внешняя публикация исключена. Код и ручные browser checks проверены ранее. Specs verify, локальные ссылки и whitespace проверены после правок. После установки OpenSpec выполнена команда `openspec validate evolve-frontend-stack --type change --strict --store wealth-ledger-specs`: change valid. Пункт завершён.
|
||||
- **Covers:** `frontend-design-system` — `Общий фундамент доступен через проверяемые локальные пакеты`; `frontend-design-system` — `Собственные общие иконки имеют доступный контракт`
|
||||
- **Verification:** Semantic проверка всех delta scenarios, `npm run verify` specs, при доступном CLI `openspec validate evolve-frontend-stack --type change --strict --store wealth-ledger-specs`; локальные ссылки и `git diff --check`.
|
||||
- **Читать / область:** Specs AGENTS/README, proposal/delta/design/tasks и фактические результаты consumer/rollback/accessibility checks. Зависимости полного acceptance: 3.2–3.3, 5.1–5.4 и 7.1–7.2; требования delta должны соответствовать согласованному локальному объёму.
|
||||
- **Изменить / готово:** Tasks отражают только фактически проверенные результаты; согласованные изменения scope возвращены в planning artifacts, не скрыты. Main specs обновляются только в отдельно разрешённом штатном завершении после реального внедрения; untouched deferred findings остаются явно отложенными.
|
||||
- **Не входит / сохранить:** Автоматический archive/approval, Evidence/state/hash registry, декларация успеха на основании одного build. Промежуточная сверка не означает завершения change.
|
||||
- **Откат:** Исправить несоответствующее предложение/отметку; main specs не описывают ещё не реализованный переход.
|
||||
|
||||
## Переходный период и отложенные вопросы
|
||||
|
||||
Точный перечень отложенного — в design: F8 recovery RecentEvents, F9 backend
|
||||
errors contract, F12 расхождение bundle-budget spec/gate, общий investment recovery classifier и новые потребители.
|
||||
Они не входят скрыто в tasks выше. Если требуется менять HTTP/observable
|
||||
recovery, нужен отдельный согласованный scope и соответствующий spec contract.
|
||||
|
||||
Facades допустимы только от 2.2/3.x до 7.1; новых возможностей они не получают.
|
||||
Новые components/imports следуют целевому каталогу. Старые inline рисунки
|
||||
допустимы лишь до миграции своего caller batch, а новые дубли уже вынесенных
|
||||
рисунков не создаются. Совместимость снимается по нулю imports и успешному
|
||||
consumer proof, а не по истечении произвольного срока.
|
||||
|
||||
Проверены задачи **1.1–1.2, 2.1–2.2, 3.1–3.3, 4.1–4.2, 5.1–5.4 и 7.1–7.3**.
|
||||
Недостающие browser checks 3.2/3.3/5.1 выполнены вручную пользователем:
|
||||
он подтвердил корректность всех пунктов переданного чек-листа.
|
||||
Независимые версии и Nexus отложены до оценки пользы после пилота;
|
||||
checkbox не разрешает дальнейшую реализацию или публикацию.
|
||||
|
||||
Последний полный frontend `npm run verify`: 49 test files / 282 tests,
|
||||
проверки зависимостей, типов, lint, Knip, OpenAPI и сборки app/catalog прошли.
|
||||
Свежий UI tarball проверен вне workspace: install, typecheck, build и browser render.
|
||||
Docs `npm run verify`: 45 Markdown-файлов, 0 issues.
|
||||
Reference in New Issue
Block a user