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

7.4 KiB
Raw Blame History

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), остальные — заметки процесса.