Kill Switch для AI-агентів: як аварійно зупинити дії без релізу

Практичний kill switch у production: global/per-tenant stop, writes disable mode, stop reasons, audit trail і короткий runbook.
На цій сторінці
  1. Ідея за 30 секунд
  2. Проблема
  3. Рішення
  4. Kill switch ≠ повна governance-система
  5. Контур kill-switch контролю
  6. Як це виглядає в архітектурі
  7. Приклад
  8. У коді це виглядає так
  9. Як це виглядає під час виконання
  10. Сценарій 1: global stop
  11. Сценарій 2: tenant stop
  12. Сценарій 3: writes disabled
  13. Типові помилки
  14. Самоперевірка
  15. FAQ
  16. Де Kill Switch у загальній системі
  17. Пов'язані сторінки

Ідея за 30 секунд

Kill switch — це аварійний контроль у runtime, який дозволяє миттєво зупинити нові дії агента під час інциденту, без релізу і без зміни prompt.

Коли це потрібно:
коли агент може виконувати write-дії, працює з зовнішніми API і помилка вже переростає в production-інцидент.

Проблема

Коли агент починає робити шкідливі дії, часу на "підкрутити prompt і зробити реліз" зазвичай немає. Поки команда аналізує проблему, агент може продовжувати робити ті самі дії. І кожна хвилина затримки — це нові побічні ефекти в production.

Типова картина:

  • дублікати листів або повідомлень
  • масові create/update операції
  • зайві виклики зовнішніх API

Аналогія: це як аварійна кнопка на виробничій лінії. Під час збою спочатку треба зупинити рух, а вже потім розбирати причину.

Якщо kill switch працює тільки в UI, це не аварійний контроль. Реальна зупинка має відбуватись у runtime loop і в tool gateway.

Рішення

Рішення — додати централізований kill-switch policy layer, який перевіряється після формування наступної дії агента, але перед її виконанням. Policy повертає allow або stop з явною причиною: killed_global, killed_tenant, writes_disabled, tool_disabled.

Базова модель:

  • global kill — аварійно зупиняє всіх
  • tenant kill — зупиняє конкретного клієнта
  • writes disabled — дозволяє read, блокує write
  • tool disabled — точково блокує конкретний інструмент

Це окремий аварійний рівень керування, а не частина промпта чи UI-логіки.

Kill switch ≠ повна governance-система

Kill switch і governance вирішують різні задачі:

  • Kill switch зупиняє інцидент "тут і зараз"
  • Governance керує поведінкою агента постійно (RBAC, ліміти, бюджети, approval)

Одне без іншого не працює добре:

  • без kill switch інцидент складно зупинити миттєво
  • без governance інциденти трапляються надто часто

Контур kill-switch контролю

Ці перевірки працюють разом як аварійний контур у runtime.

КомпонентЩо контролюєКлючові механікиНавіщо
Global stopЗупинку всіх run-івglobal_kill=true
stop before next action
Швидко зупиняє масовий інцидент
Tenant stopЗупинку в межах одного tenanttenant_kill=true
tenant-scoped flag
Локалізує проблему без глобального outage
Writes disabled modeБлокування write-дійwrite tool policy
read-only fallback
Дозволяє безпечну деградацію замість повної зупинки
Tool disable listТочкове блокування інструментаtool_disabled[]
incident mode rules
Вимикає проблемний інструмент без зупинки всього run
Operator observabilityПрозорість дій оператора і блокуваньaudit logs
actor + reason + scope
Дозволяє пояснити, хто і чому активував stop

Як це виглядає в архітектурі

Kill switch policy layer стоїть у runtime loop між плануванням і виконанням наступної дії агента. Кожне рішення (allow або stop) фіксується в audit log.

Кожен крок проходить через цей flow перед виконанням: runtime не виконує дії напряму, а передає рішення policy layer.

Коротко по flow:

  • Runtime формує наступну дію
  • Policy читає global/tenant flags + writes/tool rules
  • allow -> виконується наступна дія агента
  • stop -> run зупиняється з явним reason (killed_global, killed_tenant, writes_disabled, tool_disabled)
  • рішення пишеться в audit log

Приклад

Агент підтримки почав масово відправляти email.send через помилковий сценарій. Оператор вмикає writes_disabled для конкретного tenant.

Результат:

  • нові write-дії блокуються одразу
  • read-дії можуть лишатися доступними
  • у логах є who/when/why для кожного блокування

Kill switch зупиняє інцидент прямо в runtime loop, а не чекає нового релізу.

У коді це виглядає так

У спрощеній схемі показано основний flow. На практиці kill state читається централізовано і кешується на секунди. Критично: kill-check має бути O(1) і працювати з коротким кешем (1-2 секунди), інакше аварійна зупинка спрацьовує із запізненням. У production той самий kill-check зазвичай дублюють у tool gateway, щоб жоден виклик не міг обійти runtime-контроль.

Приклад kill-switch конфігурації:

YAML
kill_switch:
  global_flag: agent_kill_global
  tenant_flag_prefix: "agent_kill_tenant:"
  writes_disabled_default: false
  disabled_tools_key: agent_disabled_tools
  cache_ttl_seconds: 2
PYTHON
while True:
    action = planner.next(state)
    action_key = make_action_key(action.name, action.args)  # стабільний ключ для dedupe/audit

    kill_state = kill_store.read(tenant_id=state.tenant_id)
    decision = kill_policy.check(kill_state, action)

    if decision.outcome == "stop":
        audit.log(
            run_id,
            decision=decision.outcome,
            reason=decision.reason,
            scope=decision.scope,
            action=action.name,
            action_key=action_key,
            actor=kill_state.last_updated_by,
        )
        return stop(decision.reason)

    result = tool.execute(action.args)

    audit.log(
        run_id,
        decision=decision.outcome,
        reason=decision.reason,
        scope=decision.scope,
        action=action.name,
        action_key=action_key,
        result=result.status,
    )

    if result.final:
        return result

Kill switch зупиняє нові дії. Для in-flight дій зазвичай потрібен окремий best-effort cancel механізм.

Як це виглядає під час виконання

Сценарій 1: global stop

  1. Оператор активує global_kill=true.
  2. Runtime формує наступну дію і читає kill state.
  3. Policy повертає stop (reason=killed_global).
  4. Нові дії не виконуються.
  5. У логах є scope=global і actor.

Сценарій 2: tenant stop

  1. Для tenant t_42 активують tenant_kill=true.
  2. Run-и цього tenant отримують stop (reason=killed_tenant).
  3. Інші tenant продовжують працювати.
  4. Інцидент локалізовано без глобальної зупинки.

Сценарій 3: writes disabled

  1. Активовано writes_disabled=true.
  2. Read-дія проходить з allow.
  3. Write-дія отримує stop (reason=writes_disabled).
  4. Система переходить у read-only degrade mode.

Типові помилки

  • kill switch тільки в UI, але не в runtime/tool gateway
  • один глобальний stop без per-tenant режиму
  • відсутній writes-disabled режим
  • довгий cache TTL (хвилини замість секунд)
  • відсутній audit trail для operator actions
  • відсутній перевірений incident runbook

У результаті команда має "кнопку", але не має реального аварійного керування.

Самоперевірка

Швидка перевірка kill switch перед запуском у production:

Прогрес: 0/8

⚠ Бракує базового governance-контролю

Перед production потрібні мінімум: контроль доступу, ліміти, audit logs і аварійна зупинка.

FAQ

Q: Що вмикати першим: global stop чи writes disabled?
A: Почни з writes_disabled, якщо інцидент у write-діях. global_kill використовуй, коли ризик широкого збою і потрібна миттєва повна зупинка.

Q: Де саме перевіряти kill switch?
A: Мінімум у двох місцях: у runtime loop перед наступною дією і в tool gateway перед виконанням інструмента.

Q: Чи можна кешувати kill state?
A: Так, але коротко (секунди). Під час інциденту хвилинний кеш робить kill switch майже марним.

Q: Як технічно реалізувати kill flags?
A: Зазвичай це глобальні й tenant-scoped прапорці в Redis/конфіг-сховищі, які policy layer читає перед кожною дією.

Q: Kill switch скасовує вже запущені дії?
A: Не завжди. Він надійно блокує нові дії. Для in-flight задач потрібен окремий best-effort cancel механізм.

Q: Чи може kill switch замінити RBAC і бюджети?
A: Ні. Kill switch — аварійний stop-механізм. RBAC, ліміти й бюджети потрібні як постійний контроль.

Де Kill Switch у загальній системі

Kill switch — це аварійний рівень Agent Governance. Разом із RBAC, бюджетами, approval і audit він формує повну production-систему контролю.

Пов'язані сторінки

Далі за темою:

⏱️ 6 хв читанняОновлено 27 березня 2026 р.Складність: ★★★
Реалізувати в OnceOnly
Budgets + permissions you can enforce at the boundary.
Використати в OnceOnly
# onceonly guardrails (concept)
version: 1
budgets:
  max_steps: 25
  max_tool_calls: 12
  max_seconds: 60
  max_usd: 1.00
policy:
  tool_allowlist:
    - search.read
    - http.get
writes:
  require_approval: true
  idempotency: true
controls:
  kill_switch: { enabled: true }
Інтегровано: продакшен-контрольOnceOnly
Додай guardrails до агентів з tool-calling
Зашип цей патерн з governance:
  • Бюджетами (кроки / ліміти витрат)
  • Дозволами на інструменти (allowlist / blocklist)
  • Kill switch та аварійна зупинка
  • Ідемпотентність і dedupe
  • Audit logs та трасування
Інтегрована згадка: OnceOnly — контрольний шар для продакшен агент-систем.

Автор

Микола — інженер, який будує інфраструктуру для продакшн AI-агентів.

Фокус: патерни агентів, режими відмов, контроль рантайму та надійність систем.

🔗 GitHub: https://github.com/mykolademyanov


Редакційна примітка

Ця документація підготовлена з допомогою AI, із людською редакторською відповідальністю за точність, ясність і продакшн-релевантність.

Контент базується на реальних відмовах, постмортемах та операційних інцидентах у розгорнутих AI-агентних системах.