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

57 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Спецификация: красные флаги (red_flags)
> v1 — документ метрик, правила 1 и 6; пороги — `MetricsConfig`
> ([01-metrics-config.md](01-metrics-config.md)). Выход — массив
> объектов в `workout_metrics.red_flags` (jsonb).
## 1. Формат
```json
"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).