Files
Deal/.superpowers/sdd/deal-scaffold/progress.md
T
Rustam Khalimov 27c7831910
ci / build-test (push) Canceled after 0s
Deal — единая кодовая база
SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/
Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue,
контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер),
Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог).

Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
2026-09-11 23:56:47 +03:00

54 lines
7.4 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.
# SDD ledger — plan: docs/superpowers/plans/2026-09-05-deal-scaffold.md
Проект НЕ git: вместо коммитов — отчёты задач (task-N-report.md) и этот ledger.
Ревью выполняется по фактическим файлам дерева (пакеты diff недоступны без git).
## Todos
- [x] Task 1: Структура src/ и перенос фронтенда
- [x] Task 2: Стандарты кода — .editorconfig, Directory.Build.props
- [x] Task 3: Решение Deal.sln и пустые проекты core
- [x] Task 4: Тесты — xUnit-каркас
- [x] Task 5: Dev-Postgres в docker compose (схема на тенанта)
- [x] Task 6: Tenant-контекст и подключение к Postgres
- [x] Task 7: EF Core + миграции (public)
- [x] Task 8: Применение миграций ко всем схемам тенантов
- [x] Task 9: CI-скрипты и финальная проверка этапа
## Pre-flight scan (таблица пар задач и внутренней согласованности)
| Пара | Производит / потребляет | Результат |
|---|---|---|
| T1 → T5 | T1 создаёт корневой README.md; T5 его дополняет | Чисто |
| T1 → T2 | T1 создаёт src/core; T2 кладёт Directory.Build.props в src/core | Чисто |
| T2 → T3..T9 | props применяется ко всем csproj под src/core (вкл. тесты, Api) | Внутреннее расхождение: пакет-анализатор 9.0.0 против SDK 10 — см. Ruling 1 |
| T3 → T4 | T4 ссылается на проекты модулей из T3 | Чисто |
| T4 → T6/T7/T8 | T4 создаёт тестовый проект; T6 добавляет TenantIdTests, T7 TenantEntityTests, T8 TenantSchemaMigratorTests | T7/T8 тестам нужен reference на Deal.Infrastructure, которого нет в T4 — см. Ruling 3 |
| T4/T6 | счётчики тестов: T4=1 (MarkerTests), +T6=2 → 3 PASS | Чисто (внутренне согласовано в T6 Step 3) |
| T6 → T7 | ConnectionStringProvider в Infrastructure зависит от IConfiguration | Внутреннее расхождение: в плане нет пакета конфигурации для Infrastructure — см. Ruling 4 |
| T6 → T6 | ITenantContext/AsyncLocal, SqlSchema search_path | Чисто |
| T7 → T8 | T8 консьюмит TenantId; отдельно SQL | Чисто |
| T7 | dotnet-ef миграция требует tool | Ruling 5 (локальный tool-manifest вместо --global) |
| T7 | IDesignTimeDbContextFactory в Infrastructure; API как startup | Чисто |
| T2 → T3 | warnings-as-errors на новых шаблонах .NET 10 | Риск: неожиданные NETSDK-предупреждения; при необходимости ослабить severity в .editorconfig (записано в Ruling 1) |
| T1 | `cp -r frontend/*` тянет node_modules/dist | Приемлемо (без git всё хранится в дереве); проверить копию ДО rm (Ruling 2) |
## Rulings (pre-flight)
- **Ruling 1** — план (T2) включает `Microsoft.CodeAnalysis.NetAnalyzers 9.0.0`; SDK 10.0.400 уже поставляет совместимые анализаторы (AnalysisLevel=latest + EnforceCodeStyleInBuild). Явный пакет 9.0.0 рискует версионным рассинхроном с net10 и ошибками сборки при warnings-as-errors. Решение: явный PackageReference НЕ добавляем, полагаемся на встроенные анализаторы SDK. Стоимость при ошибке: вернуть пакет позже одной строкой.
- **Ruling 2** — перенос фронтенда (T1) разрушителен (`rm -rf frontend`): сначала полная проверка `src/frontend` (ключевые файлы + count), только потом удаление. Стоимость при ошибке: потеря node_modules (переустанавливаемо), исходники Vue восстанавливаются из src/frontend.
- **Ruling 3** — тесты T7 (TenantEntityTests) и T8 (TenantSchemaMigratorTests) импортируют `Deal.Infrastructure.*`, но T4 подключает к тестам только модули + SharedKernel. Решение: при T7 добавить `dotnet add tests/Deal.Tests.Unit reference Deal.Infrastructure`. Стоимость при ошибке: нет.
- **Ruling 4** — ConnectionStringProvider принимает IConfiguration; у classlib Infrastructure нет ссылки на конфигурацию. Решение: в T6 добавить пакет `Microsoft.Extensions.Configuration.Abstractions` в Deal.Infrastructure. Стоимость при ошибке: нет.
- **Ruling 5** — план требует `dotnet tool install --global dotnet-ef` (изменение вне дерева). Решение: проверить глобальный список; если нет — локальный tool-manifest в `src/core/.config` (`dotnet new tool-manifest` + `dotnet tool install dotnet-ef`). Стоимость при ошибке: лишний файл манифеста.
## Task status
- Task 1: complete (review clean). Отчёт: task-1-report.md. Minor deferred: файл `src/frontend/nul` (резервированное имя Windows, переехал из LeadRadar) — удалить, если нативные инструменты начнут спотыкаться.
- Task 2: complete (review clean). Отчёт: task-2-report.md.
- Task 3: complete (review clean). Отчёт: task-3-report.md.
- Task 4: complete (review clean). Отчёт: task-4-report.md.
- Task 5: complete (review clean). Отчёт: task-5-report.md.
- Task 6: complete (review clean; единственное отклонение — явный `public` на членах ITenantContext из-за IDE0040:error, семантика не изменена). Отчёт: task-6-report.md. Note для следующих задач: сниппеты интерфейсов из плана могут требовать явных модификаторов доступа.
- Task 7: complete (review clean; 3 отклонения — все задокументированы и одобрены ревью: Relational-пин в Infrastructure против MSB3277; Design PrivateAssets=all в Api для dotnet-ef; тест TenantEntity переписан на реальные дефолты — план сам разрешил «скорректировать»). Отчёт: task-7-report.md.
- Task 8: complete (review clean; производственный код verbatim; тест EscapesQuotes заменён на осмысленный — исходное утверждение плана падало на верном коде и проходило на баге). Отчёт: task-8-report.md.
- Task 9: complete (review clean). Отчёт: task-9-report.md.
- **Этап 0 завершён**: все 9 задач complete; финальное whole-scope ревью ✅ (0 warnings/0 errors, 6/6 PASS, deal-postgres healthy, /api/health ок). Deferred minors: `src/frontend/nul` (не блокирует; решить в этапе 1), остальные — заметки процесса.