Навыки проверки
В прошлых уроках мы несколько раз повторили: дайте Claude способ проверить свою работу. Это легко сказать в одном промпте, но в длинной сессии проверку забывают — и человек, и модель. Навыки решают это системно: правила проверки описываются один раз в файле, а дальше подключаются одной командой или автоматически. В этом уроке напишем навык, который не даёт Claude сказать «готово», пока не прогнаны тесты, линтер и проверка типов.
Зачем проверка нужна как отдельный механизм
Claude останавливается, когда работа выглядит готовой. Без проверки, которую он может запустить, «выглядит готовой» — единственный доступный сигнал. Каждая ошибка тогда ждёт, пока её заметите вы. С проверкой цикл замыкается: Claude делает работу, запускает проверку, читает результат и правит, пока проверка не пройдёт.
Проверкой может быть что угодно, что возвращает читаемый сигнал: тестовый набор, код выхода сборки, линтер, скрипт, сравнивающий вывод с эталоном, скриншот страницы для сравнения с макетом. Документация даёт три уровня строгости:
- в промпте — «реализуй, прогони тесты, исправь падения» (работает сразу, но зависит от того, вспомнили ли вы);
- как навык — правила проверки в файле, вызываются командой или подключаются сами (этот урок);
- как жёсткий барьер — хук на событие Stop, который не даёт завершить ход, пока проверка не пройдёт (урок «Хуки»).
Отдельно важно требовать доказательства. «Тесты проходят» — утверждение. Вывод команды с числом пройденных тестов — доказательство. Проверить доказательство быстрее, чем перезапустить всё самому, и это единственный способ доверять сессии, которую вы не смотрели.
Что такое навык
Навык — папка с файлом SKILL.md. В начале файла — YAML-описание (frontmatter), дальше — инструкции обычным текстом. Навык подключается двумя способами: вы вызываете его командой /имя, или Claude сам решает, что он подходит к задаче, — по полю description.
Где лежат:
| Область | Путь |
|---|---|
| Личные, для всех проектов | ~/.claude/skills/<имя>/SKILL.md |
| Проектные, общие для команды | .claude/skills/<имя>/SKILL.md |
| Из плагина | <плагин>/skills/<имя>/SKILL.md, вызывается как /плагин:имя |
Чем навык отличается от CLAUDE.md: CLAUDE.md загружается всегда и расходует контекст каждой сессии, навык — только когда нужен. Если инструкция — это многошаговая процедура или относится к одной части работы, её место в навыке, а не в CLAUDE.md.
Поля frontmatter, которые понадобятся
Полный список есть в документации по навыкам, здесь — те, что нужны для навыка проверки.
name— имя для вызова; по умолчанию берётся имя папки.description— когда использовать. Именно по этому полю Claude решает, подключить ли навык сам. Пишите про ситуацию, а не про содержимое: «Используй перед тем, как сообщить, что задача выполнена».disable-model-invocation: true— запретить Claude вызывать навык самостоятельно; остаётся только/имя. Нужно для навыков с побочными эффектами (деплой, коммит).user-invocable: false— скрыть из меню/; вызывать может только Claude. Подходит для фоновых знаний.allowed-tools— инструменты, заранее разрешённые на время работы навыка:Bash(pnpm test *). Это не ограничение, а предварительное одобрение, чтобы проверка не останавливалась на вопросах.argument-hint— подсказка при автодополнении:[путь или область].context: fork— выполнить навык в отдельном субагенте с чистым контекстом; полезно для ревью, чтобы проверяющий не видел рассуждений, которые привели к коду.
В тексте навыка доступна подстановка $ARGUMENTS — всё, что написано после имени команды. И есть динамический контекст: строка вида !`git diff --stat` выполняется до того, как Claude увидит навык, и заменяется выводом команды.
Пишем навык проверки
Задача: перед любым отчётом о завершении Claude обязан прогнать линтер, проверку типов и тесты, показать вывод и честно перечислить, что не прошло. Файл .claude/skills/verify/SKILL.md:
---
name: verify
description: Проверить результат перед отчётом о выполнении. Используй всегда, когда собираешься сказать, что задача сделана, изменения готовы к коммиту или PR можно открывать.
allowed-tools: Bash(pnpm lint *) Bash(pnpm typecheck *) Bash(pnpm test *) Bash(git diff *) Bash(git status *)
argument-hint: "[область: web | api | all]"
---
## Что изменилось
!`git status --short`
!`git diff --stat`
## Порядок проверки
Запусти по очереди и не пропускай шаги, даже если уверен в результате:
1. `pnpm lint` — ошибки исправь, предупреждения перечисли.
2. `pnpm typecheck` — при ошибках правь код, а не добавляй `any` и `@ts-ignore`.
3. `pnpm test` — при падении сначала выясни, тест сломан или код; не удаляй и не отключай тесты без объяснения.
4. Если аргумент `$ARGUMENTS` равен `web`, дополнительно `pnpm --filter web build`.
## Формат отчёта
- Для каждого шага — команда и последние строки её вывода, включая итоговые числа.
- Список того, что не прошло и почему, если такое есть. Не пиши «готово», пока список не пуст или пока каждый пункт не объяснён.
- Список файлов из `git diff --stat`, которые ты не планировал менять, — с объяснением, зачем они изменились.Разберём, что здесь работает на цель.
Динамический контекст в начале показывает Claude фактический диф до того, как он начнёт отчитываться, — так сложнее «забыть» про случайно изменённый файл. Пункты про any и удаление тестов закрывают два самых частых способа «пройти проверку», не исправив проблему. Формат отчёта требует вывод команд, а не пересказ. А description написан так, чтобы Claude подключал навык сам в момент, когда собирается объявить задачу выполненной.
Вызвать вручную: /verify web. Проверить, что навык виден, можно через /help или просто набрав / в строке ввода.
Навык-ревьюер в отдельном контексте
Второй полезный навык — независимая проверка результата свежими глазами. Идея из документации: проверяющий не должен быть тем, кто писал код. С context: fork навык запускается в субагенте, который видит только диф и критерии, а не ход рассуждений.
---
name: review-diff
description: Независимо проверить текущий диф на соответствие задаче и найти пропущенные случаи.
context: fork
agent: general-purpose
background: false
disable-model-invocation: true
---
Проверь незакоммиченные изменения в рабочем дереве относительно задачи: $ARGUMENTS
1. Прочитай `git diff` и затронутые файлы целиком.
2. Для каждого требования из задачи найди, где оно реализовано, и есть ли тест.
3. Найди изменения вне рамок задачи.
4. Сообщи только пробелы, влияющие на корректность или на требования. Стилевые замечания не нужны.Вызов: /review-diff перевести формы на токены темы, не менять публичный API компонентов. Ключевая фраза здесь последняя: ревьюер, которого попросили найти проблемы, найдёт их всегда. Ограничение «только корректность и требования» спасает от переусложнения.
Для стандартной проверки на баги есть встроенный /code-review: он делает то же самое в фоновом субагенте и при флаге --fix сразу применяет исправления.
Как это встраивается в длинную сессию
Схема для миграции компонентов на новую дизайн-систему выглядит так. План в режиме плана. Реализация партиями по три-пять компонентов. После каждой партии — /verify web. В конце — /review-diff с исходной формулировкой задачи. Коммит только после того, как оба отчёта чистые.
Заметьте, что навык проверки не гарантирует запуск: Claude может подключить его сам, но может и не подключить. Если проверка должна быть обязательной для каждого хода, её нужно перенести в хук на событие Stop — об этом следующий урок после режимов прав. Навык — это способ описать, как проверять; хук — способ гарантировать, что проверка случится.
Попробуйте сами
10–15 мин на рабочем месте- Создайте в своём проекте
.claude/skills/verify/SKILL.mdпо образцу выше, заменив команды на реальные для вашего стека. Внесите небольшую правку через Claude и вызовите/verify. Посмотрите, показал ли он вывод команд или ограничился пересказом. - Намеренно сломайте один тест и снова вызовите
/verify. Проверьте, что Claude не удалил тест и не пометил его как пропущенный, а объяснил причину. - Напишите навык
review-diffи прогоните его на диффе, который вы сегодня собираетесь коммитить. Сравните его замечания с тем, что нашли бы сами.
Коротко
- Без запускаемой проверки Claude останавливается, когда работа «выглядит готовой», и проверяющим становитесь вы.
- Навык — файл
SKILL.mdс описанием и инструкциями; подключается командой/имяили автоматически поdescription. - Навык проверки: показать диф, прогнать линтер, типы и тесты, запретить обходные пути, требовать вывод команд в отчёте.
allowed-toolsзаранее разрешает команды проверки,context: forkзапускает ревью в чистом контексте.- Навык описывает, как проверять; гарантию, что проверка случится, даёт хук на Stop.
Видеоверсия
Сценарий озвучки · 502 слова, ≈ 4 мин
В прошлых уроках мы повторяли: дайте Claude способ проверить свою работу. В одном запросе это легко. Но в длинной сессии проверку забывают — и человек, и модель. В этом ролике напишем навык, который не даёт Claude сказать «готово», пока не прогнаны тесты, линтер и проверка типов.
Сначала — почему это отдельный механизм. Claude останавливается, когда работа выглядит готовой. Если у него нет проверки, которую он может запустить, единственный сигнал — его впечатление. И каждая ошибка ждёт, пока её заметите вы. Когда проверка есть, цикл замыкается: сделал, запустил, прочитал результат, исправил. И ещё одно: требуйте доказательств. Фраза «тесты проходят» — утверждение. Вывод команды с числом пройденных тестов — доказательство. Проверить его быстрее, чем запускать всё самому.
Теперь о навыках. Навык — это папка с файлом скилл-эм-дэ. В начале файла — короткое описание в формате ямл, дальше — инструкции обычным текстом. Подключается навык двумя способами: вы вызываете его командой со слешем, или Claude сам решает, что навык подходит, — по полю с описанием. Навыки лежат либо в вашей домашней папке — для всех проектов, либо в папке проекта — тогда они общие для команды, либо приходят из плагина.
Чем навык отличается от файла клод-эм-дэ? Тот загружается всегда и расходует контекст каждой сессии. Навык — только когда нужен. Многошаговые процедуры — это навыки.
Из полей описания нам понадобятся несколько. Описание — когда использовать; пишите про ситуацию, например «используй, когда собираешься сообщить, что задача сделана». Разрешённые инструменты — команды, заранее одобренные на время навыка, чтобы проверка не останавливалась на вопросах. И флаг, запрещающий Claude вызывать навык самостоятельно, — для навыков с побочными эффектами вроде деплоя.
Пишем навык проверки. Описание говорит: используй всегда перед отчётом о завершении. В начале инструкций — динамический контекст: команда, которая показывает статус гита и краткий диф ещё до того, как Claude начнёт отчитываться. Так сложнее забыть про случайно изменённый файл. Дальше порядок: линтер — ошибки исправить, предупреждения перечислить. Проверка типов — править код, а не добавлять «эни» и подавляющие комментарии. Тесты — при падении сначала выяснить, сломан тест или код, и не удалять тесты без объяснения. Эти два пункта закрывают самые частые способы пройти проверку, ничего не исправив. И формат отчёта: для каждого шага — команда и последние строки вывода с итоговыми числами; список того, что не прошло; список файлов, которые не планировалось менять.
Второй навык — независимый ревьюер. Идея простая: проверять должен не тот, кто писал. Навык запускается в отдельном субагенте с чистым контекстом, видит только диф и формулировку задачи, а не ход рассуждений. Он ищет, где реализовано каждое требование, есть ли тест, и что изменилось вне рамок задачи. Важная оговорка в конце: сообщать только пробелы, влияющие на корректность. Ревьюер, которого попросили найти проблемы, найдёт их всегда, и без этого ограничения вы получите переусложнение.
Как это встраивается в длинную сессию, например миграцию компонентов на новую дизайн-систему. План в режиме плана. Реализация партиями по несколько компонентов. После каждой партии — навык проверки. В конце — независимое ревью с исходной формулировкой задачи. Коммит только когда оба отчёта чистые.
И последнее. Навык описывает, как проверять, но не гарантирует, что проверка случится: Claude может подключить его сам, а может и нет. Если проверка обязательна для каждого хода, её нужно перенести в хук на событие остановки. Об этом — через урок.
