Policy as Code for Agents в 2026: когда правила должны жить в коде, а не только в prompt

Policy as code for agents в 2026: machine-enforced rules для tool calls, approvals, routing и output validation вместо одних текстовых инструкций.

Policy as code for agents в 2026 нужна потому, что текстовые инструкции полезны, но слабы там, где системе нужно обязательное, воспроизводимое и проверяемое ограничение. Как только речь заходит о tool permissions, approvals, output contracts, data access или unsafe side effects, policy должна перестать быть только prose и стать machine-enforced rule.

Иначе команда получает знакомую проблему: prompt говорит одно, а реальный runtime по факту всё ещё может сделать другое.

Policy as code означает, что важные правила формулируются не только словами для модели, но и как проверяемые условия в системе. Например, "нельзя отправлять внешнее письмо без approval" должно быть не рекомендацией в prompt, а правилом, которое код реально умеет заблокировать.
Самый опасный anti-pattern - считать system prompt единственным policy layer. Он может направлять поведение, но не даёт жёсткой гарантии для risky actions, tenant boundaries, approvals и output handling.

Короткая версия

Policy as code в 2026 особенно нужна для:

  1. Tool permissions
  2. Approval requirements
  3. Routing restrictions
  4. Output/schema validation
  5. Tenant and data access boundaries

Что особенно важно

  • policy должна жить рядом с runtime checks;
  • high-risk rules должны быть deny-by-default;
  • policy changes должны быть versioned и observable;
  • prompt policy и enforced policy должны быть согласованы, но не подменять друг друга.
Без техники
В system prompt написано: `не отправляй внешние письма без подтверждения`.
С техникой
Runtime policy проверяет `send_external_email` и блокирует вызов без approval token. Prompt помогает модели, но enforce делает код.
ПромптPolicy intuition
Где лучше задавать правило `refund > $100 требует approval`: в prompt или в code?
Ответ модели

В production правило должно быть и в prompt, и в code, но именно code должен быть authoritative enforcement layer. Иначе risky path остаётся на уровне надежды.

1. Prompt policy и runtime policy решают разные задачи

Полезно развести:

Prompt policy

  • направляет reasoning;
  • объясняет intent системы;
  • помогает модели выбирать корректное поведение.

Runtime policy

  • блокирует нежелательные действия;
  • проверяет контракты;
  • требует approval;
  • ограничивает доступ;
  • пишет audit trail.

Они должны дополнять друг друга, но authoritative layer для risky behavior почти всегда должен быть runtime.

2. Что особенно хорошо ложится в policy as code

Tool permissions

Можно ли вызывать конкретный tool в этом route/tenant/run.

Approval gates

Какие действия требуют human token.

Output handling

Можно ли принять этот JSON, отправить email, отдать ответ пользователю.

Data access

Какие документы, tenants и секреты доступны агенту.

Routing restrictions

Какие модели, lanes и fallbacks допустимы.

Если нарушение правила может привести к деньгам, внешнему side effect, data leak или policy incident, правило должно быть enforceable кодом, а не только сформулировано словами.

3. Policy должна быть проверяемой и наблюдаемой

Хороший policy layer отвечает на вопросы:

  • какая версия правила сейчас активна;
  • какой rule triggered;
  • почему action был заблокирован или разрешён;
  • как policy менялась со временем.

Без этого policy-as-code быстро превращается в скрытый набор if/else без governance.

4. Deny-by-default особенно полезен для risky classes

Для dangerous actions полезно строить политику так:

  • по умолчанию запрещено;
  • разрешение выдаётся явно;
  • exception paths журналируются;
  • approval подтверждает override.

Так команда лучше контролирует blast radius и change risk.

5. Policy changes сами по себе являются production changes

Даже без деплоя новой модели policy change может:

  • расширить tool access;
  • снять approval;
  • изменить routing;
  • повысить exposure к данным;
  • увеличить false refusals.

Поэтому policy changes полезно сопровождать:

  • versioning;
  • staged rollout;
  • audit sample;
  • rollback path.

6. Что особенно часто ломают команды

Prompt-only governance

Правила существуют только в prose.

Hidden policy rules in business code

Никто не понимает, где именно enforced logic живёт.

No versioning

После incident непонятно, какое правило уже действовало.

No explainability

Оператор не видит, почему action был blocked.

Policy drift from prompt

Модельу говорится одно, а runtime разрешает другое.

7. Какие метрики полезны

Минимальный policy dashboard обычно включает:

  • policy block rate;
  • approval-trigger rate;
  • false block / false allow audits;
  • policy version rollout metrics;
  • incidents correlated with policy changes;
  • percent of critical actions covered by enforced rules.

Плюсы

  • Policy as code делает критичные ограничения enforceable и audit-able
  • Deny-by-default полезен для risky tools и side effects
  • Versioned policies проще откатывать и анализировать после инцидента
  • Снижает зависимость от одного prompt как fragile control layer

Минусы

  • Появляется дополнительный governance layer, который тоже надо сопровождать
  • Слишком жёсткие rules могут ухудшать UX и automation coverage
  • Без объяснимости policy blocks раздражают operators и developers
  • Prompt/runtime drift всё равно нужно специально отслеживать

Пример policy rule

rules:
  - id: refund_requires_approval
    when:
      action: issue_refund
      amount_gt: 100
    decision: require_approval

  - id: external_email_blocked_for_demo_tenant
    when:
      action: send_external_email
      tenant: demo
    decision: deny

Простой enforcement hook

def enforce_policy(action, context):
    if action.name == "issue_refund" and action.amount > 100 and not context.approval_token:
        return "deny"
    if action.name == "send_external_email" and context.tenant == "demo":
        return "deny"
    return "allow"

Практический совет: policy as code полезнее всего там, где она ограничивает не модель как таковую, а реальные последствия её решений. Именно этот слой превращает agent stack из "умного демо" в управляемую production-систему.

Проверьте себя

1. Почему policy as code нужна поверх prompt policy?

2. Что особенно хорошо подходит для policy as code?

3. Какой anti-pattern особенно вреден?