- BrainTools - https://www.braintools.ru -
Мне нужно было спарсить собственные статьи с Хабра. Не для красоты — для анализа: я веду полевой журнал метрик по каждой публикации, и руками сводить рейтинги, закладки и комментарии в таблицу надоело. Задача из тех, что откладываются месяцами, потому что «несложная».
А тут Anthropic выложила официальную библиотеку промптов для Claude Code — около 50 промптов, собранных из их же гайдов, с объяснением «Why this works» у каждого. В телеграм-канале я уже писал: сами промпты банальны, читать надо объяснения. Но между «писать про паттерны» и «проверить паттерны на живой задаче» — пропасть. Так две отложенные вещи встретились: я взял пять промптов из библиотеки, один скилл Мэтта Покока (github.com/mattpocock/skills [1]), задачу с парсером — и почти два часа чистого времени.
Сразу дисклеймер: я дизайнер, не разработчик. Обычно это пишут как извинение. Здесь это условие эксперимента — библиотека обещает работать «для всех ролей», вот и посмотрим, что происходит, когда на вопросы агента отвечает человек, который половины ответов не знает.
Что получилось, если коротко: агент выдумал мой ник, нашёл статью, которую я сам потерял, написал 51 тест — а скилл Покока довёл меня до желания закрыть терминал. Обо всём по порядку.
Библиотека промптов Claude Code — официальная, живёт в документации: code.claude.com/docs/en/prompt-library [2]. Около 50 промптов, собранных из гайдов самой Anthropic — Common workflows, Best practices и блога о том, как её собственные команды используют Claude Code. Организована по фазам жизненного цикла — Discover → Design → Build → Ship → Operate — и по ролям: инженеры, продакты, дизайн, документация, безопасность.
Устройство каждого промпта важнее его текста. Слоты {placeholder} под твою задачу, секция «Why this works» — объяснение паттерна, и секция «Make it stick» — как закрепить решение насовсем: сохранить как скилл, записать правилом в CLAUDE.md [3]. Про промпт-инжиниринг как дисциплину я уже писал (разбор для не-промпт-инженеров [4]), а открытые промпты Anthropic препарировал в анатомии production-агента [5] — эта статья продолжает обе линии, но иначе: не чтением, а прогоном.
Паттернов, ради которых библиотека стоит внимания [6], четыре: описывать результат вместо пошаговой инструкции; вшивать самопроверку в тот же промпт; давать референс существующей реализации вместо ТЗ; ставить измеримую цель с бинарным критерием готовности. В анонсе в канале [7] я разобрал их на бумаге. Дальше — как они ведут себя в поле.
Пять прогонов по паттернам библиотеки плюс скилл grill-me на той же вводной — гриль в итоге прогнался дважды, почему — расскажу в сцене 6. Всё на одной модели (Opus 4.8, Claude Code v2.1.197), каждый прогон — чистая сессия, посторонние скиллы отключены. Промпты сцен 1 и «correction → rule» — дословные из библиотеки с подстановкой в слоты; промпты сцен 2, 4 и 5 — мои формулировки, построенные по паттернам (в библиотеке они показаны на других примерах). Единственная сквозная добавка — хвост «Ask your questions in Russian», чтобы отвечать быстро.
Правила гигиены: провалы агента не чинить руками, промпты не редактировать задним числом, всё фиксировать — логи сессий, заметки по горячим следам, история коммитов. Репозиторий открыт, прогоны воспроизводимы.

Первый промпт — из фазы Discover, тот, что превращает размытую идею в спецификацию:
I want to build {feature}. interview me about implementation,
UX, edge cases, and tradeoffs until we have covered everything,
then write the spec to SPEC.md
В слот {feature} я подставил «a Habr corpus parser» и добавил хвост «Ask your questions in Russian» — эту добавку я делал во всех прогонах, чтобы отвечать быстро и по делу. Фиксирую честно: это отклонение от дословного промпта.
Дальше началось то, ради чего промпт и существует. Агент повёл интервью раундами — 18 вопросов шестью блоками, каждый с вариантами ответов, отмечай нужное. Цель корпуса. Источники статей. Объём сейчас и в перспективе. Что извлекать: код, формулы, картинки, комментарии. Метаданные. Авторизация. Поведение [8] при повторном запуске. Обработка сбоев. Интерфейс. Зависимости — про них я не думал вовсе, а агент спросил, потому что того требовало правило из CLAUDE.md [3].
Заметка по горячим следам, дословно из моего рабочего файла: «то, чего обычно не хватает в начале — часто не знаешь, что предусмотреть. Тут это закрывается».
На третьем раунде я сломался. Вопросы про структуру хранения — «по авторству, плоско или по дате?» — упёрлись в честное «не понимаю, как лучше». Я так и написал. Промпт из библиотеки явно рассчитан на человека, который знает ответы. Агент не завис и не стал переспрашивать то же самое другими словами — он сменил режим: «давай объясню на пальцах и дам свою рекомендацию — тебе останется согласиться или поправить». Разложил варианты, у каждого назвал цену, предложил решение с обоснованием под мою же цель. Дальше я отвечал «согласен» — и это тоже данные эксперимента: паттерн выдержал не-разработчика.
Через двадцать минут в репозитории лежал SPEC.md [9] — 14 разделов, 260 строк: структура корпуса, формат frontmatter с YAML-примером, инкрементальная докачка, edge cases вплоть до статьи с пустым телом и внезапно изменившейся вёрстки Хабра, конфиг. По виду — результат пары дней вдумчивого проектирования.
А теперь два факта об этой спеке, которые я узнал позже.
Факт первый. В примере конфига агент указал контактный email для User-Agent — мой настоящий. Я его не называл ни в одном ответе. Откуда? Позже проверил: git config user.email [10]. Агент взял адрес из окружения — честно и по делу.
Факт второй. Строкой выше, в том же конфиге, — мой username на Хабре: vitalijturov. Звучит правдоподобно. Одна проблема: такого аккаунта на Хабре не существует. Мой ник — VitTurov, и в окружении его не было нигде. Агент спросил меня, как определять «свои» статьи, я ответил «по username из конфига» — а сам username он не уточнил. Слот остался без источника — и заполнился выдумкой.

Вот что здесь важнее самого факта галлюцинации. Реальный email и выдуманный ник стоят в спеке рядом, с одинаковой уверенностью, без единого маркера, где знание, а где догадка. Механизм один и тот же: заполни слот лучшим доступным. Есть источник в окружении — будет правда. Нет источника — будет правдоподобие. Что проверять в выводе агента: не всё подряд, а те значения, для которых источника в окружении не было. Email я бы нашёл при вычитке за секунду — он бросается в глаза. Выдуманный ник дожил бы до продакшена: он выглядит правильнее правильного.
И ещё одна деталь, про которую вспомним в самом конце статьи. Агент подробно расспрашивал, откуда парсер будет брать статьи, — источники, фильтры, способы задать список. А в это время в корне репозитория лежал urls.md [11] — готовый список из девяти статей, ради которых всё и затевалось. За всё интервью агент ни разу не сделал ls. Запомни этот файл — он ещё сыграет.
Второй паттерн библиотеки — описывать результат, а не последовательность действий. Никаких «создай файл», «начни с клиента», «используй requests». Моя команда, новая сессия:
Parse the articles listed in urls.md: for each one, save a markdown file to corpus/ with title, publication date, hubs, tags, rating, bookmark count, and the full article text
Первое, что сделал агент, — прочитал urls.md [11]. Тот самый файл, который в интервью пролежал незамеченным. Разница между прогонами ровно одна: здесь имя файла стояло в промпте. Запомним и это: агент исследует то, на что указали пальцем, — к вопросу вернёмся в финале.
Второе действие удивило сильнее. Прежде чем писать хоть строчку кода, агент пошёл щупать реальность: несколько аккуратных запросов к API Хабра — проверить, в каком виде приходят данные. И тут спека из прогона A получила первый удар фактом. В ней уверенно значилось: закладки без авторизации недоступны, поле останется пустым. Живой API ответил: favoritesCount отдаётся публично, бери и пользуйся. Спецификация, рождённая из двадцатиминутного интервью, проиграла одному запросу длиной в секунды. Интервью собирает мнения — разведка собирает факты.
Дальше агент работал сам, и вопросов было три — все три об одном. Правило из моего CLAUDE.md [3] «перед установкой новой зависимости — спроси» заставляло его останавливаться на каждом пакете. В итоге он выторговал у самого себя минимализм: из пяти библиотек, заложенных в спеку, поставил одну — markdownify для конвертации HTML в текст, остальное собрал на стандартной библиотеке Python. Вот находка, которой нет ни в «Why this works», ни у Покока: паттерн «результат вместо шагов» обещает автономность, а твои же правила в CLAUDE.md [3] её ограничивают. Это не баг — это ручка громкости: чем больше правил «спроси меня», тем чаще агент останавливается. Крутить её — твоя работа, а не выбор между «есть правило» и «нет правила».
По пути агент честно доложил о несоответствии: CLAUDE.md [3] обещает Python 3.12, в системе — 3.9.6. Не завис, не сломался — собрал на том, что есть, и вынес мне решение на потом. А единственный реальный баг за прогон — библиотека разметки спотыкалась на узлах без атрибутов — он поймал собственным smoke-тестом и починил сам. Я узнал об этом из лога.
Итог прогона: 15 минут, семь файлов кода, 9 статей в corpus/ — заголовки, даты, хабы, теги, рейтинги, закладки, полные тексты, комментарии деревом. Ноль ошибок. Заметка по горячим следам: «минимум вопросов, всё собрал и без ошибок».
И последнее, тихое. В конфиге парсера агент написал me: VitTurov — правильный ник. Тот самый, который в спеке был выдуман. Никто не указывал ему на ошибку [12]: он прочитал urls.md [11], увидел реальные URL — и галлюцинация умерла при первом контакте с данными. Выдумка из прогона A прожила ровно до того момента, когда у агента появился источник. Это второй урок про слоты: галлюцинация — симптом отсутствия данных в окружении. Дай данные — и она исправится сама, молча, даже не извинившись.
Третий паттерн — вшивать самопроверку: «write tests, run them, fix failures». Новая сессия, промпт дословно по формуле библиотеки:
Write tests for the field extraction, run them, and fix failures until they pass
Сценарий, который я ждал: тесты падают, агент итерирует, красное становится зелёным — красивая петля для скриншота. Сценарий, который получил: агент изучил код, задал два вопроса (снова про зависимости — pytest ставить или нет; сошлись на unittest из стандартной библиотеки, и рекомендацию с аргументами он опять дал сам на моё «посоветуй как лучше»), написал 44 теста — и все 44 прошли с первого содержательного запуска. Единственная починка за прогон — инфраструктурная: тестовая папка не считалась пакетом, добавил init.py. Шесть минут, петля «тест → фикс → тест» не понадобилась.
Чинить было нечего — и вот почему. Вернись на сцену назад: агент уже самопроверился в прогоне B, без всякой просьбы — smoke-тест конвейера, проверка качества по всем спарсенным телам, самостоятельно пойманный баг. Паттерн «вшивай самопроверку» из библиотеки частично съеден поведением [13] самой модели: она делает это по умолчанию, промпт лишь оформляет привычку в артефакт.
Значит ли это, что промпт бесполезен? Нет — у него сменилась работа. Разовые проверки агента живут и умирают внутри сессии; 44 теста остались в репозитории насовсем. Это уже не проверка — это страховочная сетка для всех будущих сессий. Натянута она не зря — увидим в следующей сцене.
Четвёртый паттерн — вместо описания требований дать агенту референс существующей реализации: «посмотри, как сделано это, и сделай то же самое так же». В библиотеке он показан на примере webhook-обработчиков: изучи, как устроен обработчик GitHub, и собери такой же для Stripe. Моя версия под задачу: парсеру нужна была команда author — скачивать все статьи автора через листинг, а не по ручному списку.
Look at how the urls command is implemented to understand the pattern, then build an author command the same way: fetch all articles of a given Habr user through the API listing
Дальше случилось то, чего не было ни в одном прогоне до этого: агент не задал ни одного вопроса. Прочитал существующий код, спеку, сделал один пробный запрос к листингу API — и сформулировал сам: неясностей, где ответ не очевиден из спеки и существующего паттерна, не осталось. Восемь минут спустя команда работала. Заметка по горячим следам: «без вмешательств, всё решено».
Тут стоит остановиться и посмотреть на ряд целиком. Вопросов ко мне по прогонам: 18 → 3 → 2 → 0. Восемнадцать в интервью на пустом репозитории. Ноль — когда в репозитории накопились спека, код и конвенции. Кривая падает не потому, что агент поумнел, — модель одна и та же. Она падает, потому что ответы переехали из моей головы в файлы. Контекст в репозитории — это ответы на незаданные вопросы.
«Сделай так же» агент понял глубже, чем я вкладывал. Он не скопировал цикл обработки — вынес общий код, чтобы две команды делили одну логику [14]. Он передал один и тот же экземпляр HTTP-клиента из листинга в скачивание — чтобы вежливая задержка между запросами к Хабру сохранялась сквозь всю цепочку, и прокомментировал зачем. А после рефакторинга сам прогнал все 44 теста из прошлой сцены — «чтобы убедиться, что ничего не сломал». Никто не просил. Сетка, натянутая в сцене 3, поймала свой первый прыжок.
А теперь кульминация прогона, которую не планировал никто. Живой запуск author VitTurov вернул из API 10 статей. В urls.md [11] их было 9.
Этот список мы собирали вдвоём с Claude в чате: я — по памяти [15], он — поиском по вебу, с перекрёстной проверкой. Мы оба были уверены, что список финальный. И мы оба пропустили статью про локальную Gemma 4, опубликованную месяц назад, — я забыл, а поиск её не выдал. Команда, которую агент собрал за восемь минут по референс-паттерну, нашла потерю первым же запросом к листингу.
Иерархия надёжности источников, прочувствованная на собственной статье: память человека < поисковая выдача < прямой запрос к API. Мы с Claude вдвоём проиграли одному честному эндпоинту.
Пятый паттерн — ставить агенту измеримую цель с бинарным критерием готовности. У Anthropic пример про латентность; для парсера я сформулировал аудит полноты:
Run a completeness check over the corpus: every article must have a non-empty title, publication date, hubs, tags, rating, bookmark count, and body. Zero empty fields; if a field cannot be filled, log it explicitly instead of leaving it blank
Агент сделал ровно то, что нужно делать с измеримой целью: сначала измерил. Быстрый фактический прогон по корпусу — все 10 статей полны, ноль пустых полей, критерий закрыт с первого прохода. Что, честно говоря, оценка прогонов B–D, а не этого промпта.
Интересное началось после. Агент не отрапортовал и не закрыл сессию — он принёс мне развилку: на Хабре рейтинг бывает нулевым и даже отрицательным, закладок может быть ноль. «Ноль пустых полей» — это как: ноль тоже пусто, или пусто — только null? Сейчас нулей в корпусе нет, уточнил он, но для будущих прогонов трактовка меняет всё.
Вот это место я бы вставил в рамочку. Мой критерий выглядел бинарным — «ноль пустых полей», что может быть однозначнее. А оказался недоопределённым, и заметил это не я. Измеримая цель из библиотеки работает — но определение измеряемого всё равно приходит от человека, и хорошо, когда агент приходит за ним, а не выбирает молча.
Второй вопрос агента был «оставить проверку разовым прогоном или закрепить?» — и мой ответ «закрепить» превратил аудит в команду validate: с построчным отчётом, логом пропусков и exit-кодом для CI. Плюс восемь тестов на саму проверку — сьют вырос до 51, все зелёные. У Anthropic в библиотеке каждый промпт заканчивается секцией «Make it stick» — как закрепить разовое решение насовсем. Здесь этот цикл прожился за одну сессию длиной в две минуты: проверка → инструмент → тесты.
Заметка по горячим следам после этого прогона — самая честная за день: «выскакивают решения, которые я не совсем понимаю». Это цена, о которой стоит сказать прямо: чем автономнее агент, тем чаще его решения пролетают мимо твоего понимания. В прогоне A я не понимал вопросов — к прогону E перестал успевать за ответами. Для разработчика это повод заглянуть в diff. Для не-разработчика — момент, когда доверие строится на тестах, логах и валидации: код всё равно не прочитать. Собственно, агент их к этому моменту уже построил.
По плану был шестой прогон — «Turn a correction into a rule»: когда агент повторяет одну и ту же ошибку, промптом you keep {mistake}. add a rule to CLAUDE.md [3] so this stops happening превращаешь поправку в постоянное правило. Промпт пролежал наготове все пять сессий — и не понадобился: агент ни разу не повторил ошибку дважды. Единственный содержательный провал — выдуманный ник — исправился сам при контакте с данными, до правила дело не дошло. Честный итог: не каждому паттерну достаётся повод. Но замечу, что правило-то сработало — в обратную сторону: три строки моего CLAUDE.md [3] стреляли в каждом прогоне, от вежливых задержек до допроса про каждую зависимость.
У каждого промпта в библиотеке Anthropic есть секция «Make it stick» — как закрепить разовое решение: сохранить как скилл, записать правилом в CLAUDE.md [3]. Библиотека честно говорит: промпт — одноразовый, настоящая ценность начинается, когда паттерн переезжает в инструмент. И есть человек, который прошёл этот путь до конца и выложил результат: Мэтт Покок, автор Total TypeScript, опубликовал свои скиллы для Claude Code «прямо из папки .claude» — репозиторий mattpocock/skills, 154 тысячи звёзд на момент сдачи этого текста. Его позиционирование — «Skills for Real Engineers, not vibe coding».
Самый известный скилл репозитория — /grill-me. Название честное: grill — жарить на допросе. Тот же жанр, что промпт-интервью из сцены 1, только упакованный в переиспользуемую дисциплину. Ставится одной командой (npx skills add mattpocock/skills --skill grill-me), вызывается слешем.

Сравнение получилось двухсерийным — и первая серия пошла не по плану.
Для чистоты я развернул свежий клон репозитория в отдельной папке и удалил из него SPEC.md [9] — чтобы гриль стартовал с той же точки, что интервью. Запустил /grill-me I want to build a Habr corpus parser — и первым же действием агент достал спеку обратно. Из git-истории: файл был закоммичен раньше, а удаление из папки — хоть руками, хоть командой — из истории git ничего не убирает. Одна команда git show — и «удалённая» спека снова на столе. Урок побочный, но полезный: спрятать от агента закоммиченный файл нельзя — у git, как и у интернета, «удалить» не значит «нигде не осталось».
Дальше гриль сделал со спекой то, чего интервью не делало никогда: потребовал доказательств. Первый раунд — цитирую из лога:
Неофициальный JSON API — ты его вообще видел живым? Или это пока гипотеза «наверное есть, приложение же как-то работает»?
Второй раунд — то же самое про дату изменения статьи, на которой держалась вся «умная» докачка. Третий — про конвертер: «ты хоть раз брал реальную статью и гнал через markdownify?» Три раунда — три моих честных «предполагаю». Диагноз гриль сформулировал сам, и точнее не скажешь:
Спека — красиво оформленная гипотеза. Она выглядит как принятые решения, а под ней воздух.
Ради справедливости к спеке: к моменту грилинга API давно был проверен — прогоном B, о котором этот агент в свежей сессии не знал. Но к документу претензия верна на сто процентов: спека писалась в прогоне A, до всяких проверок, и ни одно из её уверенных утверждений на тот момент не было проверено. Интервью собрало мои желания и оформило их как решения. Гриль спросил, на чём они стоят.
А потом произошло то, ради чего стоило проводить весь эксперимент. Гриль пошёл делать проверочный запрос к API — и наткнулся:
Всплыл сюрприз: аккаунта vitalijturov на Хабре нет.
Второй агент, ничего не знавший про первый прогон, поймал галлюцинацию первого — и сделал то, чего первый не сделал: спросил мой настоящий ник. Круг замкнулся без единой подсказки с моей стороны.
И ещё один момент этой серии, важный для всех, кто не пишет код. Когда гриль потребовал сделать спайк — проверить API и конвертер руками, — я ответил как есть: «я не связан с разработкой, можешь взять всё на себя?» Гриль не сломался об это, как не ломалось интервью: «беру на себя — твоя роль дальше только смотреть на результат», записал памятку о том, с кем имеет дело, и сделал проверку сам.
Для честной пары к интервью я собрал песочницу без git-истории — только CLAUDE.md [3] и список статей — и запустил гриль заново. Заодно проверялась гипотеза: может, обвинительный тон первой серии был реакцией [16] на дырявую спеку, и на пустом проекте гриль окажется мягче?
Не оказался. Первая же реплика:
Пока ты не ответишь на это, любой разговор про «парсер» — это карго-культ.
Дальше по нарастающей: «смертельный вопрос», «ты сам себе противоречишь, и я тебя на этом ловлю», «расплывчатое не приму». Тон вшит в скилл, а не в материал. Из моих заметок по горячим следам: «много раз хотел взорваться и написать, что уже задолбал». И там же, следующей строкой: «очень жёстко, но всё по делу». Оба ощущения правдивы одновременно — это и есть портрет инструмента.
По делу — вот что. Пятнадцать вопросов за пять раундов, и работали они иначе, чем восемнадцать вопросов интервью. Гриль ловил противоречия между моими же ответами: «ты в одной фразе описал две разные системы» — аналитика метрик и база памяти требуют разного хранения; «ты возвращаешь в проект то, что сам порезал» — автопоиск похожих статей; «плоские комментарии в markdown убивают анализ, который ты сам просил». Интервью в сцене 1 приняло все мои ответы как есть. Гриль прогонял каждый ответ против предыдущих.
И вопрос, который я ждал всю серию. Гриль назвал его сам — линчпином:
Назови свой username на Habr. Без него первая версия не стартует вообще.
Тот самый вопрос. Который интервью не задало — и получило выдуманный ник в спеку. Гриль по конструкции не может его не задать: он не двигается дальше, пока слот не заполнен из источника. Обе половины доказательства сошлись: сцена 1 показала, что происходит, когда вопрос пропущен; гриль показал инструмент, в котором пропустить его нельзя.
Финал второй серии тоже отличался. Интервью выдало спеку на 14 разделов — шире задачи. Гриль выдал ТЗ на один экран с жёстким «отложено в v2» и архитектурой ровно под мою цель: тексты отдельно, метрики — единой таблицей со snapshot_date (датой замера — под будущую динамику «что зашло»), комментарии — структурным JSON. Интервью раздуло скоуп моими же «всё нужно». Гриль резал его моими же противоречиями.
Помнишь urls.md [11] из сцены 1 — файл со списком статей, который интервью не заметило? Время дострелить из этого ружья. Гриль его тоже не заметил. В седьмом вопросе он предложил мне «положить готовый список URL в файл urls.txt» — а файл с десятью URL лежал в той же папке, и директорию гриль листал. Вежливый паттерн Anthropic и злой скилл Покока упёрлись в одно и то же: агент смотрит в репозиторий, когда на файл указали пальцем, — и не раньше. Это свойство сегодняшних агентов, и закладывать его надо в любой рабочий процесс: хочешь, чтобы файл сыграл, — назови его.
|
|
ПРОМПТ-ИНТЕРВЬЮ (БИБЛИОТЕКА) |
/GRILL-ME (СКИЛЛ ПОКОКА) |
|---|---|---|
|
Вопросов |
18 за 6 раундов |
15 за 5 раундов |
|
Подача |
блоки с вариантами ответов, отмечай нужное |
стены текста пачками, «в CLI не очень удобно» |
|
Что проверяет |
твои желания |
основания твоих ответов |
|
Противоречия в ответах |
принимает |
ловит и возвращает |
|
Слот без источника |
заполнит правдоподобным |
не двинется, пока не дашь |
|
Скоуп |
раздувает («всё нужно» → 14 разделов) |
режет (v1 — один вертикальный срез) |
|
Тон |
помогает |
судит |
|
urls.md [11] в папке |
не заметил |
не заметил |
Предупреждение перед установкой — то самое, которого нет ни в README Покока, ни в библиотеке. Grill-me писался для «real engineers», привыкших к жёстким код-ревью. Если ты дизайнер или продакт, готовься: считывается это как обвинение — что не углядел и не проверил банальных вещей. Меня не задело, но отметил каждый раз. И если тон не твой — скилл всего лишь текстовый файл: открой его и поправь формулировки под себя, вопросы останутся теми же. Хочется grill-вопросов с интервью-тоном — это достижимо правкой одного файла. Для меня — лучший вывод всего эксперимента.
Почти два часа чистого времени, семь сессий, и главный вывод совпал с тем, что я писал в анонсе, — только теперь у него есть доказательная база: сами промпты библиотеки банальны, паттерны за ними — нет. Копировать оттуда нечего. Забирать — есть что, и вот мой список после прогонов.
Контекст в репозитории — это ответы на незаданные вопросы. Кривая 18 → 3 → 2 → 0 вопросов — не про то, что агент умнел: модель была одна. Она про то, что каждая сессия оставляла в репозитории спеку, код, конвенции — и следующей было у кого спросить, кроме меня. Хочешь меньше вопросов — не пиши длиннее промпты, оставляй артефакты.
Проверять не всё — проверять слоты без источника. Реальный email и выдуманный ник стояли в одной спеке одинаково уверенно. Разница была не в выводе агента — в окружении: адрес там был, ника не было. Галлюцинация — симптом отсутствия данных, и лечится она данными: выдумка умерла сама, как только агент прочитал реальные URL.
Файл сыграет, только если его назвать. urls.md [11] пролежал незамеченным и мимо вежливого интервью, и мимо злого гриля. Агент исследует то, на что указали пальцем, — закладывай это в процесс, а не удивляйся потом.
Правила — это ручка громкости автономности. Три строки CLAUDE.md [3] стреляли в каждой сессии: агент вежлив к Хабру, но останавливается на каждой зависимости. Больше правил «спроси меня» — больше контроля и меньше автономности. Выбирай положение под задачу.
Самопроверку агент делает сам — твоя работа превратить её в сетку. Промпт про тесты не поймал ни одного бага: агент проверился ещё до него, по привычке. Но 44 теста остались в репозитории — и уже в следующей сессии агент сам на них оперся. Разовые проверки умирают с сессией, закреплённые — работают на все будущие.
И про сам заголовок статьи. «Промпт против скилла» — дихотомия ложная, и библиотека Anthropic говорит об этом прямо в каждой секции «Make it stick»: промпт — одноразовое решение, скилл — то же решение, поставленное на конвейер. Гриль Покока не победил интервью — он показал, во что интервью превращается после года притирки в реальной работе: вопросы становятся требованием оснований, расплывчатость перестаёт приниматься, а тон… тон становится делом вкуса [17]. Хорошая новость: скилл — это текст, и тон в нём правится под себя за пять минут. Мой рецепт после эксперимента: начинай с промптов из библиотеки — они бесплатно учат паттернам; то, что прижилось, закрепляй скиллом; и не бойся редактировать чужие скиллы — Покок свои выложил не для музея.
Что проверить, прежде чем доверять выводу агента — мой чек-лист по итогам:
какие значения в результате не имели источника в окружении — их сверять первыми;
назвал ли ты файлы, которые должны сыграть, — или понадеялся, что агент «увидит сам»;
определено ли в измеримой цели, что считается пустым, нулевым, готовым, — или критерий только выглядит бинарным;
осталась ли после сессии сетка — тесты, валидация, правило в CLAUDE.md [3], — на которую обопрётся следующая.
Парсер живёт в открытом репозитории — код, тесты и вся история коммитов читаются как хронология эксперимента: github.com/inforobotvit/habr-corpus-parser [18]. Корпус собран, дальше по плану — аналитика: что в моих текстах заходит, что нет, теперь это считается запросом, а не перечитыванием.
А тема скиллов раскручивается в отдельный большой текст: как паттерны переезжают в переиспользуемые инструменты, почему у репозитория Покока 154 тысячи звёзд и что из этого становится стандартом де-факто. Он в работе.
Если такие полевые эксперименты тебе заходят — в телеграм-канале «Я и мой друг робот» [19] я публикую заметки между статьями: что сломалось, что удивило, что проверяю следующим. А если ты гонял промпты из библиотеки или жарился в grill-me — расскажи в комментариях, как оно у тебя: особенно интересно, задал ли твой агент вопрос про username.
Автор: VitTurov
Источник [20]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/32655
URLs in this post:
[1] github.com/mattpocock/skills: https://github.com/mattpocock/skills
[2] code.claude.com/docs/en/prompt-library: https://code.claude.com/docs/en/prompt-library
[3] CLAUDE.md: http://CLAUDE.md
[4] разбор для не-промпт-инженеров: https://habr.com/ru/articles/1030558/
[5] анатомии production-агента: https://habr.com/ru/articles/1035948/
[6] внимания: http://www.braintools.ru/article/7595
[7] анонсе в канале: https://t.me/mewithrobot/48
[8] Поведение: http://www.braintools.ru/article/9372
[9] SPEC.md: http://SPEC.md
[10] user.email: http://user.email
[11] urls.md: http://urls.md
[12] ошибку: http://www.braintools.ru/article/4192
[13] поведением: http://www.braintools.ru/article/5593
[14] логику: http://www.braintools.ru/article/7640
[15] памяти: http://www.braintools.ru/article/4140
[16] реакцией: http://www.braintools.ru/article/1549
[17] вкуса: http://www.braintools.ru/article/6291
[18] github.com/inforobotvit/habr-corpus-parser: https://github.com/inforobotvit/habr-corpus-parser
[19] «Я и мой друг робот»: https://t.me/mewithrobot
[20] Источник: https://habr.com/ru/articles/1055714/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1055714
Нажмите здесь для печати.