OpenSpec change: evolve-frontend-stack
37 KiB
План перехода 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, затем нужное решение design. Здесь единственный backlog инициативы, отдельного roadmap нет.
Дорожная карта и зависимости
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. Уточнить владельцев и существующие ограничения
-
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 нет. Зависимость: нет.
- Covers:
-
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 остаётся. Зависимость: нет.
- Covers:
2. Подготовить пакеты без изменения представления
-
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 ещё не опубликован.
- Covers:
-
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}, facadeshared/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 его не расширяют.
- Covers:
3. Общие компоненты и продуктовый пилот
-
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.
- Covers:
-
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.
-
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. Собственные общие иконки
-
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 уже интегрирован, откатывать согласованно.
- Covers:
-
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; пакет может оставаться неиспользуемым до отдельного решения, опубликованную версию не удалять.
- Covers:
5. Адресные улучшения после основы
Эти задачи самостоятельны. Их незавершённость не оправдывает расширение пакетного PR или утверждение, что изменено поведение формы в пилоте.
-
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 не меняются.
-
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набор, проверенный относительно generatedBankOperation['kind']. Не добавлен enum, DTO copy или cast неизвестного code; строки UI остаются i18n. - Не входит / сохранить: Generic errors registry, backend enum generation, механическое именование каждого literal, controller refactor.
- Откат: Вернуть маленький vocabulary/import diff; значения wire прежние.
- Covers:
-
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 поведение не менялось.
- Covers:
-
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.
- Covers:
7. Закончить переход и описать поставленное состояние
-
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; они не восстанавливают копии реализаций. Условия удаления снова проверяются перед повтором.
-
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.
-
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 verifyspecs, при доступном CLIopenspec 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 не описывают ещё не реализованный переход.
- Статус 2026-09-22: Semantic сверка завершена для согласованного локального объёма: proposal/design/delta согласованы с private workspaces и packed consumer; внешняя публикация исключена. Код и ручные browser checks проверены ранее. Specs verify, локальные ссылки и whitespace проверены после правок. После установки OpenSpec выполнена команда
Переходный период и отложенные вопросы
Точный перечень отложенного — в 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.