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 зелёные.
7.4 KiB
7.4 KiB
SDD ledger — plan: docs/superpowers/plans/2026-09-05-deal-scaffold.md
Проект НЕ git: вместо коммитов — отчёты задач (task-N-report.md) и этот ledger. Ревью выполняется по фактическим файлам дерева (пакеты diff недоступны без git).
Todos
- Task 1: Структура src/ и перенос фронтенда
- Task 2: Стандарты кода — .editorconfig, Directory.Build.props
- Task 3: Решение Deal.sln и пустые проекты core
- Task 4: Тесты — xUnit-каркас
- Task 5: Dev-Postgres в docker compose (схема на тенанта)
- Task 6: Tenant-контекст и подключение к Postgres
- Task 7: EF Core + миграции (public)
- Task 8: Применение миграций ко всем схемам тенантов
- 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), остальные — заметки процесса.