Запись архива

Steer: как остановить опасную команду AI-агента до выполнения

Open-source утилита Steer ставит policy-hook перед инструментами Claude Code: вызов можно запретить, переписать или дополнить контекстом до исполнения. Разбираем механику и ограничения.

Steer перехватывает команду AI-агента и направляет ее по маршрутам разрешить, переписать или запретить

AI-агенту можно написать «не используй rm», но такая просьба остается частью контекста: модель может забыть ее, неверно истолковать или обойти другой командой. Open-source утилита Steer предлагает более жесткий механизм для Claude Code — перехватывать вызов инструмента до выполнения и применить к нему локальное правило.

Это не новая модель и не еще один агентный фреймворк. Steer — небольшой CLI на Rust, который работает как hook Claude Code. Получив описание будущего tool call, он может запретить вызов, переписать его аргументы или добавить агенту поясняющий контекст. На момент проверки 31 августа 2026 года проект находится на ранней стадии: в Cargo.toml указана версия 0.1.0, а формальных релизов в репозитории нет.

Что именно перехватывает Steer

Claude Code поддерживает hooks — команды, которые вызываются в определенные моменты агентного цикла. Steer подключается к событию PreToolUse: команда уже сформирована моделью, но инструмент еще не запущен. Утилита читает JSON с именем инструмента и его аргументами, сопоставляет вызов с правилами и возвращает решение Claude Code.

Для каждого совпавшего правила доступно три действия:

  • deny — остановить вызов и объяснить агенту причину;
  • rewrite — заменить аргументы инструмента безопасным вариантом;
  • context — разрешить выполнение, но добавить инструкцию или предупреждение.

Если сработали несколько правил, применяется самое строгое решение: deny сильнее rewrite, а rewrite сильнее context. Это важно для командных конфигураций: более мягкое правило не отменит запрет случайно.

Как выглядит политика на практике

Steer объединяет три слоя конфигурации. Сначала загружаются встроенные правила, затем глобальный файл ~/.config/steer/config.toml, после него проектный .steer.toml. Правило с тем же именем из более позднего слоя переопределяет предыдущее. Чтобы отключение было заметным и проверяемым, для него требуется явный флаг disable.

В комплект уже входят четыре показательных правила:

  • не использовать grep, если в окружении принят fff;
  • не читать файлы через sed, когда доступен инструмент Read;
  • не редактировать файлы одноразовым Python-скриптом вместо Edit;
  • переписывать удаление через rm в обратимое перемещение через trash.

Например, проверка команды выполняется отдельно от агента:

steer check 'cd build && rm -rf dist'
# matched: trash-over-rm
# rewrite: cd build && trash dist

Проект не ограничивается поиском подстроки. Для Bash-вызовов он разбирает сегменты пайплайнов, логические связки, оболочки вроде bash -c и вложенные подстановки. Поэтому правило может найти опасный фрагмент не только в начале простой команды. При этом автор сознательно не обещает универсальный разбор любого shell-синтаксиса: сложные вложенные переписывания могут быть отклонены вместо рискованной автоматической замены.

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

Файл CLAUDE.md и системный промпт описывают желаемое поведение модели. Hook действует на другой границе: между намерением модели и реальным побочным эффектом. Правило можно хранить в репозитории, обсуждать в code review и одинаково применять у всей команды независимо от того, как агент сформулировал план.

Такой слой особенно полезен для повторяемых инженерных ограничений: запретить определенный инструмент, направить агента к принятому внутри проекта CLI, заменить необратимую команду обратимой, предупредить о работе с чувствительным каталогом. Команды steer check и steer validate позволяют проверить политику до подключения hook, а журнал в JSONL фиксирует решения deny, rewrite и context.

Где заканчивается защита

Steer нельзя считать песочницей или полноценной границей безопасности. Он не изолирует файловую систему, сеть, токены и учетные данные. Его правила работают только там, где вызов проходит через настроенный hook Claude Code. Другой процесс, другой агент или прямой запуск команды находятся вне этого контура.

Еще важнее режим отказа. Согласно README, при поврежденном JSON, ошибке конфигурации, неизвестном событии или внутренней панике Steer сообщает о проблеме, но завершает работу так, чтобы не блокировать вызов. Это fail-open: разработчик не теряет рабочую сессию из-за сломанного hook, однако в строгом защитном контуре опасная команда тоже может пройти. Разрешенные вызовы в журнал сейчас не попадают, поэтому лог не является полной аудиторской трассой действий агента.

Есть и эксплуатационная деталь: переписывание rm в trash безопаснее только тогда, когда нужная команда установлена и команда понимает ее поведение. Политика не отменяет необходимость ограничивать права процесса и проверять среду.

Вывод COMRAD404

Steer показывает правильное направление: правила для AI-агента должны жить не только в промпте, но и в исполняемом контрольном слое перед инструментами. Для локальной разработки и единых командных соглашений проект уже интересен — он делает политику явной, версионируемой и проверяемой.

Но версия 0.1.0 — это страховочная сетка, а не zero-trust-контур. Для задач с высокой ценой ошибки ее нужно сочетать с минимальными правами, изолированным окружением, сетевыми ограничениями, ручным подтверждением опасных действий и полным аудитом. Самая полезная идея Steer не в конкретной замене rm на trash, а в самой точке контроля: решение принимается до того, как намерение модели становится изменением системы.

Источники