Настройка Cursor быстро превращается в свалку, если не ответить на один вопрос: какой слой владеет этим решением. Механизмов много - настройки редактора, правила, навыки, субагенты, hooks, разрешения, внешние серверы, плагины, - и почти любое требование можно выразить несколькими способами. Проблема в том, что несколько способов одновременно дают не надёжность, а противоречие: инструкции конкурируют, контекст растёт, а поведение перестаёт быть объяснимым. Настройки редактора при этом сохраняют привычную иерархию областей, а агентные файлы добавляют свою, и эти две иерархии живут рядом, не пересекаясь.
Наивный подход - записывать требование везде, где получится, чтобы точно сработало. На практике это приводит к обратному. Одно и то же правило в пользовательских настройках, командных, файле проекта и навыке начинает жить своей жизнью: где-то его поправили, где-то забыли, и теперь никто не может сказать, какая формулировка действует. Хуже того, дублирование съедает контекст и снижает вес каждой отдельной инструкции: четыре похожих, но не совпадающих требования модель разбирает не как одно усиленное, а как повод выбирать.
Правильная модель - один владелец на решение. Оформление и поведение редактора - это настройки. Постоянная инструкция проекту - правило или файл контракта в репозитории. Повторяемый многошаговый процесс - навык. Специализированная роль с отдельным контекстом - субагент. Блокировка или аудит действия - hook, разрешения или песочница. Внешняя система - сервер по протоколу инструментов. А доставка всего этого набора между проектами - плагин. Владелец назначается один раз и до следующего осознанного пересмотра, а не выбирается заново каждый раз, когда что-то потребовалось поправить.
Полезно один раз свести задачи и механизмы в таблицу с колонкой почему. Ниже такая карта. Ценность её в третьей колонке: она объясняет, почему именно этот механизм подходит - детерминированное поведение интерфейса, версионируемый контекст, инструкции по требованию, изоляция исследования, детерминированное принуждение, типизированные инструменты, версионируемый набор. Эта колонка и есть рабочий инструмент: когда для нового требования не находится внятного почему, значит, вы пытаетесь положить его не туда.
| Задача | Лучший механизм | Почему |
|---|---|---|
| Оформление и поведение редактора |
| Настройки |
| Детерминированное поведение интерфейса |
| Постоянная инструкция проекту | Правило проекта или AGENTS.md | Версионируемый контекст рядом с кодом |
|---|
| Повторяемый многошаговый процесс | Навык | Инструкции, скрипты и материалы по требованию |
|---|
| Роль со своим контекстом | Субагент | Изоляция исследования от основного разговора |
|---|
| Блокировка или аудит действия | Hook, разрешения, песочница | Детерминированное принуждение |
|---|
| Внешняя система | Сервер по протоколу инструментов | Типизированные инструменты и ресурсы |
|---|
| Доставка набора между проектами | Плагин | Версионируемый переносимый набор |
|---|
Ключевое различение внутри этой карты - между тем, что направляет, и тем, что принуждает. Правила и навыки направляют: они влияют на решения модели, но не гарантируют результат. Разрешения, песочница и hooks принуждают: они срабатывают одинаково независимо от формулировки. Если требование должно выполняться всегда, оно живёт в принуждающем слое; если это стиль работы - в направляющем. Смешение этих двух ролей - главный источник ложного чувства безопасности.
Разница видна на обычном требовании: перед завершением задачи прогнать тесты. Записанное правилом, оно работает в большинстве случаев и не работает ровно тогда, когда важнее всего: задача длинная, контекст переполнен, до конца осталось одно действие, и модель считает шаг необязательным. Записанное hook на событие завершения, оно выполняется всегда, а стоит одного скрипта и одной строки конфигурации. Разница между этими двумя вариантами не в качестве формулировки, а в том, участвует ли требование в рассуждении или стоит вне его.
Есть и практический признак того, что слои выбраны верно. Любое требование должно быть объяснимо одной фразой вида это живёт здесь, потому что. Если объяснение звучит как на всякий случай продублировали, слой выбран не тот. И наоборот: когда у каждого требования один дом, поведение системы становится читаемым - вы можете открыть конкретный файл и увидеть, что именно действует, вместо того чтобы собирать итог из четырёх источников в голове.
Ошибку со слоями обычно замечают в одном и том же месте: поведение расходится между людьми. У одного агент всегда запускает проверку типов, у другого нет; у одного отказывается трогать каталог инфраструктуры, у другого спокойно правит. Первая реакция - подозревать модель или версию, но почти всегда причина в том, что требование лежит в пользовательском слое у одного и отсутствует у второго. Отсюда правило диагностики: расхождение между машинами - это вопрос про слой, а не про модель, и начинать надо с того, кто владеет требованием.
Инженерный вывод простой: не дублируйте требование в четырёх местах. Выберите владельца, оставьте в остальных местах ссылку или ничего, а принуждение вынесите в детерминированный слой. Это сокращает контекст, делает поведение объяснимым и резко упрощает диагностику, когда что-то работает не так, как ожидалось. Проверить набор настроек можно одним упражнением: взять любое требование и назвать файл, в котором оно живёт. Если назвать не получается, у требования нет владельца.
Типичные провалы предсказуемы. Записать одно требование в четыре разных места и получить противоречие. Ждать от правила гарантии, которую даёт только hook или разрешения. Держать командную политику там, откуда её легко снять локально. Списывать расхождение поведения между людьми на модель. И настраивать инструмент по частям, не задав себе вопрос, какой слой должен владеть решением.