Аварийные средства и circuit breakers
Что это
Аварийные средства — это стоп-механизм, который остановить проще, чем возобновить.
Остановка не требует approval; возобновление требует. Управление включено по умолчанию:
emergency_controls_enabled: true в
config/platform.yaml. Всё состояние хранится одной
глобальной записью в изолированном хранилище ops/platform.sqlite с хэш-цепочкой событий и
идемпотентными квитанциями. Источник:
src/raytsystem/emergency/service.py.
Когда использовать
Когда нужно немедленно затормозить рантайм, сеть, egress к провайдерам, выдачу задач или сессии — по подозрению на нештатное или враждебное поведение. Проверить текущее состояние можно в любой момент:
uv run raytsystem emergency status --json
Ответ показывает state (ready или blocked), список активных действий и состояние
breaker-ов. Если хранилище недоступно, снимок деградирует в unavailable, и рантайм-гейт
трактует это как блокировку (fail closed).
Предварительные условия
emergency_controls_enabled: true. При отключённом флаге любая операция подсистемы завершается ошибкой.- Для возобновления — свежий точечный approval (см.
approvals.md).
Пошагово
- Активируйте нужные типовые действия. Активация требует только локальной аварийной
полномочности и причины — approval не нужен. Доступные действия (
EmergencyAction):pause_all_employees,cancel_active_runs,disable_runtime_execution,disable_network_adapters,disable_external_providers,freeze_task_checkout,revoke_runtime_sessions,revoke_pending_approvals,emergency_budget_stop. Активация объединяет запрошенные действия с уже активными и сохраняет отметку времени по каждому. - Гейты на местах сверяются с состоянием: старт рантайма, сетевые адаптеры, egress к
провайдерам, выдача задач и гранты runtime-сессий.
revoke_pending_approvalsинвалидирует approvals, выданные до момента активации. - Для возврата вызовите
recoverс точечным approval (recover_emergency, scopeemergency_recovery), привязанным по хэшу к снимаемым действиям и причине. Можно снять подмножество — остальное остаётся активным.
Circuit breakers
Breaker-ы работают по порогам из
config/platform.yaml (секция circuit_breakers).
Ключевое свойство — защёлкивание (latching): открытый breaker закрывается только новым
точечным approval.
- Открытие любого breaker автоматически активирует
disable_runtime_execution. - Security-триггеры (
protected_path,forbidden_egress,policy_violations,failed_approvals) не имеют автоматического восстановления вообще. Остальные получают ровно одну ограниченную HALF_OPEN-попытку, после чего остаются открытыми. - Закрыть breaker вручную (единственный путь для security-триггеров) можно только со свежим
approval
close_circuit_breaker(scopeemergency_recovery):
uv run raytsystem emergency close-breaker <breaker_id> --approval-id <id> --reason "..."
Восстановление рантайма отклоняется, пока хоть один security-breaker открыт.
Ожидаемый результат
Остановка — одна локальная команда. Возобновление требует записанной человеческой полномочности. Автоматическое восстановление не может «мигать»: одна попытка на открытие, а security-срабатывания не самовосстанавливаются.
Ограничения и безопасность
- Реальное исполнение рантайма всё равно выключено по умолчанию
(
runtime_execution_enabled: false) — аварийные гейты добавляют защиту поверх этого. - Состояние глобальное по замыслу: точечные (по сотруднику/адаптеру) состояния и
авто-истечение по времени пока отложены. Источник:
ops/decisions/ADR-024-emergency-controls-and-circuit-breakers.md. - При нечитаемом хранилище каждый гейт закрывается наглухо.
Частые ошибки
- Ожидать, что breaker закроется сам: security-breaker закрывается только через
close-breakerсо свежим approval. - Пытаться восстановить рантайм при открытом security-breaker — операция будет отклонена.
Связанные страницы
overview.mdapprovals.mddefaults.md
Источники истины
src/raytsystem/emergency/service.pyops/decisions/ADR-024-emergency-controls-and-circuit-breakers.mdconfig/platform.yaml