Этап 7, итерация 3 завершена: m08-admin-web (консоль владельца)
Backend (Server.WatchBody.Web): AdminAuthService — PBKDF2
(pbkdf2$100000$salt$hash) → in-memory Bearer-сессии TTL 8 ч
(Admin.Login пуст → консоль отключена); 6 контроллеров /api/admin/*:
login/logout; атлеты (создание — ключ wb-… возвращается один раз,
смена ключа, блокировка → 401 на /api/v1); тренировки всех атлетов
(фильтры/пагинация, карточка план/факт + таймлайн Lap/пульс +
пульсограмма ≤600 точек), CSV (;/BOM, tech-req 2.4); программы
(версии/body, активация draft, применение rules-предложения через
author=admin-копию — неизменяемость версий); метрики (+weekly
ISO-агрегат); план/факт (PlanSummaryService: недели от понедельника
создания active-версии, performed — только плановые дни).
Errata m02: ApiKeyMiddleware сужен до /api/v1/* (перехватывал статику);
Kit.Routes — роут на блок AddController (NeedHttpPost_All не чейнится).
Flutter Web UI (3-app\3-web\admin-web, SDK 3.47.7): Material 3 тёмная
тема, NavigationRail, 6 экранов, токен sessionStorage, 401 → логин,
CSV через Bearer+Blob, графики CustomPaint; без внешних pub-пакетов;
build.ps1 → wwwroot\admin (сборка в .gitignore — артефакт).
Тесты: Web 105/105 (m08 — 7), Core 56/56; flutter analyze 0
ошибок/варнингов; HTTP-смок хостинга/логина пройден. Эксплуатационные
файлы в коммит не включены.