Слово «харнес» за этот год попало во все разговоры про ИИ, а обьясняется это примерно так: «ну, это обвязка». Обвязка чего? Какая обвязка? Поделюсь своим мнением по поводу этого термина.

Если вы хоть раз запускали Claude Code, работали с Codex или Cursor, вы уже используюете харнес.

Проше говоря, харнес – это слой настроек, дополнительных файлов, инструментов для модели (LLM) или если хотите в своем роде *архитектурный паттерн в ИИ-агентах. Но в живой речи харнесами называют и программы целиком: «поставил себе харнес», «какой харнес выбрать», логика та же, по которой «мотор» иногда означает всю машину. Если нуэно различать то помогает вопрос «это можно скачать и запустить?»: если да, речь о программе. Дальше «харнес» у меня означает слой

Что такое «обвязка»

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

Часть обвязки

Зачем она нужна

цикл

Чтобы агент не замолчал после первого ответа, а вызывал LLM до достижения результата

память

Тут все просто, чтоб в контекст модели попадали все ранее известные вводные: в коде, в проекте – да где угодно

инструменты

Инструменты чтения, редактирования, поиска и вызов терминала

инструкции и навыки

Чтобы не объяснять одно и то же в каждом новом разговоре. Вы уже с ними знакомы это skill и файлы типа: CLAUDE.md или AGENT.md

проверки

Это скрипты, хуки. Короче: некий код, чтобы «готово» означало готово, а не «я перестал работать»

ограничения

Чтобы агент не крутился всю ночь и не сделал непоправимого

автоматический запуск

Чтобы работа шла без вас: ночью, по расписанию, по событию.

работа с сохраненным контекстом

Чтобы агент не поглупел на середине длинной задачи

изолированная среда и права досутпа

Чтобы агент не дотянулся туда, куда не должен.

делегирование задач (субагенты)

Чтобы тяжёлая работа не забивала основной контекст

наблюдаемость (логирование действий)

Чтобы понять, где именно агент свернул не туда

Это не полный список одиннадцать пунктов я использую сам, какие то пункты могут по-другому называться но суть одна и та же.

Если вам не нужно строить своих харнес-агентов, то хорошая новость в том, что бо́льшую часть этого списка писать не придётся, так как цикл, инструменты, сжатие истории, механика субагентов и логирование действий уже есть в ваших любимых инструментах: Claude Code, Codex, Cursor и так далее. И тут хочу пояснить, что если вы задумали в каком-то из своих проектов, допустим вайбкодите приложение, и хотите в этом проекте настроить харнес, то вам остаётся только добавить правила, навыки, проверки и запреты.

Например: вы завайбкодили приложение и опубликовали его, поймали баг на проде или пользователи начали жаловаться. В таком случае вам придётся искать логи, смотреть, разбираться. Но если вы создадите скиллы, хуки и правила поиска багов, деплоя и фиксов, то в Claude Code будет достаточно просто скинуть жалобу пользователя, и он всё сделает сам. Ниже один из примеров того, какая будет обвязка.

пример файлов
пример файлов

Как создавать такие обвязки? Нужно ли уметь писать код, скрипты?

Если вы неразработчик, то ниже оставлю для вас промпт, в своем проекте где вайкодите, напишите этот промпт.

Собери обвязку для разбора жалоб пользователей.

Про проект: стек — [ваш стек], прод — [адрес], сервисы — [список],
логи лежат [где и чем смотрятся], деплой — [команда].

Что сделать:

1. CLAUDE.md — правила проекта. Раздел «как ходить на прод»: логи только
   через scripts/prod-logs.sh, прод-база только на чтение, миграции на проде
   не запускать никогда. Раздел «что считается сделанным»: прошёл check.sh
   и записан файл в docs/incidents/.

2. scripts/prod-logs.sh — единственная дверь на прод. Закрытый список
   сервисов, отдельный read-only ключ, потолок 500 строк, вырезать из вывода
   номера карт и токены до того, как они попадут в разговор.

3. .claude/skills/triage-bug/SKILL.md — порядок разбора: симптом → сервис,
   логи, поиск следа по id, сверка с docs/incidents/, гипотеза, показать
   место в коде. Дважды явно разреши остановиться и спросить меня,
   если данных не хватило.

4. .claude/agents/log-reader.md — субагент, который читает выгрузку логов
   у себя и возвращает не больше десяти строк.

5. .claude/hooks/guard-prod.sh — хук перед запуском команд. Блокирует прямой
   ssh мимо prod-logs.sh, запись в прод-базу, force-push и миграции на проде.

6. .claude/settings.json — три корзины: скрипты чтения в allow,
   git push и deploy в ask, .env и ключи в deny. Подключи оба хука.

7. scripts/check.sh — типы, линт, тесты.

8. docs/incidents/ — папка с шаблоном записи: симптом, причина, фикс,
   как воспроизвести.

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

Коротко

Возвращаюсь к вопросу из начала. Обвязка чего? Обвязка вокруг вызова модели.

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

Отсюда и одиннадцать частей из таблицы. Каждая закрывает одну конкретную нехватку возможностей LLM модели

И один пункт из таблицы я бы выделил отдельно. Строка «проверки» на мой взгляд важнее Агент работает в цикле, а цикл имеет смысл только тогда, когда между попытками что-то улучшается. Улучшается оно от сигнала «вышло плохо». Если такого сигнала в вашей задаче нет, агент будет выдавать правдоподобные черновики, сколько инструментов к нему ни подключай.

Поэтому обвязку стоит начинать не с подключения интеграций, а с вопроса, как будем проверять результат.

Практика

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

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

Задача: разбор интервью и сбор инсайтов

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

Архитектура харнеса
Архитектура харнеса

Погнали, разберем детальный каждый файл

1. Создаем папку, назову я ее «интервью» – тут все предельно просто.

2. Создаем файл CLAUDE.md если ваш основной ИИ-агент Claude Code и AGENT.md если Codex

# Разбор интервью

Продукт: сервис подбора подрядчиков для ремонта.
Пользователи: частные заказчики 30–50 лет, ремонт раз в пять-семь лет.

## Где что лежит

- `raw/` — расшифровки. Только чтение, править нельзя ничего.
- `out/` — разборы, по файлу на интервью. Имя файла совпадает с исходником.
- `state/` — память между сессиями. Читать перед началом, дописывать в конце.

## Что считается выводом

Вывод — это утверждение о пользователе, под которым стоит дословная цитата
с таймингом. Без цитаты это не вывод, а моя догадка, и в отчёт она не идёт.

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

## Чего не делать

- Не пересказывать цитаты своими словами. Дословно или никак.
- Не обобщать по одному интервью. Для обобщения есть `state/темы.md`.
- Не выносить куски расшифровок наружу: там живые люди с именами.

Обратите внимание на середину: там не описание формата, а определение того, что вообще считается выводом. Это самая полезная строчка во всём файле, потому что именно её агент нарушает чаще всего и именно её потом проверяет скрипт.

3. Дальше пишем свой SKILL.md, разница между CLAUDE.md и SKILL.md в том, если CLAUDE.md отвечают на вопрос «что здесь за проект», SKILL.md на вопрос «в каком порядке делать эту конкретную работу».

---
description: Разобрать интервью из raw/ в формат с цитатами.
  Использовать, когда просят разобрать интервью, расшифровку или созвон.
---

# Как я разбираю интервью

1. Читаю `state/разобрано.md`. Файлы из этого списка пропускаю.
2. Беру самый старый неразобранный файл из `raw/`.
3. Читаю `state/темы.md` — что уже встречалось в прошлых интервью.
4. Выписываю выводы. Под каждым — дословная цитата и тайминг.
5. Пишу результат в `out/` под тем же именем, что и исходник.
6. Дописываю в `state/темы.md` находки со счётчиками, в `state/разобрано.md` — имя файла.
7. Запускаю `bash check.sh`, чиню замечания, показываю вывод.

## Что считается хорошим разбором

- Пять-семь выводов, не больше. Длинный список означает, что я не выбрал главное.
- Слабые выводы помечены и вынесены в конец отдельным разделом.
- Есть раздел «против гипотезы»: что в этом интервью противоречит прошлым.

4. Третий файл это вот главный "Проверка" этот файл назовем check.sh – это скрипт напишет вам сам агент, если объяснить, что проверять. Ваша работа здесь не программирование, а формулировка: по каким признакам вы сами отличаете годный разбор от негодного. Скрипт лишь переводит ваш ответ на язык, который нельзя проигнорировать.

5. Добавим запретов, это будет файл settings.json. В нем лежит то, что агент не может нарушить при всём желании, потому что это уже не текст, а конфиг.

{
  "permissions": {
    "deny": ["Edit(raw/**)", "Write(raw/**)", "WebFetch"]
  },
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          { "type": "command", "command": ".claude/hooks/after-write.sh", "timeout": 30 }
        ]
      }
    ]
  }
}

Верхняя половина запрещает трогать исходники и ходить в интернет.

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

Нижняя половина хук: после каждой записи файла запускается скрипт after-write.sh, который зовёт check.sh, если запись была в out/.

#!/bin/bash
# Прогоняет проверку, если агент только что записал разбор.
FILE=$(jq -r '.tool_input.file_path // empty')
case "$FILE" in
  */out/*.md) bash check.sh >&2 ;;
esac
exit 0

Без хука проверка зависит от того, вспомнит ли агент про седьмой пункт навыка на сороковом шаге. А он вспоминает не всегда. С хуком проверка запускается сама и всегда, независимо от того, что модель себе решила. Разница ровно та же, что между просьбой и правилом.

Итак, папка с расшифровками собрана, обвязка готова. Что дальше?

Дальше вы открываете свой инструмент, Claude Code, Codex, Cursor, чем обычно пользуетесь, выбираете созданную папку и запускаете разбор. Либо обычным сообщением, либо командой /разбор-интервью. Агент проходит по всем расшифровкам в папке и раскладывает каждую по одной схеме.

И небольшой совет, который экономит больше всего времени. Zoom, Google Meet и другие сервисы умеют сохранять записи и расшифровки в выбранную папку автоматически. Укажите там ту самую папку с интервью, и промежуточный шаг со скачиванием и переносом файлов исчезает совсем. Встреча закончилась, расшифровка уже лежит там, где нужно, остаётся запустить разбор.

Спасибо, что прочитали, если что-то было не понятно, пишите и подписывайтесь на тг канал