План stage10 operator analytics
stepan edited this page 2026-09-13 00:17:00 +03:00

Перенесено из репозитория (docs/superpowers/plans/2026-09-10-deal-stage10-operator-analytics.md). Актуальная версия — здесь, в вики.

Дейл (Deal) — Этап 10: оператор-консоль, аналитика и аудит действий

Исторический документ этапа 10. Актуальное состояние — docs/superpowers/STATUS.md и docs/technical/Техническая-документация-Дейл.md.

Goal: закрыть SaaS-контур снаружи: UI операторской админки и страница активации инвайта; сквозной аудит (входы/выходы/действия пользователей); аналитика расхода токенов; дашборды по логам (ELK/Loki).

Контекст: этапы 0–9 завершены. Операторский API уже есть (/api/operator/*: auth, tenants, invites, limits, audit, health; /api/join), но UI отсутствует. Аудит (public.audit_log, append-only) покрывает SaaS-события (входы, инвайты, тенанты, лимиты, impersonation), но не покрывает выходы и действия тенант-пользователей. Расход токенов хранится агрегатом (public.tenant_limits.UsedTokens), истории нет.

Решения этапа

  • A1. Роутинг фронта. Проект без vue-router. Ввести минимальный hash-роутер: #/ — основное приложение (как сейчас), #/operator — консоль, #/join?code=… — активация инвайта. Без новых зависимостей.
  • A2. Аудит — единая точка. Только AuditService пишет в public.audit_log (append-only). Действия тенант-пользователей пишутся оттуда же (actor=tenant). Секреты не логируются.
  • A3. Расход токенов — событийная история. Новая таблица public.token_usage_events (time-series: тенант, время, провайдер, модель, вид (ai|ml), токены). Агрегат tenant_limits остаётся для гейта; история — для аналитики.
  • A4. Аналитика — операторские read-only эндпоинты под /api/operator/analytics/*; никаких изменений существующих контрактов (только расширение /api/operator/audit пагинацией/фильтром actorId).
  • A5. ELK. Логи структурированы Serilog JSON. Аналитика по логам — Grafana/Loki: provisioning datasource + дашборды (входы/выходы/неудачные входы, ошибки, RPS, действия).

Задачи

  • T1. Аудит действий (бэк). Дополнить AuditEvents: tenant_logout, operator_logout, invite_joined (активация/join), действия карточек (card_created, card_moved, card_trashed, card_restored, card_deleted, card_comment_added), контейнеры (container_created, container_updated, container_deleted), настройки (settings_updated), каналы (channel_enabled/channel_created), Telegram (telegram_linked). Записать в соответствующих сервисах/эндпоинтах (без секретов). Войти обязаны: logout тенанта и оператора.
  • T2. История расхода токенов (бэк). Таблица public.token_usage_events + EF-конфигурация + системная миграция. Запись события в точке списания токенов (AI- и ML-путь). Порт для чтения агрегатов/серий.
  • T3. Аналитика (бэк). /api/operator/analytics/overview, /tokens, /activity; расширить /api/operator/audit (offset/пагинация, actorId, total). Контракт: docs/architecture/2026-09-10-operator-analytics-contract.md.
  • T4. Оператор-консоль (фронт). Hash-роутер; экраны: вход оператора, тенанты (список/создать/ suspend/resume/impersonate), инвайты (создать/отозвать/ссылка), лимиты (список/правка), аудит-лента (фильтры/пагинация), аналитика (обзор/токены/действия).
  • T5. Страница активации (фронт). #/join?code=… → форма (email/имя/пароль) → POST /api/join.
  • T6. Наблюдаемость (ELK/Loki). Grafana provisioning (datasource Loki + дашборды), promtail-лейблы; дашборды: входы/выходы/неудачные входы, ошибки 5xx, RPS, действия пользователей.
  • T7. Приёмка/доки. Сквозная проверка (operator → tenant → invite → join → действия → аудит/аналитика), обновить docs/api, docs/technical, docs/user-guide, docs/superpowers/STATUS.md.

Границы

  • Kafka/k8s/биллинг/саморегистрация — вне рамок.
  • Реальные Telegram/LLM-креды — не требуются (аналитика токенов наполняется на любых AI/ML-вызовах).
  • Данные тестовые; схема system (public) расширяется одной миграцией.

Порядок

T1+T2+T3 (бэк, контракт) → T4+T5 (фронт по контракту) → T6 (наблюдаемость, параллельно) → T7 (приёмка).

Каждая задача: dotnet build Deal.sln 0/0, core-тесты зелёные, npm run build зелёный.