# План проекта: WatchBody («Феникс 6X») > Код системы — WatchBody (репозиторий > `https://git.mind01.ru/VEU/VEU.WathBody.git`); название продукта — > «Феникс 6X». План проекта — формат по sd-init-5 > (`std1\_rules\sd\sd-init.md`); шаги процесса — > `std1\_process\process.md`. Статусы: ⬜ — не начат, 🔄 — в работе, > ✅ — завершён. План актуализируется по факту прохождения шагов. | Шаг процесса | Артефакты | Статус | |---|---|---| | 1. Инициация разработки | `1-docs\1-reqs\vision.md` (утверждён 2026-10-17, v1.0), `1-docs\0-mng\plan.md` | ✅ | | 2. Создание рабочей области | `readme.md` системы, структура репозитория, `.gitignore` | ✅ | | 3. Разработка функциональных требований | `1-docs\1-reqs\requirements.md` (утверждён 2026-10-17) | ✅ | | 4. Разработка архитектуры | `1-docs\2-arch\architecture.md`, `hld.puml` (+ рендер) (утверждена 2026-10-17) | ✅ | | 5. Разработка технических требований | `1-docs\3-tech\tech-requirements.md`, спецификации библиотек (утверждены 2026-10-17) | ✅ | | 6. Проектирование баз данных | `1-docs\2-db\` — readme, `src\tables.md`, `ref\tables.md`, `functions.md` (утверждены 2026-10-17) | ✅ | | 7. Итерационная разработка | `3-app\` (код), `1-docs\4-modules\` (документы модулей) | 🔄 | ## Решение шага 6 (состав данных) Принято (2026-10-17): серверная БД — **PostgreSQL** (реляционные данные, ссылочная целостность, изоляция атлетов); состояние телефона — локальная Room/SQLite; файлы (`.fit`, логи) — вне БД. Схемы-слои: `src` — данные тренировок, программ, атлетов, метрик; `ref` — справочники (двигательные группы). Документация — `1-docs\2-db\`. JSON-тела (версии программ, факты .fit) — `jsonb` внутри таблиц. ## Решение шага 7 (разбивка версии 1.0 на модули) Принято (2026-10-17): версия 1.0 разбивается на модули по компонентам архитектуры v1.1; порядок — итерациями (итерация 1 — серверный фундамент, чек-лист шага 7 tech-requirements разд. 7). Статусы модулей: ⬜ — не начат, 🔄 — в работе, ✅ — завершён. | Модуль | Состав (проект) | Итерация | Статус | |---|---|---|---| | m01-server-db | Схема `src`/`ref`: миграции, psql-функции + тесты (d-dev 1–4); домен C# + DAL-репозитории (d-dev 5–7; 13 репозиториев в 8 файлах: Program.cs → Program+ProgramVersion, Workout.cs → Workout+WorkoutSet+CommandLog, DailyLog.cs → DailyLog+WorkoutMetrics+Break, Exercise.cs → Exercise+ExerciseReplacement, остальные — по классу); `--mode migrate` | 1 | ✅ (2026-10-18: 38/38 функций `DONE`; после З-35 — тесты psql 123/123 + C# 56/56, миграция 003 external_id) | | m02-rest-api | `Server.WatchBody.Web`: `POST /api/v1/sync`, `GET workouts`, `GET programs/active`, middleware ключа; MVC + fluent Kit.Helpers.Routes | 1 | ✅ (2026-10-18: закрыт; после З-41(а) — тесты Web 81/81 + Core 56/56) | | m03-program-store | `Server.WatchBody.Core`: версионный JSON программ, `active` — ровно одна | 1 | ✅ (2026-10-18: ProgramStore, 7 методов, тесты 19 PASS) | | m04-metrics-engine | `Server.WatchBody.Core`: adherence, тоннаж, 1ПМ (Эпли), пульс-метрики, красные флаги | 2 | ✅ (2026-10-18: MetricsEngine + Safety, sync-пересчёт, тесты 17 PASS) | | m05-progression-rules | `Server.WatchBody.Core`: правила прогрессии (Ф-12.2), делоад (Ф-12.4), перерывы/возврат (Ф-14), учёт ограничений (is_active/замены), draft-версии `author=rules` | 2 | ✅ (2026-10-18: ProgressionRules + BreakEngine, фильтр ограничений, тесты Web 81/81 + Core 56/56) | | m06-fit-import | `Server.WatchBody.Import` + `--mode import`: FitParser (FIT SDK) → workout-facts/1, сопоставление ±15 мин, дедуп fit_file_id, пакет программы, TCX/GPX, архив | 2 | ✅ (2026-10-18: Garmin.FIT.Sdk 21.218.0, FitParser/WorkoutImporter/ProgramPackageImporter/ImportService, тесты Web 93/93 + Core 56/56, psql 123/123) | | m07-fit-fetch | `Server.WatchBody.Fetch` + `--mode fetch`: GarminClient (SSO по контракту garminconnect), FitFetcher (дедуп 2 рубежей), разбор конвейером m06 | 2 | ✅ (2026-10-18: SSO-флоу + FakeGarminHandler, тесты Web 98/98 + Core 56/56; против живого Garmin — ручная валидация прототипа, fallback — m06) | | m08-admin-web | Admin-консоль: UI — Flutter Web (`3-app\3-web\admin-web`), бэкенд — admin REST API (`/api/admin/*`) в `Server.WatchBody.Web`: логин/PBKDF2→Bearer, атлеты, тренировки+CSV, программы, метрики, план/факт | 3 | ✅ (2026-10-19: Bearer-контур + 6 контроллеров + Flutter UI (SDK 3.47.7, build → wwwroot/admin), тесты Web 105/105 + Core 56/56, HTTP-смок пройден) | | m09-phone-core | `WorkoutCore` + `LocalDb` (Room) + `SyncQueue`: тренировка, дневник, допуск, перерывы | 4 | ✅ (2026-10-19: Room 9 таблиц + WorkoutCore + SyncWorker/ApiClient + DataStore; APK 4,2 МБ, unit 18/18; смок sync 5 сущностей против живого сервера пройден, errata client_guid-UUID + guid-колонки daily_log/profile) | | m10-phone-ui | `TrainingUi` (Compose): экраны тренировки/истории/программ/профиля/дневника/допуска | 4 | ✅ (2026-10-19: 8 экранов+VM, Compose Material 3 тёмная, unit 36/36, APK 12 МБ, живой смок контура программы; errata контрактов camelCase/flat program_version/sex m-f; запуск на устройстве — приёмка владельца) | | m11-voice-input | `VoiceInput`: Vosk-STT, грамматика, TTS, журнал команд | 5 | ✅ (2026-10-19: парсер Ф-1.2 + VoskEngine с грамматикой/fallback + ModelStore (filesDir, не в APK) + executor через WorkoutCore 🛡 + TTS/сигналы + Mic-кнопка/RECORD_AUDIO + блок настроек; unit 63/63, APK 57 МБ; живой URL модели 200 OK; распознавание на устройстве — приёмка владельца, КУ-1 вручную) | | m12-watch-channel | `WatchChannel`: live-пульс с Fenix 6X на телефон — errata ОВ-3 (2026-10-19): companion-канал Connect IQ нереализуем на fenix 6X (CIQ ≤ 4.1.7, Communications в полях данных — с API 5.0); транспорт — штатная трансляция «Broadcast Heart Rate», приём BLE Heart Rate Service (односторонний); таймер отдыха на часах автономный (Ф-2.4 errata) | 5 | ✅ (2026-10-19: гейты 1.3/2.4/3.4 утверждены; errata ОВ-3 — транспорт BLE «Broadcast Heart Rate» за интерфейсом `WatchTransport` (мультичасовая инфраструктура, указание владельца); пульс/заряд/статус на «Тренировке», «Взять с часов» на допуске, `avg_hr` при финише → sync; unit 89/89 (m12 +26), APK 57,3 МБ; волна errata НД внесена (Ф-2.4/Ф-3.2/tech-req/architecture); живой BLE/разрешения — приёмка владельца; коммит `d4867ac` запушен) | | m13-fenix-data-field | `FenixDataField` (Monkey C): пульс/зоны/автономный таймер отдыха; мультитаргет-сборка по моделям/разрешениям (vision 1.1, Ф-2.8; якорь fenix6x 280×280 — сборка под другие часы не должна усложняться, указание владельца 2026-10-19) | 5 | ✅ 2026-10-19 (гейты 1.3/2.4/3.4 утверждены; сборки fenix6xpro+fenix6+fenix6s без правок кода; тесты ядра 54/54 собственным раннером в симуляторе — harness monkeydo /t несовместим с девайс-паком, readme прим. 5; developer-ключ RSA 4096; интерактивный смок и sideload — приёмка владельца, readme «Sideload») | Прототипы чек-листа шага 7 (tech-requirements разд. 7) выполняются в своих итерациях; ОВ-3 (companion-канал) — прототип в итерации 1 параллельно m01–m03 (нужен для ранней проверки канала). ## Состав версий (vision 2.2–2.4, решения опросников) - **v1.0:** полный MVP-цикл (Ф-1–Ф-9) + программы без LLM (Ф-10, Ф-11, правила прогрессии), Ф-13 (MVP-состав документа метрик: дневник АД/вес/ пульс покоя/самочувствие, допуск, RPE/боль в колене, правила 1–6) и Ф-14 (перерывы, vision 2.2). Платформы: Android (Kotlin), Fenix 6X (Monkey C, поле данных; изменение vision 1.5), сервер C#/.NET 10 + PostgreSQL. - **v2:** LLM-планирование (еженедельно), wake-word, iOS, экспорт FIT, программы на часы (FIT workout). - **v2.x:** мезоциклы LLM, «генератор+ревьюер», опрос RPE, аналитика. - **v3+:** трековые виды спорта (бег/вело).