Перейти к тексту

Доступ к инструментам: tool gateway и policy ​

Runner получил команду из JSON-файла задачи. Прежде чем выполнить её, нужно решить, разрешена ли она в этой задаче и окружении. Например, python3 -m unittest discover -s tests нужен для проверки ALGI, а отправка отчёта по почте в задачу не входит.

Место, через которое проходят такие вызовы, называют tool gateway. Правила допуска - policy. Для небольшого runner достаточно локальной функции проверки; отдельный сервер потребуется, когда общие правила обслуживают несколько исполнителей.

Прочитайте policy v03 ​

После третьего шага практики откройте $LAB_ROOT/harness-v03/policies/local-dev.json. В ней три настройки:

ПолеЧто проверяет
allowed_command_prefixesНачало списка аргументов команды. В примере разрешён python3 -m unittest.
blocked_command_fragmentsЗапрещённые фрагменты в строковом представлении команды.
allowed_workspace_pathsПуть файла, который scripted backend собирается записать.

Для команд runner сначала проверяет запрещённые фрагменты, затем разрешённый префикс. Для записи - отвергает абсолютные пути и .., после чего сверяется со списком разрешённых корней.

Список expected_outputs из задачи на эти права не влияет. Кроме того, учебная policy разрешает запись в specs и AGENTS.md. Если в конкретной задаче эти файлы должны оставаться неизменными, нужен более узкий список разрешённых путей.

Увидьте отказ без запуска команды ​

Следующий пример вызывает только функцию принятия решения. Ни curl, ни тесты здесь не выполняются. Нужен собранный v03 и переменная LAB_ROOT из практики.

bash
python3 - "$LAB_ROOT/harness-v03" <<'PY'
import importlib.util
import json
import sys
from pathlib import Path

root = Path(sys.argv[1])
spec = importlib.util.spec_from_file_location("lab_runner", root / "runner.py")
runner = importlib.util.module_from_spec(spec)
spec.loader.exec_module(runner)
policy = json.loads((root / "policies/local-dev.json").read_text())

for command in (
    ["python3", "-m", "unittest", "discover", "-s", "tests"],
    ["curl", "https://example.com"],
    ["python3", "-m", "py_compile", "algi/domain.py"],
):
    print(command, runner.command_allowed(command, policy))
PY

Первая команда разрешена, вторая запрещена по фрагменту curl , третья - из-за отсутствия разрешённого префикса. То, что py_compile выглядит безобидно, не даёт ему автоматического разрешения. Добавление новой проверки требует согласованного изменения policy.

Во время обычного запуска v03 сохраняет решение в policy_check. При отказе команда пропускается, появляется check_blocked, а итоговый статус будет blocked. При этом текущая реализация продолжает обход остальных проверок; отказ не означает мгновенную остановку всего списка.

Почему этой проверки недостаточно для изоляции ​

Разрешённый python3 -m unittest выполняет Python-код тестов и импортируемых модулей. Этот код может читать файлы и обращаться в сеть с правами процесса runner. Список префиксов не видит таких действий. Подстановка табуляции в запрещённый фрагмент тоже не даёт универсального обхода: команда ещё должна пройти отдельную проверку префикса.

Проверка путей в v03 также ограничена. Она анализирует строку пути, но не защищает от символьной ссылки внутри разрешённой папки. Кроме того, проверки записи относятся к копированию fixture, а не ко всем операциям, которые выполнит Python-код.

Для недоверенного backend нужны ограничения самого окружения: отдельная рабочая папка, права файловой системы, контроль сети, отсутствие лишних учётных данных. Если модель доступна только через сетевой API, её соединение нужно организовать отдельно от произвольного сетевого доступа исполняемого кода. Подробнее об этом - в главе о безопасности.

Подключение внешних действий ​

Для отправки отчёта полезнее отдельный инструмент с известными аргументами, чем общий shell с почтовым токеном. Такой интерфейс может требовать идентификатор получателя, версию подготовленного отчёта и подтверждение владельца. Результат должен содержать проверяемый статус доставки или принятия запроса сервисом.

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

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

Следующая доработка ​

Для продуктовой задачи попробуйте сузить разрешённые пути до algi и tests. Проверьте разрешение записи в algi/domain.py и отказ для AGENTS.md через workspace_path_allowed, не записывая сами файлы. Затем добавьте эти случаи в набор проверок harness. Так изменение policy будет иметь собственную проверку поведения.

Хендбук по Agentic Engineering