Перейти к основному содержимому

Контракты песочницы: что агент должен доказать, прежде чем коснётся продакшн-эндпоинта

Изоляция агента — это контракт разрешений и верификации, а не guardrail-промпт. Каждая граница инструмента требует предварительного условия, которое агент не может обойти во время выполнения.

Крупный план серверной стойки с сетевыми кабелями, индикаторами и патч-панелями в дата-центре.

Паттерн отказа: возможность предоставлена, намерение не проверено

Это повторяющийся паттерн. Агент уполномочен просматривать систему, а затем действует в ней. Или он уполномочен читать запись, а затем записывает её. Большинство инцидентов живёт именно в этом разрыве между глаголом, который агенту предоставили, и глаголом, который он фактически выполнил. Предоставление обычно неявное: учётные данные с областью чтения-записи, инструмент с универсальной сигнатурой http_request, сервисная учётная запись, которая может дотянуться до чего угодно в сетевом сегменте. Намерение обычно не проверено: не существует артефакта, который говорит: «этот конкретный вызов, к этому конкретному эндпоинту, с этим конкретным payload, был проверен до того, как покинул процесс».

Постфактумное логирование не может закрыть этот разрыв. Логи говорят вам, что произошло; они не отклоняют вызов. Если единственный контроль между агентом и продакшн-эндпоинтом — это предложение в системном промпте, контроль носит рекомендательный характер. Модель в условиях distribution shift, prompt injection, перенесённый в извлечённом документе, или планировщик, который дрейфовал, будут воспринимать совет как предложение. Отказ должен происходить в месте, с которым агент не может спорить.

У контракта песочницы четыре пункта

Контракт песочницы — это машинно-проверяемое предварительное условие, привязанное к границе инструмента. Это не политический документ и не промпт. У него четыре пункта, и все четыре обеспечиваются вне модели.

Область действия

Область действия — это точный набор эндпоинтов и глаголов, которые агент может использовать, выраженный как allowlist. Denylist не работает, потому что он должен перечислить каждое опасное действие, а пространство опасных действий открыто. Allowlist отказывает закрыто: всё, что не названо, запрещено. Конкретно область действия — это набор кортежей вида (method, host, path-pattern, credential-id), сопоставляемых до того, как запрос будет построен. Инструмент, который предоставляет свободный URL, не имеет области действия; это прокси с лишними шагами.

Close-up of a colorful business chart on a table with documents showing trends

Частота и радиус поражения

Частота — это сколько вызовов разрешено за окно, а радиус поражения — это то, что происходит при первой аномалии. Эти два понятия идут вместе, потому что медленная утечка и всплеск — разные режимы отказа. Контракт должен задавать token bucket для каждого класса эндпоинтов и жёсткую остановку при первом нарушении контракта, а не мягкое предупреждение. Честный компромисс: жёсткие лимиты ломают легитимную пакетную работу, поэтому команды в итоге получают небольшое число предварительно одобренных массовых операций, которые несут собственный контракт, вместо одной глобальной частоты, которая либо слишком свободна, чтобы иметь значение, либо слишком жёстка, чтобы ею пользоваться.

Обратимость

Каждое действие, которое может выполнить инструмент, должно быть классифицировано как идемпотентное, компенсируемое или запрещённое. Идемпотентные действия (чтение, поиск) можно свободно повторять. Компенсируемые действия (создание, которое можно удалить, сообщение, которое можно отозвать) требуют определённого пути компенсации, который протестирован, а не предполагается. Запрещённые действия (необратимые выплаты, ротация учётных данных, массовое удаление) никогда не делегируются агенту, независимо от того, насколько уверен планировщик. Именно этот пункт превращает «агент ошибся» из инцидента в откат.

Аттестация

Аттестация — это доказательство, которое агент должен вернуть до того, как будет разблокирован следующий шаг. Это пункт, который большинство команд пропускает, и именно он делает контракт контрактом, а не фильтром. Прежде чем запись будет зафиксирована, агент возвращает структурированную запись: id контракта, разрешённый эндпоинт, хеш payload, diff пробного запуска и идентификатор использованных учётных данных. Шлюз проверяет эту запись на соответствие контракту и только затем выдаёт учётные данные для реального вызова. Без аттестации шлюз может обеспечить область действия, но не может отличить заплIndustrial plant with large tanks and chimneys against a lush mountain backdropе

Server rack closeup

Обеспечивайте соблюдение на шлюзе инструментов, а не в системном промпте. Промпты носят рекомендательный характер; шлюзы — нет. Шлюз — это процесс, который хранит учётные данные, разрешает эндпоинт и решает, будет ли вызов продолжен. Если агент может достичь эндпоинта, не проходя через шлюз, контракт декоративен.

Рассматривайте egress и выдачу учётных данных как отдельные решения. Контроль egress отвечает на вопрос «может ли этот процесс открыть соединение с этим хостом?» Выдача учётных данных отвечает на вопрос «получает ли этот конкретный запрос токен, который хост примет?» Разделение этих решений означает, что скомпрометированный планировщик не может расширить собственную область действия: он, возможно, сможет достичь хоста, но не сможет получить учётные данные для действия вне своего контракта. Это разница между сетевой политикой и системой возможностей, и именно это большинство современных агентных фреймворков пока делают неправильно.

Храните подписанную запись каждого принятого контракта. Когда инцидент всё же происходит, разбор должен быть запросом, а не археологическим проектом. Подписанный лог только для добавления, содержащий id контракта, идентичность агента, хеш аттестации и решение (allow/deny), позволяет детерминированно восстановить ход выполнения. Он также позволяет ответить на вопрос, который регуляторы и специалисты по реагированию на инциденты действительно задают: не «что сказала модель?», а «что агенту было разрешено делать и что он доказал перед тем, как это сделать?»

Что командам следует сделать в этом квартале

Перечислите каждый инструмент, который может вызвать агент, и пометьте каждый как read, write, spend или publish. Это упражнение на один присест, которое обычно выявляет больше возможностей, чем кто-либо ожидал. Классификация определяет контракт: инструменты read получают область действия и частоту; инструменты write, spend и publish дополнительно получают обратимость и аттестацию.

Для инструментов write и spend требуйте режим пробного запуска и видимый человеку diff перед фиксацией. Пробный запуск должен проходить тот же путь кода, что и реальный вызов, с заглушкой на шаге фиксации. Diff — это артефакт, который проверяет человек или автоматический чекер. Если инструмент не может создать diff, он не готов к делегированию.

Проведите одно учение по локализации: отзовите учётные данные в середине выполнения и убедитесь, что агент отказывает закрыто. Ожидаемое поведение — чистая остановка и типизированная ошибка, а не цикл повторных попыток, который бомбардирует эндпоинт, или fallback, который находит другие учётные данные. Это учение дёшево, оно проверяет шлюз, а не модель, и выявляет разницу между системой, которая отказывает закрыто, и той, которая лишь логирует отказ.

Инцидент с Medicare — напоминание о том, что локализация не является свойством модели. Это свойство границы: набор явных предварительных условий, обеспечиваемых инфраструктурой, с которой агент не может договориться во время выполнения. Команды, которые рассматривают границу как единицу проектирования, обнаружат, что большинство агентных инцидентов перестают быть инцидентами и становятся отклонёнными вызовами.

ПоделитьсяXLinkedInПостоянная ссылка5 мин чтения

Связанное чтение

На какие вопросы это отвечает

Why can't a system prompt enforce agent containment?

Prompts are advisory. A model under distribution shift, a prompt injection in retrieved content, or a drifted planner can ignore them. Refusal must happen at infrastructure the agent cannot negotiate with, such as a tool gateway that holds credentials and resolves endpoints.

What are the four clauses of a sandbox contract?

Scope (an allowlist of endpoints and verbs), rate and blast radius (calls per window and the hard stop on first anomaly), reversibility (idempotent, compensatable, or forbidden), and attestation (the evidence the agent returns before the next step is unlocked).

Why separate egress control from credential issuance?

Egress answers whether a process can reach a host; credential issuance answers whether a specific request gets a token the host will accept. Separating them means a compromised planner can reach a host but cannot obtain a credential for an action outside its contract.

What is a containment drill?

A rehearsal in which a credential is revoked mid-run and the agent is expected to fail closed: a clean stop with a typed error, not a retry loop or a fallback credential. It tests the gateway rather than the model.