Policy Layer

Главный принцип: ограничения в КОДЕ, не в промптах. Промпт можно сломать prompt injection — код нет.

Два уровня проверки

Pre-execution (до tool call)

Проверяется перед выполнением действия агентом:

  1. Tool allowlist — инструмент в списке разрешённых для роли?
  2. Params validation — параметры валидны и в допустимых диапазонах?
  3. Red Lines — действие не нарушает Codex?
  4. Budget — агент не превысил budget_tokens / budget_usd / budget_seconds?
  5. Destructive check — если destructive → human_approval = True в payload?

Post-execution (до передачи результата)

Проверяется после выполнения, перед сохранением результата:

  1. Output schema — результат соответствует ожидаемой структуре?
  2. PII detection — нет ли утечки персональных данных?
  3. Secrets detection — нет ли API keys, паролей, tokens в output?
  4. Confidence score — агент указал confidence?
  5. Audit log — запись в лог выполнена?

PolicyEngine (псевдокод)

class PolicyEngine:
    def validate_tool_call(self, agent: Agent, tool: str, params: dict) -> Optional[str]:
        """Returns violation description or None if OK."""
 
        # 1. Role-based tool access
        if tool not in agent.role.allowed_tools:
            return f"Tool '{tool}' not in allowlist for role '{agent.role.name}'"
 
        # 2. Destructive tools require human approval
        if tool in DESTRUCTIVE_TOOLS:
            if not params.get('human_approval'):
                return f"Destructive tool '{tool}' requires human_approval=True"
 
        # 3. Rate limiting
        if rate_limiter.exceeded(agent.id, tool):
            return f"Rate limit exceeded for {agent.id} on {tool}"
 
        # 4. Budget check
        if budget_tracker.exceeded(agent.task_id):
            return f"Budget exceeded for task {agent.task_id}"
 
        return None  # OK
 
    def validate_output(self, agent: Agent, output: dict) -> Optional[str]:
        """Returns violation description or None if OK."""
 
        # 1. PII scan
        pii = pii_detector.scan(str(output))
        if pii:
            return f"PII detected in output: {pii.types}"
 
        # 2. Secrets scan
        secrets = secrets_detector.scan(str(output))
        if secrets:
            return f"Secrets detected in output: {secrets.types}"
 
        # 3. Audit log
        audit_logger.log(agent=agent, output=output)
 
        return None  # OK

Destructive Tools (требуют human approval)

ToolApproval
send_emailhuman
send_message (external)human
publish_posthuman
make_paymenthuman + 2FA
delete_*human
deploy_productionhuman
modify_dnshuman
modify_firewallhuman
create_userhuman
grant_accesshuman

Defence in Depth

Шесть уровней защиты, каждый независим:

1. [[Codex]]           → Правила в системном промпте агента
2. Role config         → allowed_tools, budget limits в roles/*.yaml
3. Policy Engine       → Программная проверка pre/post
4. Tool implementations → Валидация внутри самих инструментов
5. Human approval      → Telegram confirmation для destructive
6. Audit log           → Полная запись для post-mortem

Нарушение на любом уровне → блокировка. Все уровни должны быть пройдены.

Реакция на нарушение

При обнаружении policy violation:

  1. Задача → status = 'escalated'
  2. Telegram alert отправляется Human Owner
  3. Запись в security_incidents таблицу
  4. 3+ попытки нарушения за 24 часа от одного агента → агент заморожен до human review
CREATE TABLE security_incidents (
    id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    agent       TEXT NOT NULL,
    task_id     UUID REFERENCES tasks(id),
    violation   TEXT NOT NULL,
    severity    TEXT NOT NULL,  -- 'low' | 'medium' | 'high' | 'critical'
    details     JSONB,
    created_at  TIMESTAMPTZ DEFAULT now()
);

Связанные документы