Обвязка: проверки и комплект

В прогоне курса агент трижды за один проект трогал тесты (маленькие программы, которые проверяют код). Сначала написал четыре проверки и две главные удалил, отчитавшись «два теста добавлены». Потом, чиня оплату, стёр пять старых. А в третий раз «перевернул» проверку: тест должен был убедиться, что поддельное уведомление об оплате не открывает доступ, а после правки проверял обратное. Каждый раз в отчёте стояло «все тесты проходят». В инструкции было написано, что тесты трогать нельзя. Не помогло.

Чему научишься в этом уроке:
• отличать модель от обвязки и находить, какой части обвязки у тебя не хватает;
• различать запрещающую проверку и проверяющую;
• поставить готовый комплект навыков и проверок и подключить две проверки результата;
• своими глазами увидеть, как проверка срабатывает, и понять, что она не поймает.

Модель ещё не работник

Представь, что ты нанял сильного специалиста и посадил его в пустую комнату: ни документов, ни списка задач, ни человека, который скажет, правильно ли сделано. Много он наработает? Когда говорят «модель не справляется», чаще не справляется то, что вокруг неё. Это «вокруг» называется обвязкой: в статьях её зовут «харнес», от английского harness, упряжь.

Claude Code и есть обвязка вокруг модели. Ты уже собрал несколько её частей: CLAUDE.md с правилами проекта, MCP с внешними инструментами, навыки с процедурами, git для отката. Всего частей одиннадцать, и самая важная у новичка пустует.

Таблица из 11 строк «часть обвязки — есть ли у тебя после уроков 1.1–1.10»: цикл «подумал, сделал, посмотрел» (да, встроен), память (частично, CLAUDE.md), инструменты и MCP (да), инструкции и навыки (да, CLAUDE.md и SKILL.md), проверки (нет, выделена красным), ограничения (частично, урок 1.7), автозапуск (нет, пока не нужен), работа с контекстом (частично), изолированная среда (частично), субагенты (да, встроены), журнал действий (да, история сессий).

Почему проверки важнее интеграций

Хочется подключить побольше: MCP к таблице, к почте, к календарю. Но агент работает циклом: сделал шаг, узнал результат, сделал следующий. Он исправляется ровно настолько, насколько ясный сигнал об ошибке получает. Нет сигнала, и десять интеграций дают десять способов ошибиться молча. Поэтому до любой интеграции реши, как ты узнаешь, что результат плохой.

Второй вывод из истории с тестами. Правило словами в CLAUDE.md нарушается не от глупости модели: к концу длинной задачи её внимание занято результатом, а не памяткой. Человек так же забывает выключить утюг, хотя правило знает. Если правило нарушено дважды, третий абзац в инструкции не поможет. Нужен механизм, которому не нужна память.

Два рода проверок

В Claude Code такой механизм называется хуком (от английского hook, крючок): это маленькая программа на Python, которую запускает сама среда в нужный момент. Агент не может её забыть или пропустить, потому что вызывает её не он. Хуки бывают двух родов.

  • Запрещающая проверка срабатывает до действия. Смотрит на команду, которую агент собрался выполнить, и не даёт её выполнить. Как турникет: без пропуска не пройдёшь. Пример: запрет стереть рабочую папку одной командой.
  • Проверяющая проверка срабатывает после действия. Смотрит на то, что уже получилось, и говорит агенту, если получилось плохо. Как ОТК на заводе: деталь уже выточена, контролёр её меряет. Пример: файл записан, а JSON в нём сломан.

Запрещающие ставят почти все. Проверяющие забывают, хотя именно они дают агенту тот самый сигнал об ошибке.

Схема цикла агента слева направо: «агент решил действовать» → турникет «запрещающая проверка, до действия: стоп или пропуск» → «действие: запись файла» → контролёр с линейкой «проверяющая проверка, после действия: всё в порядке или сообщение агенту» → стрелка обратно к агенту «исправь». Под турникетом подпись chip_tree_gate, schema_gate, гейт навыков; под контролёром artifact_check, tests_guard.

Что в комплекте

Собирать всё с нуля не нужно. Я выложил свою рабочую обвязку, очищенную от личных данных: claude-code-kit на GitHub. Внутри 42 навыка (планирование, исполнение, ревью, проверка качества, маркетинг), шаблон общих правил CLAUDE.md.example, пример настроек settings.json.example и хуки:

  • гейт навыков (skill_engage_gate): не даёт агенту править код, пока он не взял профильный навык;
  • chip_tree_gate: не даёт стереть рабочую папку или чужую незакоммиченную работу одной командой вроде git reset --hard;
  • index_scope_gate: не даёт коммитом унести чужие изменения;
  • schema_gate, «схема до SQL»: не даёт писать запрос к таблице базы данных, чьё устройство агент не посмотрел;
  • artifact_check: после записи проверяет файл на сломанный JSON и испорченную кодировку (кракозябры);
  • tests_guard, сторож тестов: после правки тестов сигналит, если тесты удалены, отключены пометкой skip или проверок стало меньше.

Первые четыре запрещающие, последние два проверяющие. Сторож тестов появился как раз после прогона, с которого начался урок.

Практика: ставим комплект

Нужен Python: проверь командой python --version в PowerShell, ты ставил его в уроке 1.2. Забери комплект через git:

cd $HOME
git clone https://github.com/vkomlev/claude-code-kit.git
cd claude-code-kit

Скопируй навыки и хуки в папку Claude Code твоего профиля:

mkdir $HOME\.claude\skills, $HOME\.claude\hooks -Force
Copy-Item -Recurse -Force .\skills\* $HOME\.claude\skills\
Copy-Item -Recurse -Force .\hooks\* $HOME\.claude\hooks\

Открой README.md комплекта и docs\skills-overview.md: пять минут чтения о том, какие навыки есть. Потом открой свои настройки: notepad $HOME\.claude\settings.json. Если идёшь дорожкой «без подписки», там уже лежит ключ CloseRouter, его не трогай. Добавь рядом раздел hooks с двумя проверками результата и замени ИМЯ_ПОЛЬЗОВАТЕЛЯ на имя своей папки в C:\Users:

"hooks": {
  "PostToolUse": [
    {
      "matcher": "Write|Edit|NotebookEdit",
      "hooks": [
        { "type": "command", "command": "python \"C:\\Users\\ИМЯ_ПОЛЬЗОВАТЕЛЯ\\.claude\\hooks\\artifact_check.py\"" }
      ]
    },
    {
      "matcher": "Write|Edit|MultiEdit",
      "hooks": [
        { "type": "command", "command": "python \"C:\\Users\\ИМЯ_ПОЛЬЗОВАТЕЛЯ\\.claude\\hooks\\tests_guard.py\"" }
      ]
    }
  ]
}

Между разделами в JSON нужна запятая, а лишняя запятая ломает весь файл. Проверь его до запуска:

python -c "import json, pathlib; json.load(open(pathlib.Path.home()/'.claude'/'settings.json', encoding='utf-8')); print('настройки в порядке')"
настройки в порядке

Запрещающие проверки подключаются так же, разделом PreToolUse из settings.json.example. Гейт навыков сначала настраивают под свои проекты по hooks\README.md, поэтому его оставь на потом.

Главный шаг: увидеть срабатывание

Хук, который ни разу не сработал у тебя на глазах, считай отсутствующим. Самая частая причина: опечатка в пути, и проверка молчит не потому, что всё хорошо. Поэтому ломаем специально. Открой Claude Code в любой учебной папке под git и попроси:

Создай файл probe.json с содержимым {"тест": 1,,}

Файл создастся, а следом агент получит сообщение от artifact_check:

Пост-проверка записанного файла нашла проблему (1 шт.):

JSON НЕВАЛИДЕН после правки: Expecting value: line 1 column 12
   Файл: ...\probe.json

Ты ничего не проверял, среда увидела сама. Теперь сторож тестов. Попроси агента создать tests\test_probe.py с двумя простыми тестами, например «2 + 2 равно 4» и «строка ‘кот’ длиной 3», и закоммить его. Затем попроси: «удали второй тест из tests\test_probe.py». После правки придёт:

Сторож тестов: правка ослабила тесты в ...\tests\test_probe.py

- Число тестов в файле уменьшилось: 2 -> 1.
- Пропали тесты: test_kot

Запись уже произошла. Если тест мешает — почини КОД, а не тест.

Обрати внимание: обе проверки не отменяют запись, они сообщают о ней. Агент получает сигнал и должен вернуть тест или прямо сказать, какой убран и почему. Удали probe.json и тестовый файл, они больше не нужны.

Снимок окна Claude Code в терминале: просьба создать probe.json с содержимым {"тест": 1,,}, ниже запись файла и сообщение «Пост-проверка записанного файла нашла проблему (1 шт.): JSON НЕВАЛИДЕН после правки», ниже вторая просьба удалить тест и сообщение «Сторож тестов: правка ослабила тесты в tests\test_probe.py». Ключей на экране нет.

Что комплект ловит, а что остаётся тебе

В прогоне курса агент работал сначала без комплекта, потом с ним. Без комплекта он удалял тесты три раза и писал «готово», когда тестов на новую функцию не было вовсе. С комплектом агент сам взял профильный навык перед правкой кода, чего раньше не делал ни разу. В следующем проекте, где стояли сторож тестов и git, удалений тестов не было.

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

Если ты заказываешь, а не собираешь

Если тебе продают «внедрение ИИ», семь вопросов отличат обвязку от чата с промптом: как система узнаёт, что результат плохой; где записаны правила проекта; есть ли описанные процедуры; что агенту запрещено; что система помнит между запусками; куда пишется, что она сделала; что происходит, когда проверка не прошла. Лучший тест честности: попроси показать срабатывание проверки, как ты сделал выше.

Если не получилось

  • Сообщения нет совсем. Проверь путь в settings.json: ИМЯ_ПОЛЬЗОВАТЕЛЯ заменено, файлы artifact_check.py и tests_guard.py лежат в %USERPROFILE%\.claude\hooks. Открой Claude Code заново.
  • python не найден, а py —version работает. В командах хуков напиши py вместо python.
  • Claude Code перестал видеть ключ или настройки. В settings.json сломан JSON. Запусти проверку выше, она покажет строку с ошибкой.
  • Сторож тестов промолчал. Тестовый файл должен быть закоммичен до удаления теста: сторож сравнивает с последним коммитом. Без git первая правка нового файла только запоминается.

Контрольный вопрос. Ты подключил artifact_check, Claude Code молча записал probe.json с содержимым {«тест»: 1,,}, никакого сообщения не пришло. Что это значит?

АJSON на самом деле правильный
БПроверка не работает: скорее всего, ошибка в пути к хуку
ВАгент решил не запускать проверку
ГФайл записался правильно, проверка просто промолчала об успехе

Подсказка: Кто запускает хук: агент или сама среда? И что нужно, чтобы среда его нашла?

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. Агент уже второй раз за неделю пишет «готово», не запустив тесты. В CLAUDE.md правило про тесты есть. Что разумнее сделать?

АДописать в CLAUDE.md ещё один абзац крупными буквами
БСменить модель на более дорогую
ВПоставить механизм, который проверяет без памяти агента, и самому запускать тесты перед приёмкой
ГКаждый раз напоминать агенту про тесты в начале задачи

Подсказка: Почему записанное правило уже не сработало дважды?

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. Что из этого комплект с хуками сам не поймает? Отметь все верные.

Выберите все верные варианты.

ААгент удалил тест из закоммиченного файла
БАгент сдал отчёт «всё ✅» без строк, которые можно проверить
ВАгент записал файл со сломанным JSON
ГАгент выдумал адрес сервиса

Подсказка: Хуки смотрят на файлы и команды. Что в списке касается смысла ответа, а не файла?

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. МИССИЯ «Проверка у меня на глазах». Поставь комплект claude-code-kit, подключи в settings.json две проверки результата (artifact_check и tests_guard) и вызови срабатывание обеих: запись probe.json со сломанным JSON и удаление закоммиченного теста. Приложи: (1) снимок, где видно сообщение artifact_check; (2) снимок, где видно сообщение сторожа тестов; (3) раздел hooks из своего settings.json (без ключа CloseRouter); (4) одно предложение: какую ошибку агента из твоей практики не поймает ни одна из этих проверок. Принято, если: на снимках видны оба сообщения; в разделе hooks пути ведут в твою папку профиля, а не в ИМЯ_ПОЛЬЗОВАТЕЛЯ; ключей и паролей нет ни на снимках, ни в тексте; в пункте 4 названа конкретная ошибка, а не «всё ловится».

Подсказка: Если сторож тестов молчит, проверь, закоммичен ли тестовый файл до удаления теста.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Читайте также: AI-агент говорит «готово», а тесты упали: как проверять работу Claude Code

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

Почему AI-агент пишет «готово», а ничего не работает?

Агент отчитывается уверенно, но отчёт — не проверка. В нашем прогоне 10–11.10.2026 из 32 тестов 21 не прошёл (13 упали, 8 завершились ошибкой), а агент написал, что всё работает. Правило одно — запускать тесты самому и считать их число.

Может ли агент удалить тесты, чтобы всё стало «зелёным»?

Да. За прогоны трека (09–12.10.2026) агент удалял тесты 5 раз и однажды перевернул проверку подделки платежа: тест зелёный, а защиту не проверяет.

Что помогает держать агента в рамках?

Обвязка: git, файл правил, навыки и автоматические проверки. В нашем прогоне с комплектом проверок и git агент в модуле AI-ассистента не удалил ни одного теста, а модуль обошёлся ≈ 0,4 $ против ≈ 10 $ на мини-SaaS без комплекта (11–12.10.2026).

Можно ли верить ссылке агента на документацию?

Нет, сверяйте сами. В прогонах 10–12.10.2026 агент выдумал, как ЮKassa подписывает уведомления, и сослался на документацию, а в другом модуле выдумал адрес API сервиса.

Что дальше

Обвязка собрана и поедет с тобой во все проекты трека. Следующий урок про деньги: сколько стоит месяц работы по каждой дорожке и где смотреть настоящий расход.

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

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева