From 0b2c68614cfbbdc8cc7adee9fe2232f064027408 Mon Sep 17 00:00:00 2001 From: virus-home Date: Sat, 17 Oct 2026 18:24:28 +0500 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20vision=201.2:=20=D0=B2=D0=B5=D0=B1=20=E2=80=94?= =?UTF-8?q?=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD-=D0=BA=D0=BE=D0=BD=D1=81?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D1=86=D0=B0=20(=D0=B2=D1=85=D0=BE=D0=B4=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D1=83/=D0=BF=D0=B0=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8E);=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82?= =?UTF-8?q?=D1=80=20=D0=B2=D1=81=D0=B5=D1=85=20=D1=82=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=BE=D0=BA,=20=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=D0=BA=D0=B0,=20=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC,=20=D1=83=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B0=D1=82?= =?UTF-8?q?=D0=BB=D0=B5=D1=82=D0=B0=D0=BC=D0=B8;=20=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=B1=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=E2=80=94=20=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=BD=D0=BE=D0=B2=D0=B8=D0=BA=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-docs/1-reqs/requirements.md | 54 +++++++++++++++++++++++------------ 1-docs/1-reqs/vision.md | 20 +++++++++---- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/1-docs/1-reqs/requirements.md b/1-docs/1-reqs/requirements.md index 1c48d87..4937902 100644 --- a/1-docs/1-reqs/requirements.md +++ b/1-docs/1-reqs/requirements.md @@ -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) | diff --git a/1-docs/1-reqs/vision.md b/1-docs/1-reqs/vision.md index f59db67..3e9d65c 100644 --- a/1-docs/1-reqs/vision.md +++ b/1-docs/1-reqs/vision.md @@ -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, отдых); версии неизменяемы,