Доступ агента к shell: семь развилок, которые пришлось решить
Семь решений, от которых зависит, можно ли выпускать автономию агента: подтверждения, отдельная учётка, файлы с ключами, источник релиза, проверяемое «готово», координация и объём релиза.
Короткий ответ
Дать агенту доступ к shell — это не одно решение, а семь. Пять из них про машину, а не про модель: что разрешено запускать без вопроса, под какой учётной записью это происходит, кто может прочитать файл с ключами, собирается ли прод из коммита и что вообще разрешено называть словом «готово». Мы проверили все семь на своём продукте и оставили узкий режим доступа, пока не сделана изоляция.
Три независимых разбора одного и того же пакета дали две фактические ошибки. Обе закрыла одна проверка на сервере. Публиковать стоит именно это: судьям надо отдавать результаты проверок, а не пересказ задачи.
Технический разбор продукта, наблюдение 28 октября 2026. Это не бенчмарк, не независимый аудит и не утверждение, что Tvijo лучше другого инструмента. Оценок здесь нет намеренно: все числа наши, с датой и способом перепроверки.
Семь развилок одной таблицей
| Развилка | Вопрос простыми словами | Дешёвое умолчание | Что выбрали мы | Чего это стоит | Что изменит решение |
|---|---|---|---|---|---|
| Подтверждения | Убрать вопросы совсем или оставить под ними пол? | Убрать все подтверждения | Внутри изолированной задачи вопросов нет; жёсткие запреты остаются полом | Каждой задаче нужна своя рабочая копия | Песочница, которая доказуемо не достаёт до прода |
| Права | Работать от администратора или от отдельной учётки? | От root, потому что так уже работает | Отдельная учётка с пустым домашним каталогом | Создание учётной записи, владение результатами, отключение shell для входа | Доказательство, что песочница уже закрывает те же пути |
| Ключи | Пообещать, что ключи не передаются, или сделать их нечитаемыми? | «Мы не кладём ключи в окружение» | Права на файлы плюс явный список монтирования | Аудит всех читателей до ужесточения | Машина без других локальных учёток |
| Источник релиза | Править работающую копию или собирать из коммита? | Править копию — быстрее | Сначала коммит, потом пересборка и рестарт; до этого правки не существует | Окно рестарта и шаг пересборки | Выкатка, которая по построению читает только собранный артефакт |
| Завершение | Верить «готово» модели или проверять? | Верить отчёту агента | Предикаты движка по классу задачи | Движок обязан записывать каждый вызов инструмента | Класс задачи, для которого проверки пока нет |
| Координация | Читать журналы сессий других агентов или доску? | Скармливать сырые журналы модели | Небольшая детерминированная доска: владелец, pid, задача, рабочая копия | Heartbeat и скрипт без модели внутри | Очередь, которая сама сообщает состояние |
| Объём релиза | Выпустить автономию или проверенную автономию? | Выпустить функцию сейчас | Узкий режим, пока не закрыты первые пять развилок | Публичный релиз позже | Изоляция, которая приедет раньше, чем ожидалось |
Ни одна из семи не экзотическая. Каждую дёшево решить неправильно и дорого обнаружить это позже.
Два режима доступа на пяти командах
Политику команд из выпущенного пакета мы прогнали без исполнения и записали решение по каждой команде в обоих режимах.
| Команда | Узкий режим (разбор и граница папки) | Широкий режим (прямой shell на хосте) |
|---|---|---|
git push origin main |
сначала спросит: команда уходит с машины | выполнит без вопроса |
git push --force origin HEAD:main |
откажет | выполнит без вопроса |
git -C . reset --hard |
откажет | выполнит без вопроса |
rm -rf всей папки рабочего дерева |
заблокирует граница папки | выполнит без вопроса |
crontab -r |
выполнит без вопроса | выполнит без вопроса |
Читать таблицу надо как поведение, а не как оценку безопасности. Три команды из пяти переходят из «отказ или вопрос» в «без вопроса». Пятая строка — честная: у узкого режима правила для планировщика тоже не было. Короткий список шаблонов защищает от случайной ошибки, но не является границей — и список, который достаточно короток, чтобы его прочитать, достаточно короток, чтобы обойти его другим написанием той же команды.
Где три разбора разошлись и что показала проверка
Один и тот же пакет ушёл трём ревьюерам из разных семейств моделей. В порядке работ они совпали, в вопросе изоляции разошлись. Оба расхождения решила проверка на машине, а не спор.
| Утверждение ревьюера | Что показала проверка | Что это меняет |
|---|---|---|
| «Отдельная учётка не достанет до рабочего дерева, значит выбор — либо открыто, либо недоступно» | Дерево читается всеми, но записывать в него может только владелец | Реальный выбор — «читает, но не пишет»: для кода хватает, для ключей нет |
| «Отдельной учётки достаточно» | Кто прочитает файл, решает режим самого файла, а старые копии файла с ключами сохраняют свой режим | Учётка — первый шаг; граница — список монтирования и режимы файлов |
| «Настоящая изоляция требует своей контейнерной платформы» | Песочница уже установлена, а в проекте уже был записан контракт песочницы | Надо переиспользовать её. Строить платформу не требовалось |
Ревьюеры пропустили и то, что находится одной командой статуса: супервизор воркера на этой машине падал шесть дней. Ни один разбор об этом не сказал, потому что ни одному не поручали смотреть на живое состояние. Доска с процессами показала бы это сразу.
Что разрешено называть «готово»
Движок возвращает done, когда сама модель написала done. На этом пути нет счётчика реально выполненных инструментов. Для ответа в чате это нормально; для задачи, которая заявляет правку кода, — нет.
| Класс задачи | Что движок может проверить сам | Чего недостаточно |
|---|---|---|
| Изменение кода | Записанная движком правка, затем запущенная движком проверка после последней правки | Модель цитирует прошедший тест, которого не запускала |
| Ответ на исследовательский вопрос | Хеш дерева не изменился, в журнале есть чтения, на которых держится ответ | Уверенный ответ без единого вызова инструмента |
| Диагностика | Проба есть в журнале, и код возврата в ответе совпадает с записью журнала | Правдоподобная причина, придуманная из текста задания |
Тот же принцип уже применён к ревью: ревьюеру засчитывается завершённое структурное событие, а не код выхода ноль.
Какой чек мы хотим на каждую задачу
- Что изменено, по путям.
- Какие проверки запустил сам движок и в каком порядке относительно последней правки.
- Деньги по метру — из леджера, а не из отчёта агента.
- Расход подписки в вызовах и токенах отдельной колонкой, без пересчёта в доллары.
- Кого спросили и что ответили.
Пятый пункт и есть коммерческая причина заводить чек. Один и тот же вопрос стоил $0,0038 на самой дешёвой полосе и $0,0693 на самой дорогой: восемнадцать цен за один и тот же ответ из восьми пунктов. Без чека выбор ревьюера — вкус; с чеком это маршрутизация, которую можно перепроверить позже.
Чего мы намеренно не делаем
- Не строим свою контейнерную платформу, если песочница уже есть.
- Не отправляем сырой журнал чужой сессии платной модели, чтобы узнать, чем занят агент.
- Не выпускаем широкий режим доступа раньше изоляции.
- Не продаём «ключи не наследуются окружением» как границу безопасности. Это утверждение о процессе, а не о файле.
⚠️ Когда это НЕ работает
- Один человек, одна машина, других локальных учёток нет. Большинство из семи развилок схлопывается в «неважно»; изоляция тогда покупает воспроизводимость, а не защиту.
- Грязное начальное состояние. Если рабочая копия уже изменена, «дерево изменилось» ничего не доказывает. Нужен хеш или снимок на старте, иначе проверка — театр.
- Медленные или нестабильные тесты. Если прогон занимает час, «движок запустил проверку после правки» превращается в формальность. Держите короткий список быстрых проверок и говорите, какие были обязательны.
- Агент, который вообще не вызывает инструменты. Наша исходная проблема была именно такой: агент сообщил об отказе, не попробовав. Проверка завершения это не лечит — сначала проверяется сама возможность.
- Жёсткий бюджет. Второе мнение стоит денег. Разница в восемнадцать раз — повод маршрутизировать по классу задачи, а не повод всегда покупать дорогого ревьюера.
Запросить разбор ваших развилок
Если вы выбираете, с чего начать на своей машине, форма ниже спрашивает, какую из семи развилок разобрать первой. Мы отвечаем тем, что изменили бы, в каком порядке и что нужно увидеть на вашей стороне. Оплата здесь не принимается, доступ к системам не выдаётся, ключи и пароли присылать не нужно.
Метод и источники
Наблюдение 28 октября 2026. Проверено: выпущенный пакет расширения, снимок исходников, конфигурация работающего сервиса и политика команд в том виде, в каком она выпущена. Измерено: решение политики по пяти командам в двух режимах, стоимость трёх разборов из леджера транспорта и состояние процесса супервизора.
Не делалось и не заявляется: тест на проникновение, независимый аудит, нагрузочный бенчмарк, платная активация клиента, реальный пилот с заказчиком. Страница описывает решения и их цену, а не сертификат безопасности.
Отдельно: четыре числа на этой странице наши, и каждое пересчитывается по артефактам, сохранённым вместе с задачей. Где утверждение проверить не удалось, оно названо утверждением ревьюера, а не фактом.
Что читать дальше
- Права и данные: что рабочая среда может прочитать, а что остаётся вне доступа.
- Расходы и бюджеты: почему потолок одного вызова не равен потолку задачи.
- Сравнение продукта: три входа в один продукт и что умеет каждый.
🔗 Связи статьи
Открыть полный граф знаний ↗Следующие шаги
Связанные материалы
DSHREM robustness audit, October 2026
Six defects found in cancellation, retry, fallback and cost accounting. One money bug is fixed and covered by tests; five remain open with exact locations.
Расходы, доступ и восстановлениеRecovery after a failed, stuck or uncertain run
No automatic paid retries, an uncertain task blocks further spend, and reconcile never resends inference. The exact commands to get unstuck.
Расходы, доступ и восстановлениеPermissions and data flow
What leaves your machine, what stays local, and which actions need an explicit human decision — including the licence question people skip.
Расходы, доступ и восстановлениеRunning a Tvijo pilot and measuring the benefit
A pilot that can be judged: one workflow, one acceptance check, four numbers per week, and exit criteria agreed before the first task.
💬 Комментарии