# Спецификация 01: проект Monkey C, манифест, таргеты, сборка Источники: module_reqs разд. 1 (единица 1, решения гейта 1.3 № 2/4), Ф-2.8, tech-req ОВ-7, указание владельца 2026-10-19 (мультитаргет). Единица 1 + 9 (сборка). ## 1. Структура проекта ``` 3-app\5-watch\FenixDataField\ manifest.xml — тип datafield, UUID, minApiVersion, продукты monkey.jungle — таргетная матрица (якорь fenix6x) resources\ layouts\layout.xml — параметрический макет (спека 03) strings\strings.xml — en (базовая) + ru (ПОДХОД/ОТДЫХ/зоны) settings\settings.xml — properties (спека 04) source\ FenixDataField.mc — класс поля: колбэки платформы, связка ядра и отрисовки (спека 03 §4) SetTracker.mc — ядро (спека 02) RestTimer.mc — ядро (спека 02) ZoneCalc.mc — ядро (спека 02) Vibe.mc — паттерны вибраций + гистерезис (спека 04) FieldSettings.mc — чтение/кламп properties (спека 04) test\ ZoneCalcTest.mc — (:test)-функции Toybox.Test (спека 02 §5) RestTimerTest.mc SetTrackerTest.mc bin\ — выход сборки (в .gitignore) ``` ## 2. Манифест - **тип** — data field (поле данных штатных активностей; элемент типа — по образцу SDK-сэмпла DataField; сверяется при установке SDK, шаг 3); - **UUID** — `34f470ff-b5d1-4141-ad06-c483fa79a1f8` (сгенерирован 2026-10-19, неизменен навсегда — идентификатор поля при обновлениях); - **minApiVersion 2.1.0** — самый низкий API из используемого (Toybox.Test; остальное — 1.0.0–1.3.0), поле совместимо и со старыми CIQ-устройствами (мультичасовая инфраструктура); - **products** — `fenix6x` (якорь 280×280, CIQ ≤ 4.1.7); добавление модели = строка продукта + при необходимости свой макет (семейство квадратных MIP покрывается параметрическим — правка кода не требуется); - **permissions** — не запрашиваются: пульс приходит в `compute(Activity.Info)`, вибрация — `Attention.vibrate`, сеть полю не нужна (Ф-2.7); - **языки** — en (базовая) + ru. Отображаемое имя поля — «Феникс» (ru) / «Phoenix» (en): под ним поле появляется в списке полей профиля «Силовая». ## 3. Сборка (решение 2 гейта 1.3 — toolchain) - Connect IQ SDK (актуальная 9.2) устанавливается агентом в `C:\tools\connectiq` по прецеденту m09; JDK 21 уже установлен (C:\tools\jdk-21.0.12.1+1); - сборка — CLI `monkeyc` по каждому таргету матрицы из `monkey.jungle`; выход — `.prg` в `bin\`; - тесты — прогон `(:test)`-функций инструментарием SDK (симулятор); точную команду фиксирует шаг 3 по установленному SDK (спеки фиксируют сами тест-кейсы, не команду); - смок в симуляторе — поле добавляется в профиль Strength, симулируются пульс/Lap (шаг 3); - подпись для устройства — developer-ключ (генерация по инструкции Garmin, шаг 3), sideload на Fenix 6X — developer mode + Garmin Connect Mobile (инструкция — readme модуля, шаг 4). Критерий готовности единицы: `monkeyc` собирает все таргеты матрицы без ошибок; предупреждения — только обоснованно подавленные. ## 4. Тесты (готовность сборки) 1. Сборка таргета fenix6x проходит без ошибок компиляции/линковки. 2. `.prg` появляется в `bin\`, размер разумный (< 200 КБ). 3. Добавление второго таргета в `monkey.jungle` (любая модель семейства квадратных MIP) собирается **без правок исходников** — проверка мультитаргет-инварианта (инвариант 5) на CI-сборке агента.