Терминал в Devin Desktop умеет собирать команду из фразы на естественном языке, и это снимает знакомую боль - вспоминать точный синтаксис редкой утилиты. Соблазн ровно здесь: раз команда сгенерирована инструментом, её принимают за правильную и запускают. Но сгенерированная команда - это предложение, а не гарантия, и доверие к ней по факту генерации и есть главный риск.
Разберём сперва, что терминал действительно даёт. По Cmd/Ctrl+I он превращает описание намерения в командную строку прямо в терминале. Выделение плюс Cmd/Ctrl+L отправляет кусок вывода - например, stack trace - агенту как контекст. Активный терминал можно приложить к разговору через @-mention, чтобы агент рассуждал о том, что в нём происходит. Это три разных действия: генерация, передача вывода и передача самого терминала.
Ключевое различение - генерация не означает безопасность. Модель собирает синтаксически верную команду по вашему описанию, но не знает вашего окружения: какие псевдонимы подменяют имена, чему равны переменные, в какой директории вы стоите, что раскроет glob и куда уйдёт перенаправление вывода. Синтаксически корректная команда может делать совсем не то, что вы имели в виду, и терминал выполнит её буквально.
Отсюда короткая проверка до запуска, а не после. Разверните псевдонимы и переменные до их реальных значений. Убедитесь в рабочей директории. Прочитайте, что именно захватит glob и куда пойдёт redirection. Посмотрите на сетевой адрес, если команда куда-то обращается. И отдельно спросите себя, есть ли у команды необратимый эффект - удаление, перезапись, push, деплой. Минута такой развёртки дешевле любого отката.
Дальше начинается путаница, которая стоит отдельного разбора: у слов "разрешить" и "запретить" здесь две разные модели. Auto-execution levels и списки allow/deny, описанные на странице терминала, относятся к Cascade. Devin Local их не использует - у него собственная модель прав по типам инструментов: чтение, запись, исполнение, сетевой fetch и MCP. Одна и та же по звучанию настройка живёт в двух разных системах.
Разница не косметическая, а поведенческая. В Cascade deny list не блокирует команду наглухо, а вызывает запрос подтверждения - последнее слово за человеком в момент запуска. В Devin Local явный deny блокирует действие: не спрашивает, а не даёт. Значит, перенеся ожидание из Cascade, что "оно же переспросит", в Devin Local, вы либо упрётесь в жёсткий запрет там, где ждали диалога, либо, наоборот, оставите на allow то, что в старой модели переспрашивалось.
Почему держат две модели сразу, а не одну. Cascade несёт наследие своей эпохи с уровнями авто-исполнения и списками команд, и старые процессы на нём продолжают работать. Devin Local переписан вокруг явных прав по типам инструментов, где запрет - это запрет, а не вежливый вопрос. Совмещать их в переходный период - цена того, что никто не ломает работающие настройки в один день; расплата за это - обязанность знать, чья модель действует в текущей вкладке.
Цена невнимания к этому различию - выполненная команда, которой вы не ждали. Опасная строка, принятая как "сгенерирована - значит безопасна", сносит не тот каталог или отправляет запрос не туда. Deny, понятый по-кэскейдовски как "переспросит", в Devin Local молча блокирует нужное - и вы теряете время, ища несуществующий диалог. Оба исхода - следствие одного: команду и права оценили не в той модели.
Проверять стоит дважды и разными способами. До запуска - развёрткой команды в реальные значения, как выше; это ловит намерение. После - взглядом на эффект: тот ли каталог изменился, тот ли адрес отвечал, вернулся ли ожидаемый код возврата. А прежде обоих шагов - убедиться, какой агент исполняет вкладку и, значит, чья модель прав в ней действует. Три взгляда снимают почти все "почему оно так сделало".
У самой Cascade-модели уровни авто-исполнения не бинарны, и знать их полезно даже при миграции: от полного ручного подтверждения через список разрешённого и режим, где агент сам судит о риске и только на premium-моделях, до варианта, исполняющего всё, кроме запрещённого. В командах администратор может ограничить максимальный уровень и задать общие списки. Devin Local этих уровней не наследует - тем важнее не переносить их логику на его права по типам инструментов.
Типичные провалы узнаваемы. Запустили сгенерированную команду не глядя - и glob захватил лишнее. Ждали от deny подтверждения в Devin Local - и не поняли, почему действие просто не произошло. Настроили allow/deny в Cascade и решили, что это касается Devin Local, - две системы, одна настройка не переносится. Признак общий: команду запустили или настройку задали, не назвав ни окружение под командой, ни агента под вкладкой. Назвать их первыми - и терминал перестаёт удивлять.