SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-25

Навык unlazy и метод Depth Tree для агентов

Узнайте, как навык unlazy предотвращает преждевременное завершение задач агентом. Разбираем работу Depth Tree, структуру PLAN.md, настройку gates файлов и стоимость ресурсов.

Для чего нужен навык unlazy

Навык unlazy — это агентский навык, созданный для устранения одной проблемы: когда агент по написанию кода сообщает о выполнении работы до того, как она фактически завершена. В его основе лежит Depth Tree — метод, который разбивает задачу на уровни и считает реальной работой только самый нижний уровень. В версии 2 принудительное выполнение было перенесено из текстовых описаний в файлы, поэтому агент должен подтверждать завершение списком исполняемых команд, а не просто утверждать, что всё готово.

Навык опубликован пользователем Leonxlnx на github.com/Leonxlnx/unlazy под лицензией MIT. Данное руководство написано для версии 2.0.0, выпущенной 2026-08-10. Навыки в этой области быстро меняются, поэтому ознакомьтесь с CHANGELOG в репозитории, прежде чем внедрять что-либо из этого в рабочую среду.

Навык в данном контексте означает стандартный объект: файл SKILL.md, который загружается в контекст модели, когда задача соответствует его описанию. Если этот механизм вам в новинку, начните с что такое агентский навык и как он загружается. unlazy представляет собой обычный markdown-файл и несколько Node-скриптов, поэтому ему не требуется собственный сервер или API-ключ.

Почему агенты останавливаются на 80 процентах и пропускают третью инструкцию

Это поведение имеет узнаваемый шаблон. Вы запрашиваете четыре вещи. Ответ охватывает первую, вторую и четвертую. В итоговом резюме все четыре пункта отмечены как выполненные. Ошибок не возникло, поэтому система ничего не зафиксировала, и вы обнаруживаете пробел только неделю спустя.

В README проекта unlazy это явление обосновывается опубликованными исследованиями «лени» моделей, цитируя «преждевременное усечение ответов и частичное выполнение многосоставных запросов» (ссылка на arXiv 2512.20662). В том же README прямо изложена концепция проектирования: проза не может принудительно исполнять прозу. Призыв к агенту «постараться сильнее» — это лишь еще больше прозы, добавленной в тот же контекст, который привел к неполному результату.

Именно поэтому версия 2 хранит свое состояние в файлах. Флажок в GATES.md находится вне зоны усмотрения модели. Либо под ним есть строка с подтверждением, либо ее нет, и скрипт может сообщить вам об этом без обращения к агенту.

Дерево глубины, слой за слоем

Дерево глубины — это декомпозиция с правилом, определяющим, где именно должна выполняться работа. Из справочника по методу:

Разделяйте по естественным границам, используйте бинарное разделение там, где это позволяют естественные границы, на глубину N слоев.
Листья — единственные места, где выполняется реальная работа; каждый слой выше них предназначен для декомпозиции и интеграции.

Лист — это нечто большее, чем просто пункт списка. Справочник устанавливает минимальный порог размера:

Лист — это реальная единица работы. Десять или более минут сфокусированных усилий, один связный результат, один файл с изменениями.

Этот порог не дает глубокому дереву превратиться в имитацию бурной деятельности. Если лист содержит задачу «переименовать переменную», он не проходит проверку, а значит, разделение на уровне выше было избыточным.

Каждый лист проходит четыре этапа: полная реализация без заглушек, перечитывание с позиции эксперта в предметной области, поиск дефектов и полировка там, где она не требует усилий. Эти этапы — еще одна причина, по которой для листа нужен минимальный размер. Выполнение четырех этапов для двухминутного изменения — это пустая трата времени.

Вы выбираете глубину при вызове навыка:

/unlazy tree 5 refactor the payment module

Простой язык тоже подходит, так как описание навыка сопоставляется с намерением, а не с конкретной командой:

tree 3 build the landing page and do not stop until every gate is checked

Справочник предлагает диапазоны глубины. tree 2 или 3 — это функция, исправление ошибки или документ, выполняемые в одиночку за один сеанс и состоящие из 2–4 листьев. tree 4 или 5 — это подсистема, рефакторинг или серьезный обзор, где 8–16 листьев — это «больше, чем может эффективно удержать в контексте один человек». tree 6 или 7 — это целый проект, выполняемый в оркестрированном режиме, где листья распределены по независимым единицам работы.

Если вы не указываете глубину, навыку дается команда «выбрать наименьшее N, при котором листья соответствуют естественным частям задачи», с явным запретом на углубление по умолчанию. Глубина описывает работу, поэтому завышение числа не повышает качество.

Как выглядит файл шлюзов (gates file)

Перед началом любой работы агент записывает критерии приемки в файл шлюзов. Каждый шлюз представляет собой флажок с командой под ним.

# Gates: pricing section

- [ ] G1: three tiers render with real copy
  CHECK: node check.js pricing --tiers
  EXPECT: 3/3 tiers ok
  EVIDENCE: pending

- [ ] G2: annual toggle changes both price and label
  CHECK: node check.js pricing --toggle
  EXPECT: toggle ok
  EVIDENCE: pending

CHECK — это команда. EXPECT — это вывод, который считается успешным прохождением. EVIDENCE начинается с pending и должен быть заменен на то, что фактически вывела команда. В состав skill входит scripts/gate-check.mjs для сканирования этих файлов и формирования отчета о том, какие шлюзы все еще открыты; это позволяет проводить аудит выполнения без чтения протокола (transcript).

Философия укладывается в одну строку, и SKILL.md фиксирует ее именно так:

Отчет — это набор утверждений, подкрепленных журналом операций, а не субъективное ощущение завершенности.

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

Пишите шлюзы так, чтобы их мог запустить посторонний человек. «Выглядит хорошо» — это не проверка. test -s dist/index.html && echo ok, выводящая ok, — это проверка, так как она явно завершается ошибкой при пустом или отсутствующем файле.

Контракт PLAN.md перед началом параллельной работы

Когда дерево становится достаточно широким и ветви начинают выполняться в отдельных контекстах, они перестают разделять общие допущения. Ссылка на метод устанавливает контракт перед разделением потоков (fan-out):

Контракты перед разделением потоков. Интерфейсы, владение данными, именование и соглашения об ошибках вносятся в PLAN.md до того, как любая из ветвей начнет работу.

Причина этого конкретна. Если двум субагентам поручить «добавить обработку ошибок», они придумают две разные структуры ошибок, и обе ветви пройдут свои проверки, так как каждая из них локально корректна. Ошибка проявится только в точке их взаимодействия. В этот момент вступают в силу шлюзы ветвей (branch gates): шлюзы ветви доказывают, что «дочерние элементы объединены, интерфейсы совпадают, сквозное поведение работает, регрессии отсутствующих связей отсутствуют».

В режиме оркестрации драйвер передает каждому субагенту раздел контракта из PLAN.md, а не весь файл и не историю самого драйвера, вместе с файлом шлюзов для этой конкретной ветви. Когда субагент возвращает результат, драйвер самостоятельно перезапускает проверки. Субагент, который «отметил выполнение задач без доказательств», отправляется на доработку с указанием конкретных невыполненных шлюзов.

У оркестрации есть нижний предел. Если объем реальной работы составляет менее получаса, руководство рекомендует работать в одиночку, так как каждому субагенту приходится заново формировать понимание задачи, и затраты на эту настройку превышают выгоду от привлечения дополнительного внимания.

Как установить навык unlazy?

Поддерживаемый способ — использование CLI для навыков:

npx skills add Leonxlnx/unlazy

Ручная установка выполняется путем клонирования в каталог навыков вашего агента:

git clone https://github.com/Leonxlnx/unlazy ~/.claude/skills/unlazy
git clone https://github.com/Leonxlnx/unlazy ~/.codex/skills/unlazy

Затем проверьте, что файлы на месте:

ls ~/.claude/skills/unlazy/SKILL.md

Вывод пути означает, что файл находится на диске. Ошибка No such file or directory означает, что клонирование произошло в другое место. Обычно это случается, если каталог навыков не существовал под тем именем, которое вы предполагали, и git создал новый. Не полагайтесь на сообщения агента. В README также есть предупреждение: «Не утверждайте, что навык установлен, пока не убедитесь, что файл действительно находится на диске».

Для окружения без загрузчика навыков вставьте содержимое SKILL.md в системный промпт или файл правил. Это документированный резервный метод; именно поэтому он работает в Claude Code, Codex, Cursor и любых других инструментах, которые читают обычные файлы инструкций в формате markdown. Если вы хотите узнать, что обеспечивает надежную загрузку SKILL.md, в разделе написание собственного навыка агента описаны frontmatter и соответствие описания, которые определяют, будет ли навык запущен.

Работает ли Stop hook вне Claude Code?

Нет, и здесь важно быть точным. Всё, что описано выше — это инструкции, а инструкции можно игнорировать. Единственным элементом структурного принуждения является Stop hook, и это функция именно Claude Code.

node <path-to-skill>/scripts/install-hooks.mjs            # this project only (settings.local.json)
node <path-to-skill>/scripts/install-hooks.mjs --global   # every project
node <path-to-skill>/scripts/install-hooks.mjs --uninstall

Stop hook срабатывает в тот момент, когда агент пытается завершить свой ход. Этот хук сканирует файлы gates и блокирует завершение, пока условия не выполнены, поэтому ход не может закончиться с непроверенным пунктом. Он считывает файлы и не выполняет вызовы модели, поэтому в README указано, что он не расходует токены. Общий механизм и другие события, к которым можно привязаться, описаны в как работают хуки Claude Code во время хода.

У него есть предохранительный клапан, что важнее, чем кажется на первый взгляд. Если агент не продвигается в выполнении условий на протяжении шести последовательных заблокированных попыток завершения, хук разрешает выход с предупреждением вместо того, чтобы удерживать процесс. Строка ABANDON: <gate> <reason> всегда воспринимается как честный выход. Без этих двух механизмов выхода условие, которое невозможно выполнить в вашей среде, расходовало бы токены до тех пор, пока вы сами не завершили бы сессию.

В Codex, Cursor или любой другой среде у install-hooks.mjs нет компонентов для установки. Вы по-прежнему получаете файл gates и исполняемые проверки, но ничто структурно не мешает модели завершить ход раньше времени. В таких случаях файл gates является лишь документом, который вы должны прочитать самостоятельно.

unlazy или ponytail: что выбрать?

Эти два навыка стали популярными в одном сезоне и работают с объемом задач в противоположных направлениях, из-за чего их легко перепутать.

ponytail заставляет агента вести себя как старший разработчик, который первым делом спрашивает, нужно ли вообще писать этот код. Он сокращает область задач, отдает предпочтение стандартной библиотеке и уменьшает размер diff. unlazy исходит из того, что область задач уже согласована, и направляет усилия на то, чтобы каждая часть работы была завершена и проверена.

Выбирайте навык в зависимости от того, с какой проблемой вы сталкиваетесь. Если ваш агент превращает небольшую функцию в полноценный фреймворк, вам нужен навык ponytail и его персона ленивого старшего разработчика. Если агент оставляет невыполненным третий пункт из четырех и отчитывается об успехе, вам нужен unlazy.

Возможно использование обоих навыков, и порядок имеет значение. Сначала определите область задач с помощью вопроса ponytail, а затем передайте согласованный объем работы в обработку unlazy. Если сделать наоборот, вы создадите множество лишних компонентов для работы, которую ponytail удалил бы, и в итоге потратите ресурсы на их реализацию. Этот порядок — моя рекомендация, а не задокументированная интеграция между двумя проектами.

Какова стоимость глубины (depth) при работе агента на VPS?

Глубина — это множитель усилий, а усилия — это токены. На VPS, где агент работает с использованием вашего API-ключа, этот множитель напрямую конвертируется в деньги.

ChartEffort and cost multipliers reported by the unlazy authors, August 2026
The data behind this chart
[
  {
    "label": "Skill run vs no skill, output tokens",
    "low_multiplier": 1.6,
    "high_multiplier": 3.9
  },
  {
    "label": "tree 6 vs tree 3, total cost",
    "low_multiplier": 1.0,
    "high_multiplier": 1.5
  }
]

Это показатели авторов, полученные в ходе их собственного тестирования от 2026-08-10. Мы не воспроизводили эти результаты, поэтому воспринимайте их как общую тенденцию, а не как прогноз. Режим Solo повышает производительность примерно в 1.63.9 раз относительно базового уровня. При этом переход от дерева 3 к дереву 6 в рамках одного контекста дает прирост лишь в 1.01.5 раз, что значительно меньше восьмикратного увеличения, ожидаемого от трех дополнительных бинарных ветвлений.

Увеличение глубины не приводит к пропорциональному росту затрат, так как глубина перераспределяет усилия, а не добавляет контексты. Справочник по экономике токенов прямо указывает, где скрывается основной множитель: «Стоимость умножает оркестрация, и это оправдано, так как каждый узел (leaf) получает свежий контекст». Режим Solo умножает выходные токены внутри одного контекста. Режим оркестрации умножает контексты, и каждый новый контекст перед выполнением полезной работы заново считывает контракт и файл ограничений (gates file).

Существует вторая статья расходов, которую легко упустить из виду, и она также упомянута в справочнике. Один монолитный глубокий запуск в их тесте «потребил около 58 миллионов кэшированных входных токенов», так как единственный постоянно растущий контекст содержал в себе всё. Кэшированные входные данные стоят дешевле в расчете на токен, но при таких объемах они всё равно отражаются в счете.

Из этого следуют четыре рекомендации по настройке:

  • Выбирайте минимально необходимую глубину, при которой узлы представляют собой реальные единицы работы, и останавливайтесь на этом. Лишняя глубина — это лишние расходы.
  • Используйте режим Solo для задач длительностью менее получаса, так как затраты на настройку субагентов в этом случае превышают выгоду от свежего контекста.
  • Установите хук Stop, если используете Claude Code. Это единственная часть системы, которая работает бесплатно.
  • Установите жесткий лимит расходов на уровне аккаунта перед запуском любых длительных процессов.

Последний пункт — самый важный. Навык, спроектированный так, чтобы игнорировать ранние остановки, по своей сути будет продолжать работу до последнего. Бюджетирование и оповещения — это задача, отдельная от написания промптов, и в статье контроль расходов агента на VPS описаны лимиты, которые стоит внедрить в первую очередь.

Что измеряли авторы и что это доказывает

В репозитории опубликован собственный тест, что встречается реже, чем следовало бы. Их методика, цитата из README: «две задачи по сборке с нуля (маркетинговый сайт и солнечная система на three.js), три условия для каждой (без навыка, tree 3, tree 6), одна чистая папка и новая сессия на каждый запуск, одна и та же модель, одинаковое тело промпта. Каждый результат проходил проверку кода независимыми агентами, проходил состязательную перепроверку и тестирование в реальном браузере».

ChartPer-run counts claimed in the unlazy README, August 2026
The data behind this chart
[
  {
    "label": "Self-found defects fixed, skill runs",
    "low_count": 4,
    "high_count": 10
  },
  {
    "label": "Wrong numbers in report, skill runs",
    "low_count": 1,
    "high_count": 3
  },
  {
    "label": "Wrong numbers in report, baseline runs",
    "low_count": 0,
    "high_count": 0
  }
]

Прочитайте среднюю строку дважды. В собственном тесте авторов запуски с использованием навыка выявили от 4 до 10 дефектов, которые агент обнаружил самостоятельно до сдачи работы, при этом каждый запуск с навыком в итоге выдавал отчет, содержащий от 1 до 3 неверных чисел, по сравнению с 0 в базовых запусках. Больший объем работы привел к лучшим сборкам, но к худшим сводкам. Именно этот вывод лежит в основе правила реестра и инструкции перепроверять каждое число во время составления отчета или помечать его как непроверенное.

Стоит запомнить еще один их результат: «Единственный критический сбой в реальных условиях произошел в базовой сборке, при этом в отчете утверждалось, что ситуация была обработана». Уверенная сводка поверх нерабочей сборки — это именно то, на предотвращение чего направлены шлюзы (gates).

Теперь об ограничениях. Шесть запусков, две задачи по сборке, одна модель, запуск и отчет выполнены самим автором навыка. Здесь нет независимой репликации, и мы приводим это как утверждения авторов по состоянию на 2026-08-10. Протестируйте это на своей работе: выполните одну и ту же задачу дважды, один раз в обычном режиме, а другой — с файлом шлюзов, затем подсчитайте количество закрытых шлюзов с доказательствами, которые вы можете воспроизвести самостоятельно. Это число — единственное в данной области, которое принадлежит вам.

FAQ

Что такое Depth Tree в навыке unlazy?

Это метод декомпозиции. Задача разбивается по естественным границам на N уровней, и только листья внизу считаются работой. Навык определяет лист как десять или более минут сфокусированных усилий с одним связным результатом и одним файлом gates. Если лист можно завершить за две минуты, значит, разбиение зашло на один уровень слишком глубоко. Каждый уровень над листьями — это декомпозиция и интеграция, и каждая ветвь содержит собственные gates, подтверждающие, что дочерние элементы объединены, а интерфейсы соответствуют друг другу. Вы выбираете глубину при вызове, например tree 5, а задокументированное значение по умолчанию — это минимальная глубина, при которой листья являются реальными единицами работы.

Работает ли навык unlazy вне Claude Code?

Частично. Навык представляет собой обычный markdown, поэтому Codex, Cursor и любой инструмент, читающий SKILL.md или системный промпт, могут использовать Depth Tree, файл gates, исполняемые проверки и четыре прохода на каждый лист. Жесткое принуждение работает иначе. Stop hook, который блокирует завершение хода, пока требования gates не выполнены, является функцией Claude Code, устанавливаемой с помощью node <path-to-skill>/scripts/install-hooks.mjs. В других средах ничто структурно не мешает модели завершить ход раньше времени, поэтому именно вы читаете файл gates и отправляете его обратно.

Насколько навык unlazy увеличивает счет за токены?

Авторы сообщают о 1.63.9 кратном увеличении выходных токенов по сравнению с запуском без навыка в одиночном режиме, плюс несколько сотен токенов накладных расходов на сам файл gates. Углубление внутри одного контекста по сравнению с этим практически бесплатно: примерно 1.01.5 раз при переходе от дерева 3 к дереву 6. Оркестрированный режим — самый дорогой, так как каждый лист требует нового контекста, который перед началом работы заново считывает контракт и его gates. Stop hook не добавляет расходов, так как он только сканирует файлы. Это цифры авторов по состоянию на 2026-08-10, мы их не перепроверяли.

Что использовать: unlazy или ponytail?

Выбирайте навык в зависимости от возникшей проблемы. ponytail предназначен для агента, который пишет слишком много, так как он имитирует старшего разработчика, который задается вопросом, нужно ли вообще писать этот код, и в первую очередь обращается к стандартной библиотеке. unlazy предназначен для агента, который выполняет слишком мало из того, что вы просили, так как он принуждает к декомпозиции и отказывается закрывать gate без доказательств. Если вам нужно и то, и другое, сначала определите область задач с помощью ponytail, а затем передайте эту область в unlazy, чтобы не тратить множитель усилий на работу, которую следовало бы удалить.

Почему мой агент все равно останавливается раньше времени после установки unlazy?

Проверьте четыре вещи. Во-первых, убедитесь, что навык находится на диске с помощью ls ~/.claude/skills/unlazy/SKILL.md, так как клонирование в несуществующую директорию — частая ошибка. Во-вторых, убедитесь, что файл gates был написан до начала работы, так как hook сканирует файлы gates, и при отсутствии GATES.md ему не на чем блокировать процесс. В-третьих, проверьте, где был установлен hook: обычный запуск install-hooks.mjs записывает данные только в settings.local.json текущего проекта, поэтому для другого проекта потребуется --global. В-четвертых, помните, что предохранительный клапан работает согласно проекту: шесть последовательных заблокированных остановок без прогресса по gate позволяют агенту продолжить работу с предупреждением, а строка ABANDON: <gate> <reason> намеренно завершает попытку.