Скрипт не должен превращать полётный контроллер в непрозрачный набор исключений. Programming Framework подходит для декларативных условий и действий, JavaScript — для логики, которую трудно выразить простой таблицей. Чем сложнее сценарий, тем важнее ограничить его полномочия и сделать состояние наблюдаемым.

Проведи границу ответственности
Оставь базовую стабилизацию, ARM, failsafe и критичные ограничения штатной прошивке. Скрипту передавай только функцию, которую можно отключить без потери ручного управления. Если отказ JavaScript способен остановить мотор или заблокировать takeover, архитектуру нужно пересмотреть.

Опиши конечный автомат
Вместо цепочки скрытых условий задай состояния: Idle, ArmedReady, Active, Degraded, Cancelled. Для каждого укажи разрешённые входы, переходы, таймаут и действие по умолчанию. Один вход не должен одновременно означать команду пилота и подтверждение датчика.
Контролируй данные
- проверяй диапазон, единицы и свежесть каждого значения;
- вводи hysteresis для шумного порога;
- ограничивай частоту действий и объём вычислений;
- не считай ноль универсальным признаком отсутствия данных;
- логируй причину перехода, а не только новое состояние.
Тестируй слой за слоем
- Проверь чистые вычисления на фиксированных входах.
- Подключи реальные переменные без выполнения действия.
- Имитируй границы, пропуск данных и перезапуск.
- Запусти в SITL и повтори сценарий несколько раз.
- На аппаратном стенде оставь выходы безопасными.
- В полёте начни с наблюдения и ручного takeover.
Подготовь откат
Версионируй скрипт вместе с совместимой версией INAV и конфигурацией. Сохрани рабочий backup без сценария и отдельный переключатель отключения функции. После обновления прошивки запускай полный набор тестов: API и доступные действия могут меняться.
Профессиональный сценарий объясним по логу: видно входы, состояние, решение и результат. Если причину срабатывания можно восстановить только чтением кода после аварии, наблюдаемости недостаточно.
Рецензируй как лётную конфигурацию
Перед выпуском другой человек должен по описанию перечислить все состояния, переходы и ручной выход, а затем воспроизвести тесты без подсказок автора. Проверяй несовместимые одновременные условия и порядок загрузки. Если небольшая правка JavaScript требует нового допущения о безопасности, обнови документацию и повтори всю лестницу, начиная с SITL.
История изменений должна связывать версию сценария с конкретным набором проверок и логов.