ci / build-test (push) Canceled after 0s
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 зелёные.
54 lines
7.4 KiB
Markdown
54 lines
7.4 KiB
Markdown
# 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), остальные — заметки процесса.
|