Перейти к содержимому
Экосистема AI Vibe

Статьи

Harness engineering: контроль правил агента и где ломается

Andrey 26 августа 2026 г.

Вы дописали правило в .cursor/rules. Агент его прочитал, согласился и через два хода сделал ровно то, что правило запрещает. Иногда с извинением: да, правило было, я его нарушил.

Десяток одинаковых серых файлов правил вокруг одного оранжевого, который не доходит до задачи

Вы дописали правило в .cursor/rules. Агент его прочитал, согласился и через два хода сделал ровно то, что правило запрещает. Иногда с извинением: да, правило было, я его нарушил.

Другой день, другой проект: правило на месте, но в контекст оно не попало вообще, и узнать об этом было неоткуда. Третий случай: попало всё сразу, вместе с вложенными AGENTS.md со всего дерева проекта, и половина окна ушла на инструкции ещё до первой строки кода.

Причины у этих трёх случаев разные: в первом правило конкурирует с задачей внутри промпта, во втором не доходит до модели, в третьем доходит вместе с сотней чужих. Общее одно: вы создали файл в папке проекта, открытой в Cursor, и считаете, что задали агенту дисциплину.

Текст правила не обещает соблюдения

Границу здесь обозначили сами разработчики среды. В треде на форуме Cursor человека спрашивают, как добиться, чтобы агент выполнял требование каждый раз. Отвечает сотрудник Cursor под ником deanrie: «Rules and AGENTS.md get injected into context, but they are a soft constraint». Правила подмешиваются в контекст, но остаются мягким ограничением.

Механика за этой фразой простая. Правило становится частью промпта и конкурирует там с задачей пользователя, историей чата и системной инструкцией. Модель взвешивает всё это вместе, и «не делай X» проигрывает прямому «сделай Y», особенно когда X выглядит коротким путём к Y. Отсюда и извинения: правило действительно было в контексте, агент его действительно видел, соблюдение из этого не следует.

Запрет, который среда не даст нарушить, живёт не в тексте, а в правах: разрешения инструмента и hooks с deny, где команда просто не выполняется. Деструктивные операции git, удаление файлов, миграции на живой базе. Если у вас на это стоит капсом NEVER в .mdc и больше ничего, у вас пожелание, а не запрет.

Практический вывод: разделить два класса требований. То, что нельзя нарушать никогда, уходит в разрешения. То, что описывает, как работать, остаётся текстом правила и живёт с допущением, что иногда его не соблюдут.

Что реально лежит в этих файлах

Чаще всего чужой текст. Коллекция awesome-cursorrules собрала больше 40 тысяч звёзд, и пользуются ей просто: нашли файл под свой стек, скопировали в .cursor/rules/, поставили в шапке alwaysApply: true. Привычка старше нынешнего формата: разбор публичных .cursorrules, того самого одного файла в корне проекта, который Cursor уже считает устаревшим, показал 28,7% дословных копий. Формат сменился на .mdc в .cursor/rules/, способ наполнения остался.

Проекту это не помогает, а чаще вредит. Правило имеет смысл как ответ на сбой, а сбои у каждого свои: в скопированном файле описаны не ваши. При этом он занимает окно в каждом запросе и разбавляет ваши собственные требования.

Своё правило под свой сбой работает. Но писать его руками не нужно: дайте агенту сбой, документацию инструмента и границу, формулировку он выдаст сам.

Ноль срабатываний или шестьсот тысяч токенов

Один и тот же файл ломается в двух противоположных режимах.

Слева: правило лежит рядом с окном контекста и не попадает внутрь, у задачи есть место. Справа: то же окно набито правилами до краёв, задаче места почти не осталось

Слева правило не доходит до модели, справа доходит вместе с сотней чужих.

Первый: правило не подмешалось. На форуме Cursor есть аккуратный замер, который легко повторить: два идентичных .mdc, в каждом запуске у агента спрашивают, какое правило активно. С alwaysApply: true правило сработало три раза из трёх, с false ноль из трёх. Сюда же попадает .md без YAML-шапки в .cursor/rules/: среда такой файл может не читать, а выглядит он как полноценное правило. Часть жалоб «агент игнорирует мои правила» это ровно такой случай: правила в контексте не было.

Второй: подмешалось всё. В монорепозитории Cursor собирает правила и вложенные AGENTS.md со всего дерева, и на простой запрос это выливается в сотни тысяч токенов инструкций, в одном описанном случае около 600k. У Claude Code та же беда по другой причине: правила подмешиваются заново на каждый вызов инструмента, и одни и те же строки уезжают в контекст десятки раз за задачу.

Обе поломки не лечатся спором «.mdc или skills» и «мигрировать ли на AGENTS.md». Первая про загрузку, вторая про бюджет. Формат не отвечает ни на один из этих двух вопросов.

У меня так и устроено: каждый сбой агента я записываю отдельной строкой в файл рядом с проектом, и когда строка повторяется, правило по ней формулирует агент. Замера «копипаст против агента» на одном стеке я не проводил, так что это моя практика, а не результат сравнения. Про среду вокруг модели и цикл до merge есть отдельный разбор, здесь я его не повторяю.

Пять проверок в своём проекте

Всё это делается в открытом окне, минут за десять.

  1. Спросите агента в новом чате, какие правила у него сейчас активны. Файла нет в списке — дальше разбираться незачем, правило до модели не доходит.
  2. Откройте шапку каждого файла. alwaysApply: true грузится всегда, false только при совпадении globs. Во втором случае проверьте, что маска попадает в те файлы, которые агент действительно правит.
  3. Сложите строки всех файлов с alwaysApply: true. Это ваш постоянный расход на каждый запрос, до первой строки задачи.
  4. Если у вас монорепозиторий, посмотрите, сколько вложенных AGENTS.md подтянулось на обычный вопрос. Ответ обычно неприятный.
  5. Прочитайте своё правило, подставив вместо одного проекта другой. Смысл рассыпался — вы описали частность, а не правило.

Дальше начинается то, ради чего проверки и нужны: переписать правило по своим сбоям. У меня для этого есть рецепт, папка recipes/rule-under-a-job/. Там разобрано, из чего состоит правило, как убедиться, что оно срабатывает, и лежат готовые промпты. Их копируете в чат, а текст правила пишет агент из вашего сбоя и документации вашего инструмента. Готовых правил там нет, и это не упущение: моё правило подошло бы вам ровно так же, как файл из коллекции. Рецепт даёт способ, а не текст.

Цифры и цитаты сняты с публичных URL в августе 2026, ваша версия Cursor или Claude Code может вести себя иначе.

Что вы проверяли первым: подмешивание, объём того, что грузится всегда, или нарушение после извинения? И отдельно любопытно: копируете готовые правила с GitHub или поручаете их агенту?

Где читать дальше

Первичная публикация этой статьи — на Хабре, там же идёт обсуждение в комментариях.

Такие разборы выходят раз в пару недель, а между ними остаются вещи на один абзац: сбой агента, правка правила, чужая практика, которую я утащил к себе. Их я пишу в канал AI Vibe News в MAX — подпишитесь, если хотите читать это до того, как оно дорастёт до статьи. Каждый новый рецепт цикла тоже сначала появляется там. Кому привычнее Telegram — зеркало @aivibenews.

Про среду вокруг модели, из которой выросла эта статья: Harness engineering — как за год собрать фабрику из десятка конвейеров.

Откуда пошли правила как основной инструмент: прототип сервиса в правилах Cursor.

Рецепт к этой статье и папки под следующие практики цикла: ai-engineering-recipes на GitHub, лицензия MIT.

Если агентный контур нужен не в своём проекте, а в работе: заказная разработка в AI Vibe Craft.

Источники

  • Хабр: эта статья (первичная публикация)
  • Тред на форуме Cursor: ответ сотрудника про soft constraint
  • Документация Cursor: hooks
  • Документация Cursor: правила, alwaysApply, globs
  • Замер загрузки правила при alwaysApply: true и false
  • Монорепозиторий: правила со всего дерева и переполнение контекста
  • Claude Code: повторное подмешивание правил на каждый вызов инструмента
  • Стандарт AGENTS.md
  • Коллекция awesome-cursorrules
  • Разбор публичных .cursorrules: 28,7% дословных копий
  • Проверка активных правил в новом чате, разбор на русском
  • Рецепт rule-under-a-job — репозиторий ai-engineering-recipes