Files
specs/openspec/changes/archive/2026-08-12-baseline/design.md
T
2026-08-12 23:09:16 +03:00

69 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Context
См. мотивацию в `proposal.md`. Рабочая область уже содержит независимые Git-репозитории frontend, backend и specs; docs и корневые рабочие файлы еще не подготовлены. Frontend и backend являются начальными шаблонами без общего контракта, доменной структуры или локальных инструкций. Frontend-template и `fin-tracker` доступны только как read-only референсы.
## Goals / Non-Goals
**Goals:**
- Подготовить воспроизводимый фундамент четырех независимых репозиториев.
- Установить OpenAPI как единственный контракт между NestJS API и React-клиентом.
- Перенести только нужную инфраструктуру frontend-template и тему `fin-tracker`, не перенося шаблонный домен.
- Сделать локальную конфигурацию и ошибки безопасными по умолчанию.
- Оставить ясные места расширения для последующих OpenSpec changes без реализации их поведения.
**Non-Goals:**
- Реализовывать регистрацию, сессии, T-Bank gRPC-клиент, хранение токенов, счета или портфель.
- Добавлять Docker, CI/CD, deployment, Redis, серверные snapshots, dark mode или доменные mock-сценарии.
- Создавать отдельный UI-пакет или копировать все компоненты `fin-tracker`.
## Decisions
### Четыре изолированных Git-репозитория и локальная рабочая карта
В корне остаются неверсируемые `AGENTS.md` и `MVP.md`. Каждый из frontend, backend, specs и docs содержит собственный `AGENTS.md`, а docs инициализируется отдельным Git-репозиторием. `MVP.md` хранит компактный порядок поставок и уже принятые решения; нормативные требования и design/tasks артефакты живут только в OpenSpec.
Альтернатива - сделать корень монорепозиторием или хранить все правила только в одном `AGENTS.md`. Она отклонена, потому что пользователь явно выбрал независимую историю модулей, а локальный агент не всегда получает контекст рабочей области.
### OpenAPI как однонаправленный контракт
Backend генерирует Swagger/OpenAPI из контроллеров и DTO, использует `/api/v1` для будущих HTTP-маршрутов и публикует документ только для локальной разработки. Frontend запускает локальную команду генерации и коммитит типы и HTTP-модуль в свой репозиторий. Работающий frontend не получает типы динамически и не зависит от Swagger endpoint.
Альтернатива - вручную поддерживать типы или хранить OpenAPI YAML в docs/specs. Она отклонена: ручные дубликаты расходятся с backend, а документация не является исполняемым источником контракта.
### Минимальная адаптация frontend-template
Frontend получает FSD-каркас, React Router, React Query, Mantine, русский i18n, инструменты генерации API, тестовую и quality-инфраструктуру из референса. Todo entities, features, pages, mocks, e2e-сценарии и тексты не переносятся. Цвета и spacing tokens адаптируются из `fin-tracker` в светлую тему Mantine и небольшой CSS token layer. На baseline создаются только маршруты, app shell и нейтральные loading/error/empty pages.
Альтернатива - копировать весь шаблон или строить frontend на чистом Vite. Полный перенос оставит неиспользуемый Todo-код, а чистый Vite потребует повторно собирать уже проверенную инфраструктуру.
### NestJS foundation с Prisma и SQLite
Backend добавляет конфигурацию окружения с fail-fast валидацией, Prisma с SQLite, versioned global prefix, Swagger, CORS с origin из окружения и единый безопасный формат HTTP-ошибок. Базовая схема Prisma может быть пустой до `add-authentication`; baseline не создает пользовательские или сессионные таблицы.
Альтернатива - добавить БД вместе с auth. Она отклонена, поскольку Prisma-механика и проверка конфигурации являются общим фундаментом будущих изменений и должны быть проверены отдельно.
### Документация разделена по назначению
Docs содержит `adr/` для долгоживущих технических решений, `architecture/` для cross-feature устройства, `development/` для процесса и `features/` для завершенных пользовательских возможностей. ADR создаются уже в baseline для Prisma/SQLite, OpenAPI, будущего gRPC boundary, шифрования T-Bank токенов, upstream resilience, auth session model и React Query caching. Mermaid остается встроенным в Markdown.
Альтернатива - фиксировать решения только в OpenSpec. Она отклонена: после архивирования change его план не удобен как постоянная архитектурная документация.
## Risks / Trade-offs
- [Перенос слишком большого объема из frontend-template] → Переносить только инфраструктурные файлы и удалять все Todo-специфичные зависимости, код и конфигурацию.
- [Несовпадение OpenAPI generation с будущими Nest DTO] → Добавить локальную команду генерации и проверять обновление generated client при изменении контракта.
- [SQLite и local-only окружение маскируют deployment-проблемы] → Хранить connection string и CORS origin в env, не добавляя deployment-инфраструктуру до реальной потребности.
- [Ранние ADR описывают еще не реализованные технические решения] → ADR четко отмечают статус baseline decision и привязывают применение к соответствующему будущему OpenSpec change.
- [Пустой Prisma schema не создает полезную миграцию] → Подключить Prisma и конфигурацию в baseline, первую доменную миграцию создать вместе с authentication.
## Migration Plan
1. Инициализировать Git в docs и создать локальные guidance и MVP-файлы.
2. Создать структуру docs и ADR, фиксирующие принятые решения.
3. Адаптировать frontend и backend foundations без доменной функциональности.
4. Сгенерировать и проверить базовый OpenAPI-клиент frontend из запущенного backend.
5. Выполнить проверки каждого репозитория и верификацию OpenSpec baseline.
6. При откате удалить только baseline-коммиты в затронутом независимом репозитории; общая рабочая область и read-only references не затрагиваются.