Page:
Бэклог
Pages
API карта
Home
Архитектура 05 deal architecture design
Архитектура 09 unified card
Архитектура 10 operator analytics contract
Архитектура 10 unified api contract
Бэклог
Инструкция пользователя
Код стайл аудит 2026 09 11
Код стайл
План 2026 09 04 channel discovery
План 2026 09 11 codestyle остатки
План roadmap
План scaffold
План stage1 tenancy
План stage10 operator analytics
План stage11 i18n
План stage12 observability hardening
План stage2 settings
План stage3 kanban
План stage4 pipeline
План stage5 projects
План stage6 services
План stage7 saas
План stage9 unified card
Ревью 2026 09 08 code quality review
Ревью 2026 09 10 docs audit
Ревью 2026 09 10 tz compliance audit
Ревью 2026 09 11 docs final sweep
Спека 2026 09 04 channel discovery design
Спека 2026 09 11 source attachments вопросы
Спека 2026 09 11 source contract design
Спека 2026 09 11 структура проектов design
Статус разработки
ТЗ
Техническая документация
Clone
Table of Contents
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.
Перенесено из репозитория (
docs/superpowers/backlog.md). Актуальная версия — здесь, в вики.
Бэклог (техдолг и отложенные задачи) — «Дейл»
Назначение: единый источник отложенного/запланированного. Роудмап черпается отсюда. Статусы: BACKLOG (сделаем при потребности), DEFERRED (отложено осознанно, вне текущих рамок), MANUAL (нужны внешние условия: креды, хост, прод), TECHDEBT (качество/архитектура). Приоритет: P1 (важно), P2 (полезно), P3 (когда-нибудь). Обновлять при каждом заходе; выполненные пункты переносить в
docs/superpowers/STATUS.mdи вычёркивать здесь.
1. Продуктовые фичи (по потребности)
| ID | Пункт | Источник | Приоритет | Статус |
|---|---|---|---|---|
| BL-AI-OPERATOR | Настройки ИИ-провайдера переносятся в панель оператора: одна глобальная конфигурация (провайдер/модель/baseUrl/ключ с шифрованием enc:) по образцу глобальных ключей Telegram; все вызовы ИИ (AiProviderConfigBuilder → GrpcAiClassifier, GrpcAiTools) читают её, старые тенантовые aiProvider/aiConfigs перестают читаться (данные не удалять); у пользователя во вкладке «ИИ» убран выбор провайдера/модели и ввод ключа, остальное (переключатель, промпты) без изменений; изменение конфигурации — в операторский аудит. Задача #19 |
решение владельца 2026-09-14 | P1 | BACKLOG |
| BL-I18N | Переключатель языка в UI + второй язык (en) + locale-aware форматирование (Intl), плюрализация. Основа (вынос строк в ресурсы, registerLocale) готова |
ТЗ §11, этап 11 | P3 | BACKLOG |
| BL-TG-MULTI | Мультиаккаунтность Telegram (сейчас 1 аккаунт на тенант) | ТЗ §12 | P2 | DEFERRED |
| BL-ML-EXP | Экспорт/импорт ML-моделей (перенос «мозгов» между инстансами) | обсуждение этапа 12 | P3 | DEFERRED (решено не делать; вернуться при SaaS-масштабе) |
| BL-RECLASS-SSE | Сделано (2026-09-11): пакетная переклассификация отдаёт промежуточный прогресс через SSE cards_reclassified ({progress:true,done,total,moved,kept,trashed,skipped}) и финальное событие ({progress:false,reclassified,moved}); CardReclassifier.ReclassifyInboxAsync принимает IProgress<ReclassifyProgressDto>; в UI — индикатор done/total в шапке «Неразобранного» |
этап 12, D | P3 | DONE |
| TD-CARD-MERGE | Полное слияние внутренних DTO карточки в единый CardDto. Решение (2026-09-11): DEFERRED. Наружный контракт единый; внутренние DTO (read/write/DB/patch) намеренно разделены по слоям, слияние — риск без пользы |
этап 9/11 | P3 | DEFERRED |
| TD-PROTO-COMMENTS | Сделано (2026-09-11): из комментариев убраны ссылки на процесс/прототип (Task/Ruling/этап/python L…/main.py/прототип/LEADRADAR_*), удалены блоки <remarks>, <summary> сжаты до короткой фразы; //-комментарии со ссылками удалены, в .proto — тоже. Строк комментариев 27 210 → ~19 100 |
запрос владельца 2026-09-11 | P2 | DONE |
| TD-COMMENTS-IFACE | Привести код к правилам код-стайла (docs/spec/Код-стайл-Дейл.md). Сделано (2026-09-11): (1) <summary> только блочно — 5286 шт.; (2) приватные XML-доки понижены — 2028+12; (3) дедупликация <summary>→<inheritdoc/> — дублей нет (сканы); (4) явные реализации интерфейсов — сделано (2026-09-11, вечер, вариант A): 161 член в 30 прод-файлах конвертирован codemod'ом scripts/make_explicit.py, потребители перетипизированы на интерфейсы (8 мест в проде, 17 тест-файлов), Card/ICard-семейство оставлено implicit как DTO; попутно маркерные классы заменены маркерными интерфейсами. Детали — docs/spec/Код-стайл-аудит-2026-09-11.md |
запрос владельца 2026-09-11 | P2 | DONE |
| TD-TESTS-NSUBSTITUTE | Миграция тестовых фейков на NSubstitute (решение владельца 2026-09-11: моки — через NSubstitute, новых фейк-классов не заводить). Сделано (2026-09-11): NSubstitute 6.1.0 подключён к 5 тест-проектам; эталон миграции — FakePasswordHasher → хелпер TestHashers.New() (NSubstitute, детерминированная семантика сохранена), фейк удалён. Осталось (по размеру): FakeDiscoveryPacer (1 файл), FakeRatesListener (2), FakeTenantProvisioner (5), FakeSecretCipher (8), FakeAiTools (4), FakeRatesSource (1), FakeGlobalSettingsStore (4), FakeTenantRegistry/FakeTenantRepository (3+7), FakeAiClassifier (5), FakeSettingsStore (42), FakeRateLimitCounterStore (5), FakeAuditLogStore (13), FakeTenantStore (10), FakeMlLearningStore (5), FakeMlClient (17), FakeOperatorAuthStore (14), FakeInviteStore (7), FakeFileStorage (9), FakeTokenUsageEventStore (10), FakeAuthStore (15), Recording*/Harness* (gRPC-харнессы — оставить как хелперы), крупные stateful: FakeTelegramGateway (5), FakeDiscoveryGateway (2), FakeTelegramStore (7), FakeTenantLimitStore (15), FakePipelineStore (12), FakeDiscoveryStore (7), FakeKanjStore (21). Для каждого: заменить подставку на Substitute.For<>() + Returns, семантику состояния воспроизвести в конфигурации, тесты перетипизировать на интерфейс |
решение владельца 2026-09-11 | P2 | BACKLOG |
| TD-STYLE-ANALYZERS | Остаток мягких правил код-стайла. Закрыто (2026-09-11): (1) var — включён ломающий сборку гейт только для встроенных типов (csharp_style_var_for_built_in_types = false:warning), остаток выправлен dotnet format style --diagnostics IDE0008 по 5 sln; режимы «очевидный/прочий тип» — silent осознанно (~1600 субъективных замен); (2) дедупликация <summary> — дублей нет (см. TD-COMMENTS-IFACE); (3) переводы строк — решено: LF (.gitattributes * text=auto eol=lf, .editorconfig → lf, 1029 файлов нормализовано, git add --renormalize; попутно починены 42 CRLF-.sh — до этого первый прогон удалённого CI падал бы). this. и именование приватных полей уже закрыты в .editorconfig |
аудит 2026-09-11 | P3 | DONE |
2. Инфраструктура и эксплуатация
| ID | Пункт | Источник | Приоритет | Статус |
|---|---|---|---|---|
| BL-K8S | Kubernetes-манифесты (сейчас docker-compose; k8s — при масштабировании) | ТЗ §11/§12, R6 | P3 | DEFERRED |
| BL-KAFKA | Kafka как шина данных между сервисами (сейчас gRPC + БД-outbox) | ТЗ §12, обсуждение | P3 | DEFERRED |
| BL-CF | Cloudflare / внешний периметр (сейчас Caddy, mTLS; конфиг вне кода) | ТЗ §11, техдок §10 | P2 | MANUAL |
| BL-CI | Сделано (2026-09-11): scripts/ci.sh — сборка всех 5 решений, тесты всех сервисов, скан уязвимых NuGet-зависимостей (dotnet list package --vulnerable --include-transitive), сборка+линтер фронта; build.sh/test.sh расширены на все решения/сервисы; .github/workflows/ci.yml. Первый прогон в удалённом CI — при публикации репозитория |
техдок §8 | P2 | DONE (remote — MANUAL) |
| BL-IMG-HARDEN | Сделано (2026-09-11): non-root USER (deal, UID 10001, HOME=/tmp) во всех прикладных образах; в compose — read_only root FS + tmpfs /tmp, no-new-privileges, cap_drop ALL, mem_limit/cpus; логи stateless-сервисов в /tmp/logs. Проверено compose config (dev/prod/observability); живой прогон — MANUAL |
техдок §10 | P2 | DONE (live — MANUAL) |
| BL-BACKUP-CRON | Автоматизация бэкапов (cron/systemd-примеры есть, реальный прогон — MANUAL) | техдок §9 | P2 | MANUAL |
3. SaaS / мультитенантность
| ID | Пункт | Источник | Приоритет | Статус |
|---|---|---|---|---|
| BL-BILLING | Биллинг и тарифные планы, провайдер платежей | ТЗ §12 | P3 | DEFERRED |
| BL-SIGNUP | Саморегистрация тенантов (сейчас инвайты/оператор) | ТЗ §12 | P3 | DEFERRED |
| BL-SCALE-1000 | Механизм миграций/провижининга на 1000+ схем. Сделано (2026-09-11): пакетная миграция шардирована — ITenantRepository.ListPageAsync + обход страницами в TenantSchemaMigrationService (параллелизм внутри страницы, DefaultPageSize=200, границы 1..32 / 1..5000), сбои изолированы. Осталось при росте: вынести параллелизм/размер в конфиг и кэш прогресса (при необходимости) |
roadmap этап 0, этап 12 | P2 | DONE |
4. Безопасность и наблюдаемость (доработки)
| ID | Пункт | Источник | Приоритет | Статус |
|---|---|---|---|---|
| BL-ALERT-BUDGET | Сделано (2026-09-11): метрика deal.ai.budget.used.ratio{tenant} (доля израсходованного ИИ-бюджета периода, 0..1) в DealMetrics + сбор в RuntimeDepthsCollector/DealMetricsCollector; на её основе оператор настраивает алерт в Prometheus/Grafana |
этап 12, A | P2 | DONE |
| BL-LOG-ACTOR | Сделано (2026-09-11): access-лог HTTP core (HttpAccessLogMiddleware) включает actor (login пользователя тенанта либо оператора) и tenant (id тенанта) — их берут из HttpContext.Items (Session/OperatorSession middleware) |
этап 12, T6 | P3 | DONE |
| BL-GRACEFUL | Дополнительные проверки устойчивости/ретраев (по результатам нагрузочного прогона) | этап 12, C | P2 | BACKLOG |
| BL-SUSPICIOUS | Сделано (2026-09-11): детектор SuspiciousActivityService расширен правилом distinct_logins_per_ip (перебор разных логинов с одного IP, порог DistinctLoginsPerIpThreshold); плюс real-time SuspiciousActivityReporter — метрика deal.security.suspicious{kind} + warn-лог на 429 rate limiter (rate_limit) и блокировке входа (login_blocked) |
ТЗ §10.5, этап 12 | P3 | DONE |
5. Технический долг (качество/архитектура)
| ID | Пункт | Источник | Приоритет | Статус |
|---|---|---|---|---|
| TD-SETTINGS-UI | Вынос вкладок SettingsView в компоненты. Сделано (2026-09-11): SettingsView.vue — только набор вкладок/QR-опрос, все 10 вкладок — отдельные компоненты (components/settings/*) |
ревью 2026-09-08 | P3 | DONE |
| TD-VIRT | Полная виртуализация длинных колонок. Решение (2026-09-11): DEFERRED — прогрессивный рендер «Показать ещё» покрывает текущие объёмы; виртуализация — при росте списков | ревью, этап 12 | P3 | DEFERRED |
| TD-SSE-DEAD | Сделано (2026-09-11): мёртвые SSE-ветки фронта boards_changed/pipeline_stats удалены из store/lifecycle.js (core их не публикует) |
этап 12, E | P3 | DONE |
| TD-DBL-CLICK | Сделано (2026-09-11): перезагрузка доски при batch-переклассификации коалесцируется scheduleBoardReload() (ответ + SSE → один запрос) |
этап 12, E | P3 | DONE |
| TD-TEST-HARNESS | Историческая гонка FreeTcpPort — устранена; следить за новыми хост-хелперами |
этап 12, E | P3 | TECHDEBT |
| TD-OLD-DOCS | Исторические доки несут старые термины под пометками. Проверено (2026-09-11): docs/superpowers/plans/* и старые docs/architecture/2026-09-0* имеют шапку «Исторический документ»; переписывать не нужно |
docs sweep | P3 | DONE |
| TD-SOURCE-PROVIDER | Провайдеры содержимого источников. Сделано (2026-09-11): TelegramSourceContentProvider + ReadSource RPC + GET /api/cards/{id}/source + UI «Обновить из источника». Осталось: провайдеры прочих источников по мере появления |
generic source 2026-09-11 | P2 | TECHDEBT |
| TD-STORE-ATTACH | Выгрузка вложений источника в Storage-сервис адаптером. Решение (2026-09-11): медиа-посты Telegram пропускаем — извлечение/выгрузка не делаются; вложений у прочих источников пока нет — DEFERRED (контракт DataRef готов, включается при появлении такого источника) |
generic source 2026-09-11 | P3 | DEFERRED |
| TD-TG-CORE-SPLIT | Перенос оставшейся Telegram-специфики ядра в telegram-сервис. Закрыто (2026-09-11): не требуется. Задача «дашборды/карточки не знают о Telegram» решена generic-контрактом источника; оставшиеся TelegramStore/Dialogs/TgMessages/Discovery — это состояние тенанта (ядро — владелец данных, telegram-service — stateless-шлюз), перенос отдал бы шлюзу доступ к схеме тенанта |
generic source 2026-09-11 | — | CLOSED |
| TD-SOURCE-CONTACTS | Квалификатор контактов знает форматы профилей (t.me/@handle). Решение (2026-09-11): DEFERRED — форматы стабильны, расширяемость под источник добавляется при конкретной потребности |
generic source 2026-09-11 | P3 | DEFERRED |
| TD-APIMAP-COUNT | Ручной подсчёт числа ручек в api-map. Сделано (2026-09-11): сверил счётчики §3.1–§3.8 с фактическими строками (рассинхрон §3.5 — 14→15 из-за GET /cards/{id}/source); в §3 добавлено правило обновлять счётчики |
docs sweep | P3 | DONE |
6. Manual-проверки (нужны внешние условия)
| ID | Пункт | Источник | Приоритет | Статус |
|---|---|---|---|---|
| MN-E2E-TG | Реальный Telegram-вход (QR) + приём сообщений, backfill, «Перечитать каналы» | ТЗ §4, STATUS | P1 | MANUAL (креды/аккаунт) |
| MN-E2E-LLM | Живые LLM-вызовы (классификация/фильтр/reclassify/расход токенов) | ТЗ §8–9 | P1 | MANUAL (LLM-ключ) |
| MN-PROD | Прод-развёртывание (хост/домен, Caddy+mTLS, observability-профиль) | техдок §13.8 | P2 | MANUAL (данные хоста) |
| MN-GRAFANA | Живая проверка Grafana-дашбордов метрик/алертов и логов | этап 12, A/T6 | P2 | MANUAL |
| MN-LOADTEST | Живой нагрузочный прогон (scripts/loadtest/) и baseline |
этап 12, C | P2 | MANUAL |
| MN-BACKUP | Живой прогон backup.sh/restore на реальных данных |
техдок §9 | P2 | MANUAL |
| MN-THEME | Визуальная приёмка светлой темы в браузере | этап 12, «Внешний вид» | P3 | MANUAL |
7. Отложено/решено «не делать» (для истории)
| ID | Пункт | Решение |
|---|---|---|
| DEC-DEMO | Демо-эндпоинты (DEAL_DEMO, simulate-lead) |
Удалены (этап 9/12) |
| DEC-LEGACY | Легаси-прототип LeadRadar (backend/, mlservice/, корневой compose) |
Перенесён в archive/leadradar-legacy/ (2026-09-10); 2026-09-11 убран и из репозитория — лежит только локально |
| DEC-ML-EXP | Экспорт/импорт ML | Отложено владельцем (перенесено в BL-ML-EXP) |
Как пользоваться
- Для нового захода: выбрать пункты по приоритету/теме, оформить SDD-план в
docs/superpowers/plans/и ledger.superpowers/sdd/<этап>/, после приёмки — перенести факт вdocs/superpowers/STATUS.md, а пункт здесь пометить выполненным/удалить. - Открытые пункты (BACKLOG/MANUAL) зеркалятся задачами в Gitea (
rust/Deal, метки P1/P2/P3/manual/techdebt); при закрытии пункта закрывать задачу и наоборот. - Пункты
MANUALне блокируют разработку; выполняются, когда владелец даёт креды/хост.