Гейтинг — детерминированный, в реестре, не в промпте: master_only /
trusted_only / privileged_only проверяются до исполнения по личности
тура и окружению. Из чужого тура мастер-инструмент не исполнится ни при
каких уговорах модели — это щит от prompt injection, не зависящий от её
послушности. Тем же гейтом заперты обе стороны команды: agent_only —
доклад наверх, lead_only — управление подагентами (см.
агентские команды).
Три оси доверия: master — тур ведёт Господин (sender из
master.aliases или отсутствует); trusted — доверенное окружение (флаг
trusted от TUI/Android-клиента или личка Господина в телеграме;
публичные чаты — никогда); privileged — разрешённый пользователь
(телеграм-whitelist; из доверенных клиентов — всегда).
Маркеры спикеров ставит только ядро: тело сообщения идёт под маркером
цитатой, притвориться чужим голосом текстом нельзя.
Гости получают урезанный потолок ответа (max_tokens_guest) и не
видят платных инструментов; выборка памяти режется до
memory.public_top_k в любом не-мастерском туре (не только гостевом).
Меню настроек поверхности не светит приватное: тулы из её
master-списка (память, личности…) в групповом меню не показываются даже
именами — полная консоль чата уезжает Господину в личку по кнопке.
Секреты в конфиге (llm.api_key, web.booru.*.api_key, заголовки
MCP) — отдельными файлами через extraConfigFiles, не в settings (тот
лежит в world-readable /nix/store).
Секреты в выхлопе инструментов затираются до записи: cat .env или
env в кодовом туре не увозит токен ни провайдеру, ни в базу (она не
архив секретов), ни клиенту в живой стрим. Правила — данные
(secrets.rules):
встроенный набор покрывает Bearer, sk-, AKIA, AGE-SECRET-KEY,
glpat-, gh*_, PEM-блоки и присвоения token=…; новый формат токена —
строчка конфига, не пересборка. Плейсхолдер называет вид:
[redacted: bearer token]. Это сеть безопасности, а не разрешение
читать .env.
SSRF-щит на URL от модели: web_fetch и скачивание source для
image_generate не ходят в приватные сети — модель могла взять адрес из
недоверенного текста, а за 127.0.0.1 живёт само ядро, которое своих не
аутентифицирует (токен проверяет реверс-прокси снаружи). Отсекаются
loopback, RFC1918, link-local, CGNAT, ULA и прочие спец-диапазоны — на
уровне DNS-резолвера (каждый коннект, включая хопы редиректов и
rebinding), а редирект на приватный IP-литерал, минующий DNS, режет
политика редиректов. Схемы — только http(s). Исключения — явным
списком web.allow_private_hosts (пуст по умолчанию). Адреса
MCP-серверов приходят только из конфига — это уже явное решение
Господина, щит им не нужен.