Настройки Devin живут не в одном файле, а в нескольких: ваши личные, командные и локальные машинные. Пока они согласны, разницы не видно; но как только один файл разрешает то, что другой запрещает, нужно точно знать, чей ответ окажется итоговым, - иначе вы доверяете permission или настройке, которая на деле перекрыта. А узнать это постфактум - значит обнаружить, что действие, которое вы считали разрешённым, тихо не выполнялось, или, хуже, выполнялось то, что вы считали закрытым.
Наивный ход - применить привычную логику конфигов: выигрывает самый специфичный файл, или последний по времени правки, или тот, где вы только что дописали allow. Кажется естественным: добавил разрешение - получил возможность. С обычными настройками так и работает.
Ломается это на слиянии прав. Permission-решения объединяются не по правилу "кто последний, тот и прав": deny на более высоком уровне не перебивается allow на более низком. Если организация запрещает Exec(sudo), ваш личный allow на Exec(sudo) не даст ничего - организационный запрет всегда выигрывает. Понадеявшись на обычную логику, вы будете уверены, что выдали право, которого на самом деле нет.
Начать стоит с трёх файлов и их ролей. Ниже - карта: где какой конфиг лежит, за что отвечает и коммитится ли он. К ней возвращаются всякий раз, решая, куда положить настройку, чтобы она попала в нужную область и не утекла туда, где ей не место.
Порядок авторитета выстроен сверху вниз. Выше всего - organization и командные настройки: их нельзя переопределить. Затем session grants - интерактивные подтверждения, живущие только в памяти сессии. Ниже - project-local (.devin/config.local.json), project (.devin/config.json) и, в самом низу, user (~/.config/devin/config.json). Но поверх всей этой лестницы действует одно правило: при объединении решений deny всегда выигрывает. Session grants стоят высоко неслучайно: подтверждение, выданное в живой сессии, перекрывает файловые настройки, но живёт только в памяти и исчезает вместе с сессией, не превращаясь в постоянное право.
Почему так устроено. Organization наверху, чтобы политику команды нельзя было тихо отменить на своей машине. Deny-wins - чтобы ограничение никогда не ослаблялось разрешающим слоем, добавленным ниже. Безопасность в этой модели складывается вверх, а не вниз: жёсткое сверху держит, мягкое снизу не пробивает. Это делает поведение предсказуемым в команде, где у разных людей разные локальные конфиги. Побочная выгода - отладка: если поведение расходится между двумя машинами, причину ищут не в равноправных файлах, а в том, на каком уровне лежит решающий deny или организационная политика.
| Файл | Назначение | Commit |
|---|---|---|
| ~/.config/devin/config.json | Личные глобальные настройки | Нет |
| .devin/config.json | Командная project policy | Да |
| .devin/config.local.json | Локальные overrides | Нет |
У project config намеренно узкая область. В .devin/config.json допустимы лишь три категории: permissions (правила allow, deny, ask), import settings через read_config_from (чтение форматов Cursor, Windsurf, Claude) и hooks. Всё остальное - выбор модели, тема, keymap, proxy, сетевой фильтр sandbox, автообновление, атрибуция, включение subagents - это user-only поля; в командном файле они игнорируются, и класть их туда не следует. Это не произвол, а защита: командный файл коммитится и действует у всех, поэтому в нём разрешено ровно то, что осмысленно делать политикой команды, а личные предпочтения и машинные детали остаются за его пределами.
Пара практических деталей снимает частые вопросы. Формат - JSON с комментариями: разрешены и строчные //, и блочные /* */, поэтому области можно подписывать прямо в файле. На Windows глобальный путь находится в %APPDATA%\devin\. А конфигурация MCP вынесена в отдельные файлы mcp_config.json (user, project, project-local) - её здесь не ищут.
Проверять эффективное право нужно не по одному файлу, а по слитому результату - и помнить, что deny где-либо выше бьёт allow ниже. Если возможность "не включается", не добавляйте новые allow вслепую: сначала ищите deny на более высоком уровне. Один взгляд вверх по лестнице чаще всего и есть ответ, а не ещё одно разрешение в своём файле. Полезно и обратное правило: прежде чем что-то разрешать в личном конфиге, убедитесь, что это не запрещено выше, - иначе вы потратите время на allow, который никогда не вступит в силу.
Типичные провалы повторяются из проекта в проект. User-only поля кладут в .devin/config.json и удивляются, что они не действуют. Пытаются перебить верхний deny нижним allow - и получают всё тот же запрет. Коммитят в общий project-файл секреты или личные overrides - и либо создают утечку, либо навязывают команде своё. Ждут, что project-local окажется выше организации, - и ошибаются в приоритете. Признак один и тот же: "я же разрешил, а оно всё равно блокируется". Ответ почти всегда - deny на более высоком уровне; сначала посмотрите вверх, потом правьте.