Продукт

Все вызовы ваших агентов по одним правилам

MCP, HTTP и SSH через один брокер. Агент просит действие. Sallyport определяет класс, при необходимости зовёт человека, пишет запись, кладёт ключ на запрос и отправляет его. Правила одни и те же, пришёл вызов по MCP, по HTTP или по SSH.

Единица настройки

Binding — это один ключ, один сервис и один набор правил

На нём держится всё остальное. Binding называет кред, канал, хост, префикс пути и методы, которыми агентам можно пользоваться, и режим одобрения к ним. Выдали агенту binding — у него появился инструмент с человеческим описанием. Забрали — инструмент пропал из списка.

Агент видит всё сразу
Новый агент на первом же вызове перечисляет все binding'и своего воркспейса: сервис, ключ, что проходит сразу, а что ждёт человека. Никто не узнаёт границы своих прав через отказ.
Нет доступа возвращается ссылкой, по которой выдают
Вызов на хост без binding'а возвращает access request и URL. Человек выдаёт доступ одним экраном, агент повторяет вызов, работа продолжается.
Правила на агента только ужесточают
Override на агенте может сузить то, что разрешает binding, и не может расширить. Проверка живёт в базе, а не в ветке кода, про которую можно забыть.

Лестница

Чтение идёт. Запись спрашивает. Разрушительное отклоняется, пока вы не скажете иначе

Три класса, и каталог решает их за вас. GET по списку — чтение. POST, который двигает деньги, — запись. Удаление, ротация ключа и путь, выдающий чужой секрет, — разрушительное.

Профили вместо файлов политик
Observer, workhorse и prod идут профилями, которые применяются сразу к многим binding'ам, с предпросмотром изменений до применения.
Сначала смотреть, потом включать
Режим observe неделю ведёт binding и показывает отчёт: все вызовы, которые он видел, те, что профиль остановил бы, и причину по каждому. Включаете, когда согласны.
Grant'ы с краем
Разрешите класс на час с бюджетом вызовов. Grant — это строка, она проверяется на границе каждого вызова, и отзыв останавливает следующий.

Карточка

Экран, который определяет продукт

Человек открывает карточку на телефоне, тратит на неё три секунды и не помнит, что делал агент. На ней достаточно, чтобы отличить нормальный вызов от вредоносного, и ничего сверх того.

Рисуется из запроса, который мы вот-вот отправим
Строка цели берётся из канонического запроса, который построил шлюз: класс, метод, хост, путь, аргументы полностью, кред по имени, сработавшее правило и то, что вызов спровоцировало.
Недоверенный текст помечен как недоверенный
Всё, что написал агент, лежит в своём блоке, экранированное, с вырезанными управляющими и bidi-символами, а кнопки — выше него. В Telegram карточка идёт вообще без разметки.
Один вопрос на серию
Пятьдесят записей в цикле становятся одной групповой карточкой: все, первые пять или по одной. Разрушительный вызов добавляет step-up и обязательную причину.

Мы следим за штамповкой. Когда ответы воркспейса становятся быстрыми и одинаковыми, карточки группируются жёстче, а разрушительный вызов требует письменной причины.

Каталог

Рецепты хранят факты о чужих API

Рецепт знает хосты сервиса, способ предъявления креда, какие пути пишут и какие разрушают. Это JSON со схемой и тестами классификации в публичном репозитории, так что неверный класс правится данными, а не релизом.

Пути, выдающие секреты, названы поимённо
Installation-токены GitHub, CI-переменные GitLab, env Vercel с decrypt, kv у Vault. Помечены в рецепте, класс destructive, по умолчанию отказ, и консоль показывает их список в вашем арендаторе.
Дрейф — это событие
Когда апстрим добавляет эндпоинт, которого каталог не знает, вам об этом сообщают, а не пропускают его молча.
То, чего нет в каталоге, всё равно работает
Хост без рецепта получает консервативный дефолт и access request: неизвестный API становится вопросом к человеку, а не тупиком для агента.

Правила фрикшена

Отказ из-за конфигурации — это баг продукта

Минимальный фрикшен здесь требование, и его держат тесты. Пять из них стоит назвать вслух.

У ожидания всегда есть идентификатор
В каждом останавливающем ответе есть call_id, ссылка на одобрение, срок, интервал опроса и ожидаемое время. Повтор с идентификатором продолжает ту же операцию во всех четырёх транспортах.
Данные не теряются
Агент получает столько тела, сколько влезает в контекст, а полный ответ остаётся доступен по ссылке. У ответа на 100 MiB голова уходит инлайн, остальное — одним fetch'ем.
Ошибка говорит, что делать дальше
У каждого останавливающего кода есть инструкция и ссылка в тексте, который читает модель, а не только в структурном поле, которое она может пропустить.
Лимиты вас не будят
Лимит скорости отвечает временем повтора. Превышение плана включает триал и присылает уведомление. Ни то, ни другое не поднимает карточку и не останавливает прод.

Для агентств

Воркспейс на клиента, со своим approver'ом и своим журналом

Вы ведёте агентов на инфраструктуре клиентов, и у каждого клиента своё хранилище, свои одобряющие, свой выгружаемый журнал и карточка под вашим брендом. Подписали следующего — клонировали воркспейс. Такой формы нет ни у одного вендора с публичной ценой.

Гостевому approver'у не нужен аккаунт
Отправьте magic-link. Человек со стороны клиента отвечает на карточку про свой ключ, и в записи видно, кто это был.
Отчёт принадлежит клиенту
Каждый воркспейс выгружает свой сегмент журнала и свой дайджест, так что клиент видит, что ваши агенты делали в его системах.

Поставьте за него один ключ и посмотрите

Начните с самого шумного агента и с ключа, который вы меньше всего хотите ему отдавать.

Подключить первого агента

10 000 вызовов в месяц бесплатно. Режим observe показывает, что политика остановила бы, ещё до её включения.