Политика
Граница без permission-промптов: правила PreToolUse и зоны vault. Модель везде в bypassPermissions; что ей можно, решает код.
Почему без диалогов «разрешить?» gateway
Human in the loop на каждом тул-колле выглядит безопасно, но работает недолго. Через день человек жмёт «разрешить» не читая, и граница исчезает, оставляя ощущение, что она есть.
Это не догадка. Исследование UAC в Windows (SOUPS 2010): 69% участников обрабатывали диалоги повышения прав неправильно, то есть прокликивали. fMRI-исследование предупреждений (CHI 2015): реакция зрительных центров мозга резко падает уже со второго показа одного и того же диалога. Свежая работа про агентов (2026): у надзора есть ёмкость, ревьюер устаёт, и с ростом числа эскалаций система становится менее безопасной, а не более.
Поэтому здесь граница - код: правила PreToolUse, зоны vault, монтирование и отдельный uid. Модель везде в bypassPermissions, а человек читает аудит, а не диалоги.
Правило - функция gateway
PolicyRule - (ToolCall) -> Deny | None, объявляется на агенте списком. Первый Deny становится результатом тулзы, который модель читает; правило, которое упало, - тоже deny. ToolCall.state - словарь на сессию, куда правила пишут (какие скиллы открыты).
Зоны vault beaver-agent
Zones: write - всё, включая удаление; create - только новые файлы; edit - создавать, править, переносить, но не удалять; protected - не трогать. Путь в vault вне всех зон - отказ.
У меня: write=(мета/бобер,), create=(💬 чаты,), edit=(весь vault,), protected=(.obsidian, мета). Vault - дом диспетчера, но удалять он может только своё, а мета вне бобер - зона пользователя, то есть твоя.
Bash тоже beaver-agent
Файловые тулзы - полдела. bash_zones парсит команду через shlex, ловит rm/mv/cp/tee, sed -i, редиректы > и проверяет каждый путь теми же зонами. Отказ - с причиной на русском, которую модель прочитает и поймёт, куда можно.
Изоляция процесса gateway
Процесс модели - отдельный uid beaver-runner с белым списком env: в нём нет DATABASE_URL, POSTGRES_*, *_PAT. Единственный секрет, который доезжает, - OAuth-токен Claude, и CLI сам прячет его от Bash. Секреты MCP идут через env подпроцесса, никогда argv: процесс модели видит ps всего контейнера.
Каждый тул-колл ложится в аудит и виден в админке.