Перенесено из репозитория (
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 зелёный.