unlazy · приёмка работы агента · сентябрь 2026

Claude говорит готово, а не сделал: условия приёмки за 10 минут

Карточка репозитория unlazy на гитхабе: счётчик звёзд 3.4k, счётчик форков 228, строка лицензии MIT в правой колонке
Правая колонка карточки репозитория: счётчик звёзд показывает 3.4k, ниже строка лицензии MIT. Кадр снят 14 сентября 2026 года, github.com/Leonxlnx/unlazy

Помощник закрывает задачу словом, а не результатом: 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 - работа не закрыта, и рядом написано, чего не хватило. Дальше по шагам разбираю каждую из трёх команд, откуда взять проверку под свою задачу и где новичок застревает

Начни не с установки, а с вопроса: чем ты САМ отличишь сделанную работу от несделанной. Ответ должен быть командой, которую можно запустить, и короткой строкой, которую она печатает при успехе. Нет такой пары - ставить скилл рано, сначала придумай её

Почему он вообще так делает

Шаблон условия приёмки на гитхабе: видны строки CHECK, EXPECT и EVIDENCE у каждого пункта
Готовый шаблон из скилла: у каждого пункта своя команда проверки (CHECK), ожидаемый ответ (EXPECT) и место под улику (EVIDENCE). Кадр снят 14 сентября 2026 года, templates/gates-leaf.md

У этого поведения есть имя, и оно не про твоего конкретного помощника. По-английски это называется 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. Прочитай условие, не запуская его

Тут стоит барьер, о котором стоит знать заранее, иначе он читается как поломка

Файл проверяльщика gate-check.mjs на гитхабе: он запускает условия приёмки и ставит галочку
Тот самый проверяльщик, которого мы запускаем командой ниже. Он лежит в папке scripts скачанного скилла. Кадр снят 14 сентября 2026 года, scripts/gate-check.mjs

Строка 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 ловит только отметку успеха

Таблица прокручивается вбок →

Что почитать дальше на этом же сайте

Источники

Памятка: приёмка работы агента коротко

Шесть строк, которые закрывают весь разбор

Сохрани себе

  • Нужен Node не ниже 16, проверяется командой node --version
  • Скилл кладётся в ~/.claude/skills/unlazy, проверяется списком файлов в папке scripts
  • Условие живёт в файле GATES.md в папке проекта: описание, CHECK, EXPECT, EVIDENCE
  • Разбор без запуска идёт ключом --status, прогон с запуском ключом --approve
  • Успех это строка ALL MET на экране и галочка [x] в файле
  • Правка команды снимает зачёт, правка заголовка условия не снимает

Куда это ведёт

Приёмка по факту работает не только на коде

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

На Лагере я веду через это за руку, от установки до работающей системы, на живых проектах

Забрать путёвку в ИИ-Лагерь

Кнопка ведёт в мой закрытый канал. Жмёшь «Подать заявку», впускаю сразу, бот пишет в личку и отдаёт путёвку. Бесплатно

Частые вопросы

Это работает только с Claude?

Нет. Скилл кладётся и в Claude Code, и в Codex CLI - папки разные, содержимое одно. А сам файл условий вообще не привязан к помощнику: это обычный текстовый файл с командами, его можно прогонять руками

Нужно ли уметь программировать?

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

Он будет тормозить работу?

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

Что если я просто поставлю галочки руками?

Пока ты не менял команду, они устоят. Но смысл не в том, чтобы обмануть файл - обманывать тут некого, кроме себя. Смысл в том, чтобы отказ приходил через три минуты, а не через полчаса

Он гарантирует, что задача сделана правильно?

Нет, и авторы пишут об этом прямо: проверка подтверждает ровно то, что ты в неё заложил. Она не понимает, честно ли человеческое описание пункта. Сильное условие читает настоящий результат работы и печатает отметку успеха только после всех сверок

Мой канал

Разборы инструментов выходят там раньше

Я Иван Сергеев, собираю системы на ИИ и показываю их в работе: что поставил, что сломалось, что осталось в деле. Такие разборы выходят в канале первыми

Читать канал