Изменение vision 1.2: веб — админ-консоль владельца (вход по логину/паролю); просмотр всех тренировок, динамика, корректировка программ, управление атлетами; требования — черновик 3

This commit is contained in:
virus-home 2026-10-17 18:24:28 +05:00
parent acfef60245
commit 0b2c68614c
2 changed files with 50 additions and 24 deletions

View File

@ -6,7 +6,7 @@
> (`..\..\Техническое задание.md`), дизайн LLM-планирования (разд. 2–3,
> 6–8, 11 — шаг 1); изменение vision 1.1 (2026-10-17) — несколько
> атлетов на сервере, разные модели часов.
> Версия: черновик 2 (2026-10-17). Формулировки — проверяемые (d-req-7).
> Версия: черновик 3 (2026-10-17). Формулировки — проверяемые (d-req-7).
## 1. Назначение и границы
@ -93,7 +93,8 @@ Garmin штатно — Ф-2.5, Ф-2.6). Код поля данных перен
| Параметр | Семантика | Умолчание |
|---|---|---|
| `Api.Key` | статический API-ключ по умолчанию (владелец) | — (обязательный) |
| `Api.Athletes` | список атлетов: `{ name, apiKey }` — ключ идентифицирует атлета (изменение vision 1.1; способ заведения — открытый вопрос 9) | — (минимум владелец) |
| `Api.Athletes` | список атлетов: `{ name, apiKey }` — ключ идентифицирует атлета (изменение vision 1.1; управление — через веб-консоль, Ф-9.1) | — (минимум владелец) |
| `Admin.Login / Admin.PasswordHash` | учётные данные владельца для входа в веб-консоль (пароль — только хэш, изменение vision 1.2) | — (обязательные) |
| `Api.Port` | порт HTTPS | `8443` |
| `Db.ConnectionString` | подключение к PostgreSQL | — (обязательный) |
| `Garmin.Login / Garmin.Password` | учётная запись Garmin Connect (решение — опросник 4.3) | — (обязателен для `fetch`) |
@ -268,16 +269,28 @@ Garmin штатно — Ф-2.5, Ф-2.6). Код поля данных перен
6. 🛡 API пишет факт-данные только из sync и импорта; ручного ввода
на сервере нет.
### Ф-9. Веб-интерфейс сервера
### Ф-9. Веб-интерфейс сервера — административная консоль владельца
1. Страница истории: таблица тренировок (дата, длительность, средний
пульс, подходы, упражнений), сортировка по дате, пагинация;
владелец (ключ `Api.Key`) видит все данные, атлет — только свои;
фильтр по атлету для владельца (изменение vision 1.1).
2. Карточка тренировки: подходы, пульс-тренд, соответствие программе
(план/факт — Ф-11.4).
3. Выгрузка CSV текущей выборки (КУ-4). Доступ — по ключу атлета
(форма входа — ввод ключа; открытый вопрос 6).
🛡 Доступ в веб — только для владельца, вход по логину и паролю
(`Admin.Login` / `Admin.PasswordHash` из настроек; открытый вопрос 6
закрыт); атлеты работают только через телефон (изменение vision 1.2).
Разделы консоли:
1. **Атлеты** (управление, открытый вопрос 9 закрыт этим решением):
список, добавление атлета (имя + генерация API-ключа), смена ключа,
блокировка (заблокированный ключ → `401` на API).
2. **Тренировки**: таблица по всем атлетам с фильтром по атлету и дате
(дата, длительность, средний пульс, подходы, упражнений), сортировка,
пагинация; карточка тренировки: подходы, пульс-тренд, отчёт план/факт
(Ф-11.4); выгрузка CSV текущей выборки (КУ-4).
3. **Программы**: выбор атлета → список версий (статусы, автор, даты);
создание и правка версий `draft`; смена активной версии (Ф-10.3);
просмотр предложений правил (Ф-12.3) — применение предложения
из консоли помечает версию `author=admin`.
4. **Метрики и динамика**: по атлету и периоду — adherence, тоннаж
по группам, динамика 1ПМ и рабочего веса по упражнениям (графики
по неделям из `workout_metrics`); у каждой тренировки карточки —
место в тренде (лучше/хуже предыдущей).
### Ф-10. Программы тренировок (сервер + телефон)
@ -287,8 +300,10 @@ Garmin штатно — Ф-2.5, Ф-2.6). Код поля данных перен
повторения, `target_rpe`, отдых). Хранение — таблица `programs`
(PostgreSQL); каждая версия неизменяема (🛡). 🛡 Программы принадлежат
атлету — у каждого свои (изменение vision 1.1).
2. В v1 создание/правка версии — вручную в приложении на телефоне
(редактор программы) с отправкой на сервер; `author=user`.
2. В v1 создание/правка версии — на телефоне (редактор программы
атлета, `author=user`) или в административной консоли (владелец,
`author=admin`, изменение vision 1.2); отправка на сервер — при
синхронизации телефона либо сразу из консоли.
3. Ровно одна версия в статусе `active` (🛡); смена активной — явным
действием пользователя; выполненные тренировки ссылаются на версию,
которая была активна на их начало (история не «поплывёт»).
@ -323,8 +338,9 @@ Garmin штатно — Ф-2.5, Ф-2.6). Код поля данных перен
- иначе (частичное выполнение) — вес без изменения.
3. Правила применяются только к `active` версии; результат —
предложение следующей версии программы со статусом `draft`
(`author=rules`), показывается в приложении диффом; применение —
подтверждением пользователя (Ф-10.3). 🛡 Автоматической смены
(`author=rules`), показывается атлету в приложении диффом;
применение — подтверждением атлета на телефоне или владельцем
в консоли (Ф-9.3, изменение vision 1.2). 🛡 Автоматической смены
активной версии нет (vision 2.4).
4. Делоад: если `Deload.MaxWeeks` недель подряд без делоада, правило
предлагает делоад-версию (объём −40–50 %) — тем же механизмом
@ -356,8 +372,8 @@ Garmin штатно — Ф-2.5, Ф-2.6). Код поля данных перен
- 🛡 **Изоляция атлетов:** API-ключ идентифицирует атлета; ни API,
ни веб не отдают атлету чужие данные; метрики, правила и программы
считаются по атлетам независимо (изменение vision 1.1).
- 🛡 **Тайны:** пароль Garmin и API-ключи — только в настройках;
в логах их нет.
- 🛡 **Тайны:** пароль Garmin, API-ключи и хэш пароля владельца — только
в настройках/БД; в логах их нет.
- 🛡 **Безопасность нагрузки:** автоматические изменения программы
ограничены лимитами правил (Ф-12.2, Ф-12.4); смена активной версии —
только вручную (БР-5, vision 2.4).
@ -394,9 +410,9 @@ Garmin штатно — Ф-2.5, Ф-2.6). Код поля данных перен
| 3 | Канал телефон ↔ часы | Connect IQ companion (Communications): что передаётся реально (пульс live, зоны, таймер отдыха, заряд); ограничения канала определяют Ф-2.4, Ф-3.2, Ф-6.3. Прототип на шаге 4 | Закрыт шагом 4 |
| 4 | Расписание `fetch` | cron/systemd-таймер на сервере против внутреннего планировщика; предпочтителен внешний планировщик | Закрыт шагом 5 |
| 5 | Способ сопоставления тренировок телефон ↔ .fit | Окно ± 15 минут (Ф-8.4) против точной метки начала из sync | ✅ Закрыт в этом документе (раздел 4, Ф-8.4) |
| 6 | Доступ в веб-интерфейс | Ввод ключа в форме против Basic Auth; личное использование — проще форма с ключом | Закрыт шагом 5 |
| 6 | Доступ в веб-интерфейс | ✅ Закрыт изменением vision 1.2: веб — административная консоль владельца, вход по логину и паролю (раздел 4, Ф-9); атлеты — только телефон | ✅ Закрыт (изменение vision 1.2) |
| 7 | Формула оценочного 1ПМ | Эпли против Бжицки (разд. 4 дизайна LLM-планирования); различие ~5 % на малых повторениях | Закрыт шагом 5 |
| 8 | Перечень моделей часов v1 | Якорь — Fenix 6 (изменение vision 1.1); каждая модель — конфигурация сборки (экран, память). Кандидаты: модели с профилем «Силовая» и Connect IQ 4+ у участников; список фиксируется по фактическому парку устройств | Закрыт шагом 4 |
| 9 | Способ заведения атлетов | Список `{name, apiKey}` в `appsettings.json` (просто, но правка — с перезапуском) против раздела веб-администрирования владельца (удобнее, дороже). Для v1 — конфиг с последующим переносом в веб без смены схемы БД | Закрыт шагом 5 |
| 9 | Способ заведения атлетов | ✅ Закрыт изменением vision 1.2: раздел «Атлеты» веб-консоли владельца (Ф-9.1) — имя + генерация ключа, смена ключа, блокировка; стартовые данные владельца — в конфиге | ✅ Закрыт (изменение vision 1.2) |
| 10 | Источник .fit для атлетов без учётки владельца | `fetch` идёт под учётной записью владельца (опросник 4.3); другие атлеты: (а) делят доступ к своему Garmin (передача файла в папку импорта), (б) свой экземпляр учётки в конфиге, (в) только ручной импорт. Кандидат для v1 — (в) папка импорта | Закрыт шагом 5 |
| 11 | Общий справочник упражнений | Сейчас библиотека у каждого атлета своя (Ф-4.4); общий справочник + личные дополнения — кандидат v2 (дубли при малом числе атлетов не критичны) | Открыт (до v2) |

View File

@ -1,8 +1,9 @@
# Vision: Феникс 6X — контроль силовых тренировок (телефон + Garmin Fenix 6 + личный сервер)
> Версия 1.1 — **УТВЕРЖДЕНО** (2026-10-17; вопросы опросника 4.1–4.7
> отвечены, ответы применены; утверждение — 2026-10-17).
> Изменение 1.1 (указание пользователя, 2026-10-17): серверная часть
> Версия 1.2 — **УТВЕРЖДЕНО** (2026-10-17; вопросы опросника 4.1–4.7
> отвечены, ответы применены; утверждение — 2026-10-17; изменения
> 1.1, 1.2 — указания пользователя от 2026-10-17).
> Изменение 1.1: серверная часть
> поддерживает нескольких атлетов — у каждого свои программы, профиль
> и данные, с собственных телефона и часов (пп. 2.2, 2.4, 3.1);
> саморегистрации нет — учётные записи и API-ключи создаёт владелец
@ -10,6 +11,11 @@
> один атлет); часы поддерживаются различные: одно поле данных
> (Connect IQ) собирается под разные модели Garmin, серверу источник
> .fit безразличен (пп. 2.2, 2.4).
> Изменение 1.2: веб-интерфейс сервера — административная консоль
> владельца: просмотр тренировок и отчётов всех атлетов, корректировка
> программ (версии, смена активной), управление атлетами (Ф-9, п. 2.2);
> атлеты смотрят свои данные только на телефоне — веб-доступа для них
> нет.
> Источник идеи: техническое задание
> «Феникс 6X» (Garmin Edition) от 17.10.2026
> ([Техническое задание.md](../../Техническое%20задание.md)); требование
@ -267,8 +273,12 @@ Garmin, наш продукт фиксирует результаты без р
парсинг FIT (Session, Lap, Record, Set — Garmin FIT SDK), сохранение
в собственную БД; REST API со статическим ключом;
импорт FIT/TCX/GPX как fallback (документ форматов).
- **Ф-9. Веб-интерфейс сервера** — таблица истории тренировок,
выгрузка в CSV.
- **Ф-9. Веб-интерфейс сервера** — административная консоль владельца
(изменение 1.2): просмотр тренировок всех атлетов (таблица,
карточка, план/факт) и метрик, выгрузка в CSV; корректировка
программ — создание и правка версий, смена активной; управление
атлетами — заведение учётных записей и ключей. Атлеты работают
только через телефон.
- **Ф-10. Программа тренировок** — программа как версионированный
JSON-документ (недели → тренировки → упражнения по ID библиотеки →
подходы-план: вес, повторения, RPE, отдых); версии неизменяемы,