Guardrails & Policies — слой управляемых ограничений AI-системы. Policy определяет, что разрешено, запрещено или требует дополнительных условий. Guardrail превращает это правило в реальный enforcement point: блокирует, преобразует, ограничивает, отправляет на approval или разрешает операцию.
№45 Verification проверяет correctness конкретного результата; №48 решает, допустим ли action/output по policy. №47 Evals измеряет, работают ли guardrails на наборе кейсов. №49 HITL реализует human approval/handoff, когда policy требует человека. №51 Permissions & Secrets задаёт технические scopes/credentials; policy может сузить permission, но не расширить. №52 Security описывает threat model и обход границ; №48 — общий enforcement framework.
Prerequisites: №12 Tools, №41 Executive Architecture, №42 Events, №45 Verification, №46 Observability, №47 Evals. Forward references: №49 approval/HITL, №50 contracts, №51 permissions/secrets, №52 injection/security, №53 sandbox, №76 privacy/governance.
REQUEST-TIME: YES — input/output/tool gates. CONTROL PLANE: YES — policy registry, versions, deployment, shadow/canary. DATA PLANE: YES — enforcement на data/tool boundaries. OFFLINE: YES — tests, evals, incident regression, policy analysis.
Success: decision evaluated and enforced before protected action. Retryable: transient policy dependency failure only where retry is safe. Permanent: DENY, invalid parameters, forbidden scope. Idempotency: approval/action tokens bound to exact operation. State: policy_id/version, decision, reason, obligations, subject, action hash. Trace: every sensitive enforcement decision.
№48 не владеет identity management, secret storage, prompt-injection threat model, sandbox runtime, request verification, human workflow или всей privacy/governance системой. Она владеет POLICY DECISION + ENFORCEMENT CONTRACT между этими слоями.
«Не отправляй письма без подтверждения» в system prompt.
Полезно как guidance, но модель может ошибиться, неправильно интерпретировать контекст или быть атакована.
Runtime вычисляет: SEND_EMAIL → REQUIRE_APPROVAL.
Результат структурированный и versioned.
Tool wrapper физически не вызывает API без approval token, связанного с точными параметрами письма.
{
"policy_id": "tool.publish.v3",
"policy_version": "3.2.1",
"subject": "agent:smm",
"action": "publish_post",
"resource": "channel:vk_main",
"context": {
"tenant": "brand_A",
"risk": "high"
},
"decision": "REQUIRE_APPROVAL",
"reason_code": "EXTERNAL_PUBLICATION",
"obligations": [
"freeze_exact_payload",
"redact_secrets",
"audit"
],
"expires_at": "..."
}ALLOW — выполнить.
DENY — заблокировать.
REQUIRE_APPROVAL — остановиться и запросить approval.
REDACT / TRANSFORM — удалить или преобразовать запрещённые поля.
ESCALATE — передать более авторитетному policy/human layer.
ALLOW может содержать obligations: например «разрешить, но только read-only / до 10 объектов / без PII / с audit».
Кто субъект, к какому tenant принадлежит, какие ресурсы допустимы.
Какие tools можно вызвать, какие параметры и side effects допустимы.
Какие данные можно передавать внешней модели, API, connector или subagent.
Redaction, data classes, retention, prohibited fields.
Monetary limits, irreversible actions, critical domains, approval thresholds.
Draft vs external publication, destination sensitivity, evidence requirements.
Что разрешено передавать другим agents и какие capabilities им делегируются.
Какие модели/providers допустимы для определённых data classes / regions / tenants.
Что можно записывать в traces, что нужно redact, сколько хранить.
ACL, DB RLS, schema validation, enum/range check, allowlist, sandbox, amount cap, tenant scope, cryptographic approval token.
Лучший выбор, если правило формализуемо.
System prompt, classifier, LLM policy judge, semantic risk detector.
Полезен там, где смысл нельзя полностью выразить кодом. Не должен быть единственным барьером для irreversible action.
Hard outer boundary + semantic decision внутри + human approval на unresolved high-risk cases.
Типовой production pattern.
Роль/задача получает только разрешённые tools.
Types, enums, ranges, required fields, destination scope.
Показать planned effect до внешнего write.
Money, quantity, recipients, delete count, batch size.
Tenant/resource ID не должен быть unrestricted model input.
Approval связан с конкретными параметрами.
Повтор не создаёт второй side effect.
После выполнения проверить фактический эффект, а не intent модели.
{
"approval_id": "APR-...",
"principal": "user:123",
"action": "publish_post",
"resource": "vk:brand_A",
"payload_hash": "sha256:...",
"max_effect": {
"posts": 1
},
"expires_at": "...",
"policy_version": "3.2.1"
}Такой approval слишком широкий. После получения разрешения модель может изменить текст, канал, аудиторию или параметры.
Правильно: approval связывается с exact canonical payload / resource / principal / expiry. Если параметры изменились — policy evaluation и approval повторяются.
Это защищает от TOCTOU-подобной проблемы: time of check ≠ time of use.
Каждый источник получает provenance/trust/data class. Retrieved text считается данными, а не privileged instructions.
В prompt/tool/subagent передаются только разрешённые поля и релевантный slice.
External HTML, email, PDF и connector data могут содержать hostile instructions; deeper threat model — тема №52.
| Стадия | Проверка | Типичные policy obligations |
|---|---|---|
| Model output | Schema / prohibited fields / secret leakage. | REDACT, TRANSFORM, REVISE. |
| Internal draft | Business rules / evidence / destination class. | Allow internal-only, watermark draft, require citations. |
| Artifact export | PII, confidential data, file type, metadata. | Redact, encrypt, restrict destination. |
| External publish/send | Exact recipient/channel/payload/risk. | Approval, freeze payload, audit, readback. |
Subagent получает только необходимые context refs, tool scopes, budget, risk level и output contract. Parent agent не должен автоматически передавать все свои credentials/capabilities.
Перед delegation проверяются recipient eligibility, data egress, tenant, model/provider rules и allowed actions. A2A message — не способ обойти tool guardrail.
Получает subject, action, resource, context и policy version. Возвращает ALLOW / DENY / REQUIRE_APPROVAL / obligations.
Может быть обычной функцией, модулем, DB rules или policy engine. Не обязан быть отдельным сервисом.
Стоит на реальной границе: tool wrapper, API gateway, DB layer, connector, artifact exporter, publisher.
Если PDP сказал DENY, PEP обязан физически остановить операцию.
| Класс действия | Policy service unavailable | Рекомендованное поведение |
|---|---|---|
| Low-risk local read | Potentially degradable. | Можно использовать cached/local rule, если это заранее определено. |
| External write | High uncertainty. | Fail closed или require approval/manual path. |
| Money / destructive / privileged | Critical. | Fail closed. Не исполнять. |
| Policy logging outage only | Depends on obligation. | Если audit обязательный — блокировать; иначе queue audit event. |
policy_id, policy_version, config hash, rollout cohort.
ALLOW/DENY/... + reason + obligations + subject/action/resource.
Executed? blocked? approved? parameter drift? readback result?
Allowed action passes; forbidden action denied; thresholds exact.
Изменить tenant/amount/resource после approval и убедиться, что PEP блокирует.
Adversarial/ambiguous cases для LLM/classifier policy checks.
Каждый escape превращать в permanent test family.
policy/ ├── registry.yaml ├── versions/ ├── authorize.py ├── risk.py ├── obligations.py ├── tests/ │ ├── unit/ │ ├── negative/ │ └── regression/ └── audit.py tools/ ├── wrappers/ │ ├── email.py │ ├── publish.py │ ├── database.py │ └── files.py └── schemas/ approvals/ ├── tokens.py └── store.py
authorize(subject, action, resource, context).OPA/Cedar или другой policy engine можно добавить позже, когда rules/teams/services действительно потребуют отдельного DSL/engine.
% sensitive actions, реально проходящих через policy enforcement.
High-risk actions executed without required gate. Target: zero.
Легитимные действия, ошибочно заблокированные policy.
Доля операций, ушедших к человеку, по сегментам риска.
Стоимость policy evaluation в runtime path.
Частота конфликтующих rules/configurations.
Incidents, которые существующий suite должен был поймать.
Safety/quality delta относительно cost/friction.
Если правило можно выразить схемой, ACL, range или scope — не отдавать его LLM.
Enforcement стоит рядом с реальным side effect, а не только в planner.
Контекстная policy может уменьшить разрешённое, но не выдаёт отсутствующий permission.
Approval = exact action + resource + params/hash + principal + expiry.
Если context/state мог измениться, policy проверяется непосредственно перед use.
Policy version, decision, reason, obligations и actual outcome должны быть воспроизводимы.
LLM/classifier полезен для смысла, но high-risk boundary должен иметь hard outer layer.
Проверять не только разрешённые сценарии, но и попытки обхода/изменения параметров.
Не заставлять low-risk read проходить тот же approval flow, что и irreversible write.
| Вопрос | Ответ |
|---|---|
| Стоит ли реализовывать? | Да, рано. Без enforcement граница между reasoning и side effect слишком хрупкая. |
| Минимум 80% ценности? | Central authorize(), tool PEP, schema/scope validation, risk tiers, exact approval, audit, output release check. |
| Когда overkill? | Если делать отдельный LLM-agent, policy microservice cluster и сложный DSL для маленького single-user prototype с 2 read-only tools. |
| Trigger для semantic guardrail? | Rule cannot be formalized; ambiguous data/output; high-risk meaning requires interpretation. |
| Как измерить uplift? | Escape rate, critical violations, false deny, approval precision, incident rate, cost/friction, ablation. |
| Можно ли заменить LLM-agent? | В большинстве случаев — да. Code/schema/ACL/tool wrapper/policy function должны быть default. |
USER / EVENT / AGENT
↓
IDENTITY + TENANT + CONTEXT
↓
INPUT / DATA POLICY
↓
EXECUTIVE / MODEL / PLAN
↓
OUTPUT / ACTION INTENT
↓
VALIDATE PARAMETERS
↓
PDP — POLICY DECISION POINT
↓
ALLOW / DENY / REDACT / APPROVAL / ESCALATE
↓
PEP — POLICY ENFORCEMENT POINT
↓
[ IF APPROVAL ]
freeze exact payload → approve → verify token
↓
EXECUTE SIDE EFFECT
↓
READBACK / OUTCOME VERIFICATION
↓
TRACE:
policy_id + version + reason + obligations + actual result
↓
EVALS / INCIDENT REGRESSION / POLICY IMPROVEMENT
CORE PRINCIPLE:
THE MODEL MAY PROPOSE.
THE SYSTEM DECIDES.
THE ENFORCEMENT POINT ACTUALLY BLOCKS OR ALLOWS.
A. Related ECC ideas. Context-as-cache, scoped memory, lifecycle hooks, selective capabilities, feature flags, deterministic enforcement, provider-neutral adapters and eval-gated learning are applied only where relevant to №48 Guardrails & Policies.
B–E. Existing boundary and placement. The existing conceptual boundary, class PRODUCTION, default ON and owner Quality Engine + Production Fabric remain authoritative. Runtime/control/data/offline placement is unchanged; durable state stays outside model context.
F–H. Hooks and contracts. Use bounded PRE_MODEL/POST_MODEL, PRE_TOOL/POST_TOOL, CHECKPOINT and TASK_COMPLETED events as applicable. Illustrative fields and canonical contracts are defined in NEW_CONTRACTS_SPEC.md; no universal schema is implied.
I–J. Security and evaluation. Host-side schema, permission, secret, budget, idempotency and audit checks take precedence over LLM output. Optional mechanisms require a feature flag and WITH/WITHOUT ablation; measure quality, acceptance, correction, latency, cost, escalations and severe errors.
K–L. Task profiles and cross-references. A TaskProfile selects the relevant skill, tool/context slice, memory scope and enforcement profile independently from FAST/STANDARD/DEEP. See cross-reference map, hook spec and ablation plan. Provider adapters remain outside the core.