unlazy · приёмка работы агента · сентябрь 2026
Claude говорит готово, а не сделал: условия приёмки за 10 минут
Помощник закрывает задачу словом, а не результатом: 7 пунктов из просьбы выполнены на 4, и отчёт всё равно бодрый. Спорить бесполезно, спор идёт словами против слов. Разрывает круг файл GATES.md на 4 строки: условие приёмки решает не он и не ты, а команда
Вот весь путь тремя командами, их можно выполнить прямо сейчас. Открой на компьютере окно для команд (как именно - разберу в шаге 1) и скачай скилл:
git clone https://github.com/Leonxlnx/unlazy ~/.claude/skills/unlazy
Перейди в папку своего проекта и создай в ней файл GATES.md с таким содержимым, заменив описание и команду на свои:
- [ ] G1: в прайсе лежат минимум три позиции
CHECK: node scripts/proverka.mjs
EXPECT: прайс собран, строк
EVIDENCE: pending
Запусти приёмку:
node ~/.claude/skills/unlazy/scripts/gate-check.mjs --approve GATES.md
Успех опознаётся по двум приметам: на экране строка ALL MET, а в файле галочка сама переставилась с [ ] на [x]. Видишь FAIL - работа не закрыта, и рядом написано, чего не хватило. Дальше по шагам разбираю каждую из трёх команд, откуда взять проверку под свою задачу и где новичок застревает
Начни не с установки, а с вопроса: чем ты САМ отличишь сделанную работу от несделанной. Ответ должен быть командой, которую можно запустить, и короткой строкой, которую она печатает при успехе. Нет такой пары - ставить скилл рано, сначала придумай её
Почему он вообще так делает
У этого поведения есть имя, и оно не про твоего конкретного помощника. По-английски это называется partial compliance, по-русски - частичное послушание: просьбу из семи пунктов модель выполняет на четыре и честно считает, что закрыла её. Рядом живёт вторая привычка - обрывать работу раньше времени
Цифра, по которой это видно со стороны: в одном из замеров кодовых агентов на длинных задачах лучший прошёл 14,8% контрольных точек, и ни один не довёл задачу целиком. Это не приговор инструменту, это описание жанра: чем длиннее цепочка, тем охотнее она обрывается посередине
Отсюда простая мысль, на которой стоит весь разбор ниже. Спорить с формулировкой «готово» бесполезно, потому что спор идёт словами против слов. Работает другое: заранее договориться, какая команда решает вопрос, и отдать решение ей
Шаг 1. Поставь скилл одной командой
Скилл называется unlazy, у него открытый код и лицензия MIT. На момент съёмки кадра выше у него 3,4 тысячи отметок «нравится» от разработчиков
Сначала двадцать секунд на проверку, иначе установка упадёт непонятной ошибкой. Открой окно, в которое набирают команды: на маке это программа «Терминал», на Windows - PowerShell (кнопка Пуск, набрать это слово). Набери одну строку:
node --version
Дальше два исхода:
- напечаталось число 16 или больше (у меня
v25.9.0) - иди дальше, всё сойдётся - команда не найдена или число меньше 16 - сначала поставь Node с сайта
nodejs.org, кнопкой для своей системы. Без него ни одна команда ниже не выполнится
Вторая проверка, тоже двадцать секунд. Скачивать папку будет отдельная маленькая программа, вот она:
git --version
- напечаталась версия - иди дальше
- «command not found» или «не является внутренней командой» - этой программы на компьютере нет. Возьми её на сайте
git-scm.com, кнопка установки там одна, все галочки в установщике оставляй как есть. После установки закрой окно и открой заново, иначе оно новую программу ещё не увидит
Теперь ставим скилл, одна строка:
git clone https://github.com/Leonxlnx/unlazy ~/.claude/skills/unlazy
Что увидишь: побегут строки загрузки, потом окно вернёт тебя к приглашению для следующей команды. Что это даёт: папка скилла легла по адресу ~/.claude/skills/unlazy, и дальше в статье я подставляю именно этот путь. Запомни его, он понадобится в шаге 3
Значок ~ означает «моя домашняя папка», и PowerShell его понимает так же, как мак. Полный адрес на Windows выглядит как C:\Users\ИмяПользователя\.claude\skills\unlazy, но писать его целиком не нужно
У меня команда отработала за 1,8 секунды и положила 808 килобайт: семнадцать рабочих файлов, никаких сторонних библиотек
Проверить, что всё на месте, можно одной строкой:
ls ~/.claude/skills/unlazy/scripts
Набери её и посмотри на экран: должен появиться список, и в нём файл gate-check.mjs. Это и есть проверяльщик, которым мы будем работать дальше
Пусто или ошибка про несуществующий путь - скачивание не прошло. Самая частая причина: папки ~/.claude/skills ещё нет. Выполни эту строку, чтобы её создать, и повтори установку:
mkdir -p ~/.claude/skills
После неё снова запусти команду скачивания выше, теперь она найдёт куда положить файлы
Есть и второй способ установки, через менеджер скиллов. Введи вместо команды скачивания вот эту строку:
npx skills add Leonxlnx/unlazy
Он кладёт скилл сам и может выбрать другую папку. Если пойдёшь этим путём, посмотри на последние строки его вывода: там напечатан адрес, куда он положил файлы. Подставь его вместо моего во всех командах ниже
Смотри на имя автора внимательно. В поиске рядом лежит такая же по виду копия под другим именем, и она отстаёт почти на месяц: последняя правка в ней старше. Ставить нужно Leonxlnx/unlazy - это исходник, его и обновляют
Шаг 2. Напиши условие приёмки на шесть строк
Это главный шаг, остальное вокруг него
Сначала перейди в папку своего проекта. В том же окне команд набери cd (с пробелом на конце) и перетащи мышкой папку проекта прямо в окно: путь подставится сам. Нажми Enter. Проверить, что ты попал куда надо, можно командой ls - она покажет файлы твоего проекта
Теперь создай в этой папке файл GATES.md. Проще всего попросить об этом того же помощника или создать руками в любом текстовом редакторе: имя ровно GATES.md, заглавными буквами, расширение .md
Внутрь положи один пункт такого вида:
- [ ] G1: в прайсе лежат минимум три позиции
CHECK: node scripts/proverka.mjs
EXPECT: прайс собран, строк
EVIDENCE: pending
Скопируй эти четыре строки в файл и сохрани. Потом убедись, что файл лёг куда надо: набери ls в той же папке, и она должна показать GATES.md среди прочих файлов. Не показывает - файл сохранился в другом месте, перенеси его в папку проекта
Разберём по строкам, потому что каждая работает:
| Строка | Что в неё писать | Кто её читает |
|---|---|---|
первая, с [ ] | человеческое описание того, что должно получиться | ты и помощник, глазами |
CHECK | команду, которая это проверяет: запуск твоей проверки, тест, обращение к сервису | проверяльщик, он её выполняет |
EXPECT | кусок текста, который обязан появиться в ответе команды при успехе | проверяльщик, он его ищет в ответе |
EVIDENCE | ничего, оставь слово pending | проверяльщик, он сам впишет туда результат |
Таблица прокручивается вбок →
Сразу про главную путаницу: scripts/proverka.mjs в примере - это МОЙ файл, у тебя его нет и быть не может. Проверку под свою задачу пишет не рука, а тот же помощник. Скопируй ему эту просьбу целиком:
Напиши мне маленький скрипт-проверку для моего проекта.
Он должен проверить <опиши своими словами, что должно получиться>.
Если всё сошлось - пусть напечатает короткую строку успеха и завершится кодом 0.
Если не сошлось - пусть напечатает, чего именно не хватает, и завершится кодом 1.
Скажи мне, как называется файл и какой командой его запускать.
Помощник вернёт тебе имя файла и команду запуска. Эту команду и вставляй в строку CHECK, а короткую строку успеха - в EXPECT
Условие считается закрытым только когда сходятся две вещи: команда завершилась без ошибки и в её ответе нашёлся текст из EXPECT. Одного из двух мало
Главная ошибка новичка живёт именно тут, и она не выглядит ошибкой. Соблазн написать в EXPECT то число, которое ты сам ждёшь: «позиций 3». Так делать нельзя - получится, что ты подсунул проверке ответ, и она сверит его сама с собой. Правильно наоборот: команда сама считает и сама печатает итог, а EXPECT ловит только отметку успеха
Шаг 3. Прочитай условие, не запуская его
Тут стоит барьер, о котором стоит знать заранее, иначе он читается как поломка
Строка CHECK - это настоящая команда. Она может сделать с твоими файлами что угодно, поэтому скилл специально отказывается запускать её молча. Первый безопасный режим - разбор без выполнения:
node ~/.claude/skills/unlazy/scripts/gate-check.mjs --status GATES.md
Что увидишь на экране, дословно с моего прогона:
UNMET GATES:G1 (unchecked): в прайсе лежат минимум три позиции
GATES.md: 1 gates
UNMET: 1 (met: 0)
Что это даёт: скилл прочитал файл, понял, что условие одно и оно не закрыто, и при этом НИЧЕГО не выполнил. На этом режиме читают чужие условия, пришедшие вместе с чужим проектом
Два режима легко перепутать, вот они рядом:
| Ключ команды | Что делает | Когда нужен |
|---|---|---|
--status | читает файл условий и печатает, что закрыто, а что нет. Ничего не запускает | первый взгляд на чужой файл условий, быстрая сверка «где я стою» |
--approve | показывает команду, спрашивает согласие и выполняет её | когда работа сделана и нужен настоящий вердикт |
--reverify | прогоняет заново ВСЕ условия, включая уже закрытые | после правок, когда старым галочкам верить нельзя |
Таблица прокручивается вбок →
Шаг 4. Разреши прогон и посмотри на отказ
Теперь разрешаем выполнение явно:
node ~/.claude/skills/unlazy/scripts/gate-check.mjs --approve GATES.md
Скилл сначала покажет тебе полностью: какую команду он собирается запустить, какой ответ ждёт, в какой папке и какой оболочкой. Это твоя точка, где можно передумать
А дальше самое ценное. Я нарочно не сделал работу - файла прайса в папке не было. Вот что напечатал экран:
FAIL GATES:G1: в прайсе лежат минимум три позиции
exit=1; EXPECT=not matched; output=файла нет
Никакого «готово». Слово FAIL, причина файла нет и незакрытое условие. Ровно та ситуация из ролика, где помощник бодро отчитывается, а три шага пропущены, только теперь она видна сразу, а не через полчаса проверки руками
Как понять, что получилось
Доделываю работу: кладу файл прайса на три строки и снова выполняю ту же команду. Смотри, как меняется экран, ты увидишь у себя то же самое:
PASS GATES:G1: в прайсе лежат минимум три позиции
exit=0; EXPECT=matched
GATES.md: 1 gates
ALL MET (1 met)
И главное: открываю GATES.md и вижу, что галочка переставилась сама. Было [ ], стало [x], а в строку EVIDENCE скилл вписал длинную запись с цифровой подписью условия и отметкой exit=0; EXPECT=matched
Вот по этим двум словам ты и опознаёшь успех: ALL MET на экране и [x] в файле. Больше ничего смотреть не нужно
А если у тебя другой случай
Задача большая и делится на части. Тогда вместо одного файла собирается дерево: у каждой части свой файл условий, и родительский пункт не закрывается, пока не закрылись все дочерние. Файлы живут в папке .unlazy/<имя-куска>/, а собирает их тот же проверяльщик с ключом --scope.
Хочешь несколько агентов одновременно. Это отдельный режим, и он не включается промптом. Каждый параллельный кусок обязан заранее объявить, какие папки он трогает (строка OWNS:), и занять их командой с ключом --claim. Проверки при этом по умолчанию идут по очереди, а не разом: разрешение на параллельный прогон включается отдельно, ключом --jobs с числом от 1 до 64. Здесь стоит поправить популярное обещание из роликов: «дай промт, чтобы он запускал агентов параллельно» мимо. Параллельность тут не уговор, а координация через объявленные папки.
Хочешь, чтобы он физически не мог закончить разговор. Есть отдельная надстройка - она блокирует завершение хода, пока условия не закрыты:
node ~/.claude/skills/unlazy/scripts/install-hooks.mjs
Ставь её осознанно: она правит настройки твоего проекта. И знай про предохранитель - после шести подряд заблокированных попыток она отпускает сама, чтобы не запереть тебя в цикле
Условие оказалось невыполнимым. Не стирай пункт. У скилла для этого есть отдельная запись ABANDON: с обязательной причиной, и она честно уводит задачу в статус «передано человеку», а не в «успешно закрыто».
Что ломается и что с этим делать
UNMET … checked but automatic evidence is stale or unbound. Самая полезная ошибка из всех. Она значит: галочка [x] стоит, но условие после этого меняли, и старая улика к новому условию не относится. Я поймал её специально: поменял в готовом файле саму команду CHECK и оставил галочку. Скилл мгновенно снял зачёт. Что делать - прогнать условие заново.
APPROVAL REQUIRED и команда не выполнилась. Так и задумано: сработал предохранитель. Прочитай показанную команду и, если она твоя, запусти с ключом --approve.
Галочка стоит, а работа не сделана. Здесь честная граница инструмента, и о ней стоит знать. Цифровая подпись связывает команду, ожидаемый ответ и рабочую папку, но НЕ связывает человеческий текст условия. Я переписал заголовок пункта с «минимум три позиции» на «минимум пять позиций», не тронув команду, и скилл спокойно напечатал ALL MET: команда-то не менялась. Вывод простой - смысл несёт команда, а не заголовок. Хочешь поднять планку, меняй CHECK, а не описание.
Команда работает у тебя и не работает у проверки. Скилл запускает её своей оболочкой и печатает, какой именно. Если команда опирается на инструменты, которых в этой оболочке нет, она упадёт. Проще всего писать проверки так, чтобы они запускались файлом из самого проекта.
Что забрать с собой
Готовая карточка на один экран: каркас, обе команды и признак успеха. Она работает сама по себе, без этой статьи рядом
Шаг первый, выполнить один раз на компьютере, чтобы поставить скилл:
git clone https://github.com/Leonxlnx/unlazy ~/.claude/skills/unlazy
Шаг второй, положить в папку проекта файл GATES.md и заменить в нём три места:
- [ ] G1: <что должно получиться, человеческими словами>
CHECK: <команда, которая это проверяет>
EXPECT: <кусок текста, который команда печатает при успехе>
EVIDENCE: pending
Шаг третий, прогнать. Сначала введи эту строку, чтобы посмотреть, что внутри, ничего не запуская:
node ~/.claude/skills/unlazy/scripts/gate-check.mjs --status GATES.md
Потом разрешить прогон и увидеть вердикт:
node ~/.claude/skills/unlazy/scripts/gate-check.mjs --approve GATES.md
Успех опознаётся по двум приметам: на экране строка ALL MET, а в файле GATES.md галочка сама переставилась с [ ] на [x]. Видишь FAIL и причину рядом - работа не закрыта, доделывай и запускай ту же команду ещё раз
Условие оказалось невыполнимым - не стирай пункт, а допиши строку с причиной, вот образец:
ABANDON: G1 сервис оплаты не отдаёт тестовый режим, проверку переносим на человека
И таблица на будущее - что этот инструмент ловит, а что нет. Она отвечает на вопрос, который возникает уже после первой удачной приёмки:
| Что произошло | Поймает ли | Что делать |
|---|---|---|
| Работа не сделана, команда падает | да, FAIL и условие открыто | доделать и повторить --approve GATES.md |
Команда прошла, но текст EXPECT не совпал | да, EXPECT=not matched | сверить, что именно печатает команда при успехе |
| После зачёта поменяли команду проверки | да, stale or unbound, зачёт снят | повторить --approve GATES.md |
| После зачёта поменяли заголовок условия | нет, зачёт устоит | планку менять командой, а не описанием |
| Условие невыполнимо в принципе | да, если записать ABANDON: с причиной | отдать задачу человеку осознанно |
| Команда сама себе подсунула ожидаемое число | нет, это на тебе | пусть команда считает, а EXPECT ловит только отметку успеха |
Таблица прокручивается вбок →
Что почитать дальше на этом же сайте
- 22 скилла для Claude Code с командами установки - если этот зашёл, рядом лежит два десятка других
- Агенты для Claude Code: разбор для новичка - что такое агент и зачем их несколько
- Как поставить скиллы с гитхаба - подробный разбор той самой команды установки
- Установка Claude Code с нуля - если помощника ещё нет
- Скрапинг сайта без кода - другая задача, тот же подход: говоришь словами, проверяешь результатом
Источники
- Страница unlazy на гитхабе - звёзды, лицензия MIT, история правок
- README скилла - команды установки, формат условия, режимы работы
- SKILL.md скилла - правила написания условий и границы доверия
- Шаблон условия приёмки - строки CHECK, EXPECT, EVIDENCE
- SlopCodeBench - замер, откуда взята цифра 14,8% контрольных точек
- Quantifying Laziness - разбор частичного послушания и раннего обрыва
Памятка: приёмка работы агента коротко
Шесть строк, которые закрывают весь разбор
Сохрани себе
- Нужен Node не ниже 16, проверяется командой node --version
- Скилл кладётся в ~/.claude/skills/unlazy, проверяется списком файлов в папке scripts
- Условие живёт в файле GATES.md в папке проекта: описание, CHECK, EXPECT, EVIDENCE
- Разбор без запуска идёт ключом --status, прогон с запуском ключом --approve
- Успех это строка ALL MET на экране и галочка [x] в файле
- Правка команды снимает зачёт, правка заголовка условия не снимает
Куда это ведёт
Приёмка по факту работает не только на коде
Ты завёл одно условие и получил отказ вместо бодрого отчёта. Тот же ход переносится на любую свою работу: заранее назвать, чем меряется результат, и отдать решение проверке, а не настроению
На Лагере я веду через это за руку, от установки до работающей системы, на живых проектах
Кнопка ведёт в мой закрытый канал. Жмёшь «Подать заявку», впускаю сразу, бот пишет в личку и отдаёт путёвку. Бесплатно
Частые вопросы
Это работает только с Claude?
Нет. Скилл кладётся и в Claude Code, и в Codex CLI - папки разные, содержимое одно. А сам файл условий вообще не привязан к помощнику: это обычный текстовый файл с командами, его можно прогонять руками
Нужно ли уметь программировать?
Нужно уметь запустить одну команду в чёрном окне. Саму проверку тебе напишет тот же помощник: попроси его сделать команду, которая проверяет твой результат и печатает короткую отметку успеха
Он будет тормозить работу?
Разбор файла условий ничего не запускает и стоит долю секунды. Время занимают только сами твои проверки, ровно столько, сколько они шли бы и без скилла
Что если я просто поставлю галочки руками?
Пока ты не менял команду, они устоят. Но смысл не в том, чтобы обмануть файл - обманывать тут некого, кроме себя. Смысл в том, чтобы отказ приходил через три минуты, а не через полчаса
Он гарантирует, что задача сделана правильно?
Нет, и авторы пишут об этом прямо: проверка подтверждает ровно то, что ты в неё заложил. Она не понимает, честно ли человеческое описание пункта. Сильное условие читает настоящий результат работы и печатает отметку успеха только после всех сверок
Мой канал
Разборы инструментов выходят там раньше
Я Иван Сергеев, собираю системы на ИИ и показываю их в работе: что поставил, что сломалось, что осталось в деле. Такие разборы выходят в канале первыми