---
name: safety-invariants-welding
version: 0.3.0
description: >
  Неприкасаемые safety-инварианты для изменений, затрагивающих безопасное состояние, `TIM1`, `BKIN/BKIN2`,
  `STO`, вторичный путь запрета, watchdog, машину состояний и валидность измерений.
  Использовать, когда нужно доказать сохранение аппаратного пути отключения и запрета “варки вслепую”;
  не использовать как общий skill для косметических правок или правок только в документации.
tags: ["safety","invariants","tim1","bkin","watchdog","welding","freertos"]
project_context: "docs/PROJECT_CONTEXT.md"
glossary: "docs/GLOSSARY.md"
when_to_use:
  - "любые изменения в управлении TIM1, BKIN/BKIN2, `STO`, вторичном пути запрета, fault-логике, watchdog"
  - "изменения в машине состояний, разрешении сварки, восстановлении после fault"
  - "изменения в таймаутах связи с ТК и обработке ошибок измерений"
outputs:
  - "Список затронутых инвариантов + доказательство сохранения (тесты/измерения) + fault-injection"
---

# Skill: Safety-инварианты (неприкасаемые) — сварочный источник

## Источники правды
- `docs/PROJECT_CONTEXT.md` и `docs/GLOSSARY.md` имеют приоритет.
- `docs/SAFETY.md` задаёт политику безопасности, а `docs/SAFETY_FUNCTIONS.md` помогает быстро проверить, какие защитные функции уже действуют, чем детектируются и где искать доказательства.
- Если нужна новая политика safety — сначала предложи правку документов, затем код.

## Миссия
Не допустить изменений, которые могут привести к опасному поведению:
самовключение, неконтролируемая генерация тока, зависимость отключения от RTOS/ISR,
или работа без валидных измерений/команд.

## Инварианты (MUST NOT BREAK)
I1) **Аппаратный путь отключения обязателен**
- Критические аварии должны выключать силовую часть аппаратно через TIM1 BKIN/BKIN2 (или эквивалентный hardware path).
- Отключение не должно зависеть от RTOS, задач, обычных ISR или обмена.

I2) **Независимый путь запрета трактуется честно**
- Базовый аппаратный путь запрета проекта задаётся через `STO`; его нельзя подменять расплывчатой формулой “любой путь отключения”.
- Если по `docs/HW_IO_MAP.md` подтверждён `SKYPER_ERRIN`, он рассматривается только как вторичный путь запрета и не заменяет базовый путь `STO`.

I3) **Нет автоматического рестарта после критической аварии**
- Критические faults должны быть защёлкнуты (latch) до явного восстановления.
- Запрещено “само восстановилось и снова варит” без явной политики recovery.

I4) **Watchdog приводит к безопасному состоянию**
- Зависание МК/RTOS не должно оставлять силовую часть включенной.
- Срабатывание внешнего/внутреннего watchdog должно приводить к аппаратному выключению; базовый путь отключения по watchdog = `CBM706T WDO -> STO`.

I5) **Потеря связи с ТК ⇒ останов**
- При потере команд/невалидных командах (по политике проекта) устройство должно перейти в безопасное состояние/controlled stop.
- Нельзя продолжать сварку при отсутствии актуальной команды.

I6) **Невалидные измерения ⇒ запрет сварки**
- При устойчивом отказе измерений (timeout/stuck/sat/CRC) сварка должна быть запрещена.
- Нельзя “варить вслепую”.

I7) **Overrun критических циклов ⇒ определённое безопасное поведение**
- Если шаг управления/1 мс цикл не укладывается — controlled stop или fault (по политике).
- Нельзя продолжать управление с потерей детерминизма без реакции.

## Контракт ответа (что ты обязан выдать)
При любом изменении, затрагивающем safety:
1) Какие инварианты затронуты (I1..I7).
2) Почему инвариант сохраняется (логика + ссылки на конкретные места кода/регистры/пины).
3) План доказательств:
   - минимум 3 on-target измерения (GPIO/осциллограф/trace),
   - минимум 5 fault-injection сценариев.
4) Критерии приёмки (в микросекундах/миллисекундах, где уместно).
5) Что будет при восстановлении: кто, когда и чем снимает latch.

## Запрещено
- “Должно работать” без измерений задержки отключения (например `BKIN_RAW -> PWM_OUT`).
- Убирать или ослаблять `BKIN` либо базовый путь запрета `STO` ради удобства.
- Включать авто-выход из fault без явных правил.
