AmigaОбучение ИИ
Модуль 2 · Настраиваем Claude · урок 3 из 10

Навыки проверки

11 мин чтения▶ есть видеоверсия

В прошлых уроках мы несколько раз повторили: дайте 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:

markdown
---
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 навык запускается в субагенте, который видит только диф и критерии, а не ход рассуждений.

markdown
---
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 мин на рабочем месте
  1. Создайте в своём проекте .claude/skills/verify/SKILL.md по образцу выше, заменив команды на реальные для вашего стека. Внесите небольшую правку через Claude и вызовите /verify. Посмотрите, показал ли он вывод команд или ограничился пересказом.
  2. Намеренно сломайте один тест и снова вызовите /verify. Проверьте, что Claude не удалил тест и не пометил его как пропущенный, а объяснил причину.
  3. Напишите навык review-diff и прогоните его на диффе, который вы сегодня собираетесь коммитить. Сравните его замечания с тем, что нашли бы сами.

Коротко

  • Без запускаемой проверки Claude останавливается, когда работа «выглядит готовой», и проверяющим становитесь вы.
  • Навык — файл SKILL.md с описанием и инструкциями; подключается командой /имя или автоматически по description.
  • Навык проверки: показать диф, прогнать линтер, типы и тесты, запретить обходные пути, требовать вывод команд в отчёте.
  • allowed-tools заранее разрешает команды проверки, context: fork запускает ревью в чистом контексте.
  • Навык описывает, как проверять; гарантию, что проверка случится, даёт хук на Stop.

Видеоверсия

Сценарий озвучки · 502 слова, ≈ 4 мин

В прошлых уроках мы повторяли: дайте Claude способ проверить свою работу. В одном запросе это легко. Но в длинной сессии проверку забывают — и человек, и модель. В этом ролике напишем навык, который не даёт Claude сказать «готово», пока не прогнаны тесты, линтер и проверка типов.

Сначала — почему это отдельный механизм. Claude останавливается, когда работа выглядит готовой. Если у него нет проверки, которую он может запустить, единственный сигнал — его впечатление. И каждая ошибка ждёт, пока её заметите вы. Когда проверка есть, цикл замыкается: сделал, запустил, прочитал результат, исправил. И ещё одно: требуйте доказательств. Фраза «тесты проходят» — утверждение. Вывод команды с числом пройденных тестов — доказательство. Проверить его быстрее, чем запускать всё самому.

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

Чем навык отличается от файла клод-эм-дэ? Тот загружается всегда и расходует контекст каждой сессии. Навык — только когда нужен. Многошаговые процедуры — это навыки.

Из полей описания нам понадобятся несколько. Описание — когда использовать; пишите про ситуацию, например «используй, когда собираешься сообщить, что задача сделана». Разрешённые инструменты — команды, заранее одобренные на время навыка, чтобы проверка не останавливалась на вопросах. И флаг, запрещающий Claude вызывать навык самостоятельно, — для навыков с побочными эффектами вроде деплоя.

Пишем навык проверки. Описание говорит: используй всегда перед отчётом о завершении. В начале инструкций — динамический контекст: команда, которая показывает статус гита и краткий диф ещё до того, как Claude начнёт отчитываться. Так сложнее забыть про случайно изменённый файл. Дальше порядок: линтер — ошибки исправить, предупреждения перечислить. Проверка типов — править код, а не добавлять «эни» и подавляющие комментарии. Тесты — при падении сначала выяснить, сломан тест или код, и не удалять тесты без объяснения. Эти два пункта закрывают самые частые способы пройти проверку, ничего не исправив. И формат отчёта: для каждого шага — команда и последние строки вывода с итоговыми числами; список того, что не прошло; список файлов, которые не планировалось менять.

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

Как это встраивается в длинную сессию, например миграцию компонентов на новую дизайн-систему. План в режиме плана. Реализация партиями по несколько компонентов. После каждой партии — навык проверки. В конце — независимое ревью с исходной формулировкой задачи. Коммит только когда оба отчёта чистые.

И последнее. Навык описывает, как проверять, но не гарантирует, что проверка случится: Claude может подключить его сам, а может и нет. Если проверка обязательна для каждого хода, её нужно перенести в хук на событие остановки. Об этом — через урок.

Отметка хранится только в вашем браузере