# Спецификация: конфигурация порогов Safety (MetricsConfig) > Источники: Ф-13.5 (Р3-А: пороги конфигурируемые, умолчания — > документ метрик), документ метрик п. 2.1–2.3, правила 1, 6. ## 1. Секция `Safety` в appsettings (json, camelCase) ```json "Safety": { "bpCancelSys": 150, // АД сист. → отмена (документ метрик п. 2.2) "bpCancelDias": 90, // АД диаст. → отмена "bpElevatedSys": 140, // нижняя граница коридора «только кардио» "bpElevatedDias": 95, // диаст. коридора "hrRestingRise": 8, // пульс покоя ≥ базовый +8 (правило 1) "hrRestingDays": 2, // …дней подряд "wellbeingLow": 2, // самочувствие ≤2 (правило 1) "wellbeingDays": 2, // …дней подряд "lightDayCount": 3, // 3+ дня → cancel_recommendation "kneePainMin": 1, // боль ≥1 (правило 6) "kneeRepeatSessions": 2, // …занятий подряд "hrBaselineDays": 14, // окно базового пульса покоя "hrBaselineMin": 3 // минимум значений для базового } ``` ## 2. Класс `Core\Metrics\MetricsConfig.cs` - свойства `int` с умолчаниями из таблицы выше; - `static MetricsConfig Load(JsonElement root)` — чтение секции `Safety` (отсутствует/частичная секция → умолчания по каждому полю; нечисловое значение → исключение с именем поля); - объект хранится в `ServerConfig` (поле `Safety`) и в DI как синглтон; валидация `ServerConfig.Validate` дополняется проверкой: `bpElevatedSys ≤ bpCancelSys`, все значения > 0, иначе ошибка валидации конфига (фатально). Коридоры диастолы по документу метрик перекрываются (отмена >90, «кардио» до 95) — проверка `bpElevatedDias ≤ bpCancelDias` не применяется. ## 3. Инвариант 🛡 Пороги читаются только из конфигурации; в расчётном коде числовые пороги не хардкодятся (Р3-А).