VEU.WathBody/3-app
virus-home 2f8c6095a7 m13-fenix-data-field (итерация 5, последний модуль v1): поле данных Connect IQ «Феникс» для профиля «Силовая» Fenix 6X — errata Ф-2.3/Ф-2.1 (утв. гейт 1.3): события Strength Set в CIQ API нет ни в одной версии → подход = Lap→Lap (onTimerLap), «время подхода» = с последнего Lap; ядро Monkey C (source/): ZoneCalc (зоны 50/70/85 % целочисленно в масштабе ×10, Танака 2080−7×age / ручной hrMaxBpm), SetTracker (среднее интервала с null-пропуском, округление к ближайшему без Float), RestTimer (старт по Lap, окончание — ровно один сигнал), Vibe (конец отдыха лёгкая / красная двойная, гистерезис 60 с, safeVibrate Ф-2.8), Format (mmss целочисленно), FieldSettings (properties restSec 30–600/hrMaxBpm 0–250/age 14–100 с клампами, getApp null-safe); экран — параметрический (без фиксированных координат: плашка зоны цвет+подпись, пульс FONT_NUMBER_THAI_HOT→MEDIUM адаптивно, строка ПОДХОД/ОТДЫХ mm:ss·ср N, прочерки), ru/en ресурсы, иконка 40×40; тесты: штатный harness monkeydo /t несовместим с девайс-паком docker в симуляторе (Unexpected Type Error у любого тестового prg, проверено минимальным проектом) → собственный раннер test-source/ (watch-app TestEntry + CoreChecks, в release не попадает — base.sourcePath задан явно): 54/54 в симуляторе fenix6xpro, раннер поймал 3 бага ядра (шкала порогов зон, слагаемое округления avgBpm, конкатенация mmss) — исправлены; тулчейн: SDK 4.2.2 (Wayback) + девайс-паки из docker 4.1.7 → %APPDATA% (таргет fenix6xpro), developer-ключ ОБЯЗАН быть RSA-4096 PKCS#8 DER (2048 молча отвергался прошивкой — Signature check failed, подтверждено сэмплем Garmin); мультитаргет-инвариант: fenix6 260×260 + fenix6s 240×240 собираются только заменой iq:product, правок кода 0; симулятор 4.2.2 не хостит поля данных → интерактивный смок (спека 03 §5) и sideload (Developer Mode → USB → GARMIN\APPS\DataField) — приёмка владельца, инструкция в readme; Monkey C-ловушки зафиксированы (строки == по ссылке, число+строка не склеивается, dc.setFont нет на API 3.x — justification 5-м аргументом); errata НД внесена после гейта 1.3: requirements Ф-2.1/Ф-2.3, tech-req 7п.1; plan.md m13 ✅ — все 13 модулей v1 завершены 2026-10-19 17:56:34 +05:00
..
1-lib Этап 7: итерации 1–2 — m01–m05 серверной части + обе волны ревью 2026-10-18 (З-35…З-42) 2026-10-18 20:11:40 +05:00
2-cli Этап 7, итерация 3 завершена: m08-admin-web (консоль владельца) 2026-10-19 01:31:45 +05:00
3-web/admin-web Этап 7, итерация 3 завершена: m08-admin-web (консоль владельца) 2026-10-19 01:31:45 +05:00
4-phone/Phone.WatchBody m12-watch-channel (итерация 5): live-пульс с Fenix 6X — errata ОВ-3: companion-канал Connect IQ нереализуем на fenix 6X (CIQ ≤4.1.7, Communications в полях данных с API 5.0), транспорт = штатная трансляция «Broadcast Heart Rate» (BLE Heart Rate Service, односторонний, без GCM/ANT-железа) за интерфейсом WatchTransport — мультичасовая инфраструктура (указание владельца: любые часы со стандартной трансляцией, CIQ 5+/ANT+ — будущие реализации); таймер отдыха на часах автономный (Ф-2.4 errata, настройка поля, умолчание Rest.DefaultSec); ядро: HrBleClient (скан 0x180D→indications 0x2A37, оба поколения GATT-колбэков, батарея 0x180F опц., автопереподключение 1/5/30 с) + HrPacketParser + HrSampleStore + фасад WatchChannel (статусы/avgHr/freshHr/series, в БД не пишет) + WatchFormat + DeviceScanner; UI: статус-строка и блок пульса 44sp+зона+Canvas-линия последнего подхода на «Тренировке», finishWorkout(avgHr)→sync avg_hr, «Взять с часов» (≤30 с) на «Допуске», блок «Часы» (скан 15 с/выбор/забыть/инструкция) в «Настройках», 5 BLE-разрешений; unit 89/89 (m12 +26), APK 57,3 МБ; errata НД: requirements Ф-2.4/Ф-3.2/ОВ-реестр№3, tech-req 3п.3+7п.1, architecture 1.1/1.2/3/1.4; BLE на устройстве — приёмка владельца 2026-10-19 14:08:54 +05:00
5-watch/FenixDataField m13-fenix-data-field (итерация 5, последний модуль v1): поле данных Connect IQ «Феникс» для профиля «Силовая» Fenix 6X — errata Ф-2.3/Ф-2.1 (утв. гейт 1.3): события Strength Set в CIQ API нет ни в одной версии → подход = Lap→Lap (onTimerLap), «время подхода» = с последнего Lap; ядро Monkey C (source/): ZoneCalc (зоны 50/70/85 % целочисленно в масштабе ×10, Танака 2080−7×age / ручной hrMaxBpm), SetTracker (среднее интервала с null-пропуском, округление к ближайшему без Float), RestTimer (старт по Lap, окончание — ровно один сигнал), Vibe (конец отдыха лёгкая / красная двойная, гистерезис 60 с, safeVibrate Ф-2.8), Format (mmss целочисленно), FieldSettings (properties restSec 30–600/hrMaxBpm 0–250/age 14–100 с клампами, getApp null-safe); экран — параметрический (без фиксированных координат: плашка зоны цвет+подпись, пульс FONT_NUMBER_THAI_HOT→MEDIUM адаптивно, строка ПОДХОД/ОТДЫХ mm:ss·ср N, прочерки), ru/en ресурсы, иконка 40×40; тесты: штатный harness monkeydo /t несовместим с девайс-паком docker в симуляторе (Unexpected Type Error у любого тестового prg, проверено минимальным проектом) → собственный раннер test-source/ (watch-app TestEntry + CoreChecks, в release не попадает — base.sourcePath задан явно): 54/54 в симуляторе fenix6xpro, раннер поймал 3 бага ядра (шкала порогов зон, слагаемое округления avgBpm, конкатенация mmss) — исправлены; тулчейн: SDK 4.2.2 (Wayback) + девайс-паки из docker 4.1.7 → %APPDATA% (таргет fenix6xpro), developer-ключ ОБЯЗАН быть RSA-4096 PKCS#8 DER (2048 молча отвергался прошивкой — Signature check failed, подтверждено сэмплем Garmin); мультитаргет-инвариант: fenix6 260×260 + fenix6s 240×240 собираются только заменой iq:product, правок кода 0; симулятор 4.2.2 не хостит поля данных → интерактивный смок (спека 03 §5) и sideload (Developer Mode → USB → GARMIN\APPS\DataField) — приёмка владельца, инструкция в readme; Monkey C-ловушки зафиксированы (строки == по ссылке, число+строка не склеивается, dc.setFont нет на API 3.x — justification 5-м аргументом); errata НД внесена после гейта 1.3: requirements Ф-2.1/Ф-2.3, tech-req 7п.1; plan.md m13 ✅ — все 13 модулей v1 завершены 2026-10-19 17:56:34 +05:00