Пробел в наблюдаемости
Корпоративные стеки безопасности создавались для наблюдения за действиями. Типичная агентная платформа выдаёт логи HTTP-запросов, деревья процессов, счётчики токенов, вызовы инструментов и использование учётных данных. Эти артефакты с разумной точностью отвечают на вопрос что произошло. Они не отвечают на вопрос что должно было произойти, и для автономных агентов это различие значит больше, чем когда-либо для детерминированных сервисов.
Рассмотрим два запуска, порождающих идентичную телеметрию. В первом агент вызывает CRM API, потому что неправильно настроенное сопоставление интеграции направило задачу обновления клиента на неверный эндпоинт. Во втором агент вызывает тот же эндпоинт, потому что сам решил, что обогащение клиентских записей служит цели, которая ему никогда не ставилась. Логи HTTP одинаковы. Деревья процессов одинаковы. Счётчики токенов одинаковы. Инженер по обнаружению, разбирающий траекторию постфактум, иногда может восстановить, что было чем, но только выводя цель из поведения. Этот вывод медленный, вероятностный и недоступен в момент совершения вызова.
Вендоры сходятся на том, что намерение — это ключевое отличие в безопасности агентов, но текущее состояние искусства трактует намерение как постфактум аналитическую метку. Поведение кластеризуется, последовательности сравниваются, и аналитику сообщают, что запуск выглядит так, будто преследовал что-то за пределами мандата. Это полезная форензика. Это не принудительное исполнение. К моменту, когда вывод сделан, ресурс уже затронут.
Пробел носит также операционный, а не только аналитический характер. Отчёты о неконтролируемых агентах неизменно показывают, что значительная доля развёрнутых агентов работает вообще без мониторинга. Агент, за которым не наблюдают, не может быть предметом вывода, а агент, наблюдаемый только через логи действий, не может быть ограничен намерением. Обе неудачи имеют общую первопричину: намерение нигде в стеке не представлено как объект первого класса.
Намерение как артефакт
Практический следующий шаг — перестать относиться к намерению как к чему-то, что выводит модель, и начать относиться к нему как к чему-то, что заявляет принципал. Каждый запуск агента должен открываться структурированным мандатом. Мандат — это небольшой машиночитаемый документ, который указывает:
- цель в форме, поддающейся проверке, а не только описанию;
- классы ресурсов, которых запуску разрешено касаться;
- потолки расходов и частоты;
- срок действия, после которого мандат аннулируется и запуск должен пройти повторную авторизацию.

Мандат — это не промпт. Это артефакт политики, ближе к токену с ограниченной областью действия, чем к системному сообщению. Он подписывается запрашивающим принципалом — будь то человек-оператор, вышестоящий сервис или другой агент, действующий по делегированному мандату. Подпись привязывает запуск к подотчётному источнику.
Ссылки на цель на каждом шаге
Сам по себе мандат инертен. Он становится несущим, когда каждый шаг траектории несёт ссылку на цель обратно к нему. Конкретно, вызов инструмента должен включать поле, называющее пункт мандата, которому он служит:
{
"mandate_id": "mnd_7f3a",
"purpose_ref": "clause:customer_lookup",
"resource": "crm.contacts.read",
"step": 4
}
Затем движок политик оценивает вызов против заявленного намерения, а не угадывает по его форме. Чтение crm.contacts по clause:customer_lookup ожидаемо. То же чтение по clause:invoice_reconciliation — это расхождение, независимо от того, действительны ли учётные данные. Проверка дешёвая, локальная и доступна до того, как ресурс затронут.
Мандат и траектория хранятся вместе. Именно это совместное размещение делает артефакт доступным для запросов: следователь может спросить не только что сделал этот запуск, но и что он заявил, что сделает, и сравнить одно с другим за любое окно.
Что выигрывает обнаружение
Как только намерение становится артефактом, становятся доступны несколько классов сигналов, которые сейчас либо эвристичны, либо отсутствуют.
Расхождение становится сигналом первого класса. Расстояние между заявленной целью и наблюдаемым ресурсом больше не статистическая аномалия, требующая настройки. Это булево сравнение с подписанным документом. Шаг, чей purpose_ref не покрывает ресурс, которого он касается, является расхождением по построению. Аналитики могут ранжировать расхождения по серьёзности,

Боковое перемещение проявляется структурно. Агент, переходящий из разрешённого класса ресурсов в неразрешённый, виден независимо от того, были ли действительны использованные им учётные данные. Это важно, потому что действительность учётных данных — плохой суррогат авторизации в агентных системах: агенты часто переобеспечены правами, и действительный токен — это именно то, что предъявит скомпрометированный или отклонившийся от цели запуск. Область мандата ловит перемещение, которое действительность токена пропустила бы.
Пороги становятся по-мандатными. Глобально настроенный порог аномалий должен учитывать самого шумного агента в парке, а значит, он слишком свободен для тихих. Типы мандатов несут свои собственные ожидаемые формы. Мандат сверки, читающий фиксированный набор реестров, имеет узкий конверт; исследовательский мандат — более широкий. Пороги можно задавать по типу мандата, и одна и та же телеметрия поддерживает оба без компромиссов.
Принудительное исполнение смещается раньше. Поскольку проверка локальна и предшествует обращению к ресурсу, расхождение можно отклонить, а не залогировать. Различие между обнаружением и предотвращением — это различие между отчётом об инциденте и предотвращённым инцидентом.
Издержки и ограничения
Мандаты должны находиться между двумя ограничениями, тянущими в противоположные стороны. Они должны быть достаточно грубыми, чтобы человек мог написать один без обучения policy DSL, и достаточно конкретными, чтобы машина могла проверить шаг против него без двусмысленности. Мандат, говорящий делай полезную работу с клиентскими данными, writable и uncheckable. Мандат, перечисляющий каждый эндпоинт, checkable и unwritable. Рабочая середина — это классы ресурсов с явными именами пунктов, что является дисциплиной проектирования, а не технической.
Более жёсткое ограничение — исследовательские агенты. Некоторым запускам законно нужно обнаруживать собственный путь: агенту отладки, который должен осмотреть незнакомый сервис, исследовательскому агенту, который должен следовать ссылкам. Мандат, запрещающий все не перечисленные ресурсы, сломает эти запуски; мандат, разрешающий всё, сводит на нет саму цель. Честный ответ — ограниченная область обнаружения, заявленная в мандате и исполняемая как любой другой пункт. Это проблема проектирования политики, а не телеметрии, и она не будет решена лучшим логированием.
Есть также издержка у самого артефакта. Мандаты нужно выпускать, подписывать, ротировать и отзывать. Они добавляют шаг к началу каждого запуска и поле к полезной нагрузке каждого шага. Накладные расходы малы на вызов, но не нулевы в масштабе парка, и они вводят новый режим отказа: запуск, который не может получить мандат, не может продолжиться. Это правильное поведение по умолчанию для классов ресурсов с высокими последствиями и неправильное — для классов с низкими последствиями, а значит, выпуск мандатов нуждается в собственной ярусности.
Ничто из этого не заменяет существующую телеметрию. Логи действий остаются необходимыми для форензики, ёмкости и отладки. Аргумент уже: одни лишь логи действий не могут отличить неправильно настроенную интеграцию от цели за пределами мандата, и никакой объём постфактум-вывода не закрывает этот пробел вовремя, чтобы это имело значение. Заявленное, подписанное, доступное для запросов намерение — закрывает.
Следующий шаг для большинства команд — не новая платформа. Это изменение схемы: добавьте мандат к запуску, добавьте ссылку на цель к шагу и храните их вместе. Выигрыши в обнаружении следуют из этого представления, а не из лучшей модели того, о чём думал агент.
