VEU.WathBody/1-docs/4-modules/m04-metrics-engine/api_specs/03-red-flags.md

4.2 KiB
Raw Permalink Blame History

Спецификация: красные флаги (red_flags)

v1 — документ метрик, правила 1 и 6; пороги — MetricsConfig (01-metrics-config.md). Выход — массив объектов в workout_metrics.red_flags (jsonb).

1. Формат

"red_flags": [
  {"flag": "bp_over_150_90", "date": "2026-10-17"},
  {"flag": "hr_resting_up", "dates": ["2026-10-16", "2026-10-17"]}
]

Поле date(s) — даты, на которых условие выполнено; пороги в red_flags не дублируются. Порядок — как в таблице ниже; пусто → [].

2. Флаги

# flag Условие Данные
1 bp_over_150_90 у дня тренировки bp_sys > BpCancelSys или bp_dias > BpCancelDias daily_log дня тренировки (нет записи или нет АД → флага нет)
2 bp_elevated не сработал #1 И bp_sys ≥ BpElevatedSys или bp_dias ≥ BpElevatedDias там же
3 hr_resting_up hr_resting ≥ базовый + HrRestingRise в HrRestingDays дней, включая день тренировки, подряд (без дыр по календарю: сравниваются имеющиеся значения подряд идущих дат с записями) daily_log окна; базовый = среднее hr_resting за HrBaselineDays до первого дня серии, значений < HrBaselineMin → флаг не ставится
4 wellbeing_low wellbeing ≤ WellbeingLow в WellbeingDays дней подряд (как #3, без базового) daily_log окна
5 cancel_recommendation #3 или #4 держится ≥ LightDayCount дней подряд следствие #3/#4
6 knee_pain_repeat в KneeRepeatSessions последних занятиях подряд (текущая + предыдущая по started_at) есть подход группы «ноги» с knee_pain ≥ KneePainMin workout_set.knee_pain

Пояснения:

  • «группа ноги» — код группы упражнения == legs (справочник групп, m01).
  • Предыдущее занятие для #6 — ближайшая по started_at тренировка атлета раньше текущей (статус любой).
  • #3: серия считается по фактическим записям daily_log: идём от дня тренировки назад; каждая запись с условием продлевает серию, запись с hr_resting без условия её рвёт, день без записи её не рвёт (пропуск ввода не карается), но и не удлиняет.
  • #5: если серия #3/#4 ≥ LightDayCount — добавляется один флаг cancel_recommendation с общим списком дат.
  • Примечания (З-42 п. 6; поведение осознанное, тесты зелёные): (а) серия в ConditionRun ограничена lightDayCount датами — флаги #3/#4 (порог 2 дня) и #5 (порог 3 дня) это не искажает; (б) knee_pain_repeat — предыдущие тренировки строго до дня текущей (DateTo = дата − 1): две сессии в один день не считаются «двумя занятиями подряд».

3. Семантика потребителям

  • m05 (правила прогрессии) и телефон: hr_resting_up/wellbeing_low без #5 → следующая тренировка помечается лёгкой (60–70 % весов, 2 сета); с #5 → предложение отмены + совет к врачу (Ф-12.5).
  • knee_pain_repeat → предложение замены упражнения из пары-замены (Ф-12.5; атрибуты упражнения).
  • m04 только фиксирует флаги; никаких записей в план (🛡3).