4.2 KiB
4.2 KiB
Спецификация: красные флаги (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).