Большинство людей пытаются починить AI-агентов не на том уровне.
Когда агент ошибается, они переписывают промпт. Когда он ошибается снова — добавляют больше инструкций, меняют модель, увеличивают контекстное окно или подключают еще один инструмент.
А потом те же проблемы возвращаются.
Агент забывает важное решение. Использует не тот инструмент. Теряет нить того, что произошло три шага назад. Заявляет, что задача выполнена, даже не проверив результат. Снова и снова пытается выполнить одно и то же действие, пока не закончится бюджет.
Проблема не всегда в модели.
Проблема — в среде вокруг нее.
Эта среда и есть harness (обвязка).
Harness Engineering (инженерия обвязок) — это практика построения системы вокруг модели, которая определяет, что она может видеть, что делать, что запоминать, что считается успехом и что происходит при сбое.
Лучший промпт может улучшить один ответ.
Лучшая обвязка улучшает каждый запуск.
Подписывайтесь на мой Substack, чтобы получать больше практических разборов AI-агентов, автоматизации и продакшен-систем:
1. Модель — это не агент
Модель умеет рассуждать, генерировать, сравнивать и выбирать.
Но это не делает ее надежным агентом.
Настоящему агенту нужно еще находить нужный контекст, использовать инструменты, сохранять состояние, соблюдать права доступа, проверять собственную работу и восстанавливаться, когда среда ведет себя не так, как ожидалось.
Модель — это только движок рассуждений.
Обвязка — это всё, что превращает эти рассуждения в реальное выполнение.
1ЗАПРОС ПОЛЬЗОВАТЕЛЯ2 |3 v4+-----------------------------+5| ОБВЯЗКА |6| |7| контракт контекст |8| инструменты состояние |9| политика верификация |10| трассировки восстановление|11+-----------------------------+12 |13 v14 МОДЕЛЬ15 |16 v17РЕАЛЬНАЯ СРЕДА
Поместите ту же модель в чат-бокс — и она будет просто отвечать на вопросы.

Поместите её в репозиторий с доступом к терминалу, тестами, браузерными инструментами, памятью проекта, контролируемыми правами и циклом ревью — и она сможет выполнять реальную работу.
Модель не изменилась.
Изменилась обвязка.
2. Превращайте каждый запрос в контракт
Естественный язык гибок.
Автономное выполнение — нет.
Запрос вроде:
Улучши процесс онбординга.
отлично работает, когда человек сидит рядом с моделью.
Но как продакшен-инструкция он ужасен.
Прежде чем агент начнет действовать, превратите запрос в ограниченный контракт задачи.

1objective: снизить отток пользователей на этапе онбординга23inputs:4 - описание продукта5 - данные аналитики6 - репозиторий78constraints:9 - сохранить аутентификацию10 - не менять схему базы данных11 - сохранить текущее поведение на мобильных устройствах1213deliverable:14 - готовый к ревью pull request1516done_when:17 - тесты проходят18 - событие аналитики отправляется корректно19 - десктопный сценарий проходит ревью20 - мобильный сценарий проходит ревью2122approval_required:23 - деплой в продакшен
Самое важное здесь — done_when (условия завершения).
Без него агент может решить чуть более простую версию задачи и уверенно заявить, что работа выполнена.
С ним завершение становится измеримым.
Агент не должен спрашивать:
Что мне делать дальше?
Он должен спрашивать:
Какое действие приблизит текущую среду к результату, описанному в контракте?
Это гораздо более сильный цикл.
3. Дайте агенту карту, а не гигантское контекстное окно
Типичная реакция на ошибки агента — дать модели больше контекста.
Больше документации.
Больше истории диалога.
Больше файлов.
Больше вывода инструментов.
В итоге агент получает вообще всё и понимает всё меньше.
Контекст — это не хранилище.
Это бюджет внимания.

Вместо того чтобы вываливать весь проект в каждый запуск, дайте агенту небольшую карту, где искать полезную информацию.
1КАРТА ПРОЕКТА23правила продукта -> docs/product/4архитектура -> docs/architecture.md5фронтенд -> apps/web/6бэкенд -> services/api/7тесты -> tests/8команды -> docs/commands.md9безопасность -> docs/security.md
И раскрывайте детали только по мере необходимости.
1ЗАДАЧА2 |3 v4КАРТА ПРОЕКТА5 |6 v7НУЖНАЯ СИСТЕМА8 |9 v10КОНКРЕТНЫЕ ФАЙЛЫ11 |12 v13ЛОКАЛЬНЫЕ ИНСТРУКЦИИ
В исходных материалах это называется прогрессивным раскрытием: обвязка должна подгружать больше информации потому, что этого требует задача, а не просто потому, что эта информация существует.
Цель — не максимальный контекст.
Цель — максимум полезного сигнала.
4. Поставьте шлюз между моделью и её инструментами
Модель с двадцатью инструментами автоматически не становится в двадцать раз способнее.
Возможно, у неё просто появляется двадцать новых способов сломаться.
У каждого инструмента должен быть контракт.
1ИНСТРУМЕНТ: edit_file23ВХОДНЫЕ ДАННЫЕ4path5patch67ПРЕДУСЛОВИЯ8path существует9path находится внутри рабочей директории1011УСПЕХ12patch применен13diff возвращен1415ОШИБКА16структурированная ошибка17никаких частичных перезаписей1819РИСК20обратимо
Тогда путь выполнения выглядит так:
1МОДЕЛЬ ПРЕДЛАГАЕТ2 |3 v4ШЛЮЗ ПРОВЕРЯЕТ5 |6 v7ПОЛИТИКА АВТОРИЗУЕТ8 |9 v10ИНСТРУМЕНТ ВЫПОЛНЯЕТ11 |12 v13ОБВЯЗКА ФИКСИРУЕТ РЕЗУЛЬТАТ
Модель решает, какое действие она хочет совершить.
Обвязка решает, допустимо ли это действие, разрешено ли оно и безопасно ли.

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

1{2 "task_id": "feature_042",3 "status": "verifying",4 "current_step": "mobile_check",56 "completed": [7 "implementation",8 "unit_tests",9 "desktop_check"10 ],1112 "decisions": [13 "reuse existing export endpoint",14 "preserve current date format"15 ],1617 "artifacts": [18 "export.csv",19 "desktop-after.png"20 ],2122 "open_risks": [23 "mobile toolbar may overflow"24 ],2526 "next_action": "render mobile viewport"27}
Полезная система разделяет память на четыре категории:
1ФАКТЫ2стабильные знания34РЕШЕНИЯ5что было выбрано и почему67СОСТОЯНИЕ8на каком этапе находится текущий запуск910УРОКИ11ошибки, которые должны повлиять на будущие запуски
Следующая сессия агента должна наследовать состояние работы, а не сжатый пересказ предыдущего диалога.
6. Сделайте доказательства пропуском к завершению
Слова агента «готово» — не доказательство того, что работа сделана.

Это просто еще один вывод модели.
Обвязке нужны наблюдаемые доказательства.
1УТВЕРЖДЕНИЕ ДОКАЗАТЕЛЬСТВО23«баг исправлен» падающий тест теперь проходит4«страница работает» браузерный сценарий пройден5«данные верны» значения совпадают с источником6«миграция безопасна» успешный dry run + откат7«задача выполнена» все проверки приемки пройдены
Сначала используйте детерминированные проверки.
1синтаксис2 |3 v4типы5 |6 v7целевые тесты8 |9 v10интеграционные тесты11 |12 v13визуальное / семантическое ревью14 |15 v16подтверждение человеком
Не просите другую модель отвечать на то, что может доказать компилятор, тест, схема или запрос к базе данных.
Используйте модели для суждений.
Используйте детерминированные системы для фактов.
Модель создает артефакт.
Среда создает доказательства об этом артефакте.
Обвязка решает, достаточно ли этих доказательств.
7. Отделите создателя от проверяющего
У саморевью есть еще одна проблема.
Агент, допустивший ошибку, часто переносит те же ложные предпосылки и в этап проверки.

Более сильная архитектура разделяет исполнителя и проверяющего.
1СОЗДАТЕЛЬ2 |3 v4создает кандидата5 |6 v7ПРОВЕРЯЮЩИЙ8 |9 +-- сверяет с контрактом10 +-- ищет упущенные случаи11 +-- тестирует необоснованные утверждения12 +-- пытается сломать результат13 |14 +------ УСПЕХ ------> ПРИНЯТЬ15 |16 +------ ПРОВАЛ ------> ВЕРНУТЬ ДОКАЗАТЕЛЬСТВА
Проверяющий не должен спрашивать:
Выглядит нормально?
Он должен спрашивать:
Что сделало бы этот результат неприемлемым?
Это превращает ревью из поиска подтверждений в попытку опровержения.
Исходные материалы прямо рекомендуют давать процессу верификации собственные критерии отклонения и достаточно независимости, чтобы ставить под сомнение предпосылки, которые привели к первому результату.
8. Вынесите права доступа за пределы модели
Некоторые правила никогда не должны зависеть от того, вспомнит их модель или нет.
1никогда не публиковать без одобрения2никогда не раскрывать секреты3никогда не превышать лимит расходов4никогда не писать за пределами рабочей директории5никогда не заявлять, что тесты пройдены, если они не запускались
Это не пожелания для промпта.

Это политика.
Простая лестница прав доступа:
1НИЗКИЙ РИСК23чтение4поиск5инспекция67-> автоматически89ОБРАТИМОЕ1011редактирование рабочей директории12запуск тестов13создание черновика1415-> автоматически + трассировка1617ВНЕШНИЙ ЭФФЕКТ1819отправка20деплой21покупка2223-> требуется одобрение2425НЕОБРАТИМОЕ / ЧУВСТВИТЕЛЬНОЕ2627удаление данных28ротация ключей29глобальная публикация3031-> жесткий шлюз или запрещено
Чем серьезнее последствия, тем строже контроль.
Модель может рекомендовать действие.
Обвязка его авторизует.
Инструмент выполняет.
Автономность — это не отсутствие контроля.
Это свобода в рамках установленных границ.
9. Перестаньте слепо повторять попытки
Одна из худших стратегий восстановления:
Что-то пошло не так. Попробуй еще раз.
Если ничего не меняется, система просто платит за воспроизведение той же ошибки.
Сначала сбои нужно классифицировать.

1ТАЙМАУТ ИНСТРУМЕНТА2-> повторить с экспоненциальной задержкой34НЕВЕРНЫЕ АРГУМЕНТЫ5-> исправить вызов инструмента67НЕХВАТКА КОНТЕКСТА8-> получить недостающий источник910ПАДЕНИЕ ТЕСТА11-> изучить причину сбоя1213ДОСТУП ЗАПРЕЩЕН14-> запросить одобрение1516КОНФЛИКТ ТРЕБОВАНИЙ17-> эскалировать1819ПОВТОРЯЮЩИЙСЯ СБОЙ БЕЗ ИЗМЕНЕНИЙ20-> остановиться
Полезный цикл агента выглядит так:
1НАБЛЮДАТЬ2 |3 v4РЕШАТЬ5 |6 v7ДЕЙСТВОВАТЬ8 |9 v10ИЗМЕРЯТЬ11 |12 +---- ПРИНЯТЬ13 |14 +---- ИСПРАВИТЬ15 |16 +---- ЭСКАЛИРОВАТЬ17 |18 +---- ОСТАНОВИТЬ
Каждый цикл должен иметь ограничения по числу попыток, времени, расходам и масштабу разрушений.
Надежному агенту нужно знать, как продолжать работу.
Но ему также нужно знать, когда очередная попытка уже не имеет смысла.
10. Превращайте повторяющиеся инструкции в инфраструктуру
Допустим, в промпте написано:
Всегда запускай форматтер.
Это правило станет надежнее, если форматтер будет запускаться автоматически.
Допустим, инструкция гласит:
UI-код не должен обращаться к базе данных напрямую.
Это правило станет сильнее, если оформить его как архитектурный тест, который падает при нарушении.
Прогрессия выглядит так:
1ОБЪЯСНЕНИЕ2 |3 v4ЧЕК-ЛИСТ5 |6 v7ШАБЛОН8 |9 v10АВТОМАТИЧЕСКАЯ ПРОВЕРКА11 |12 v13ПРИНУДИТЕЛЬНАЯ ПОЛИТИКА
Промпт должен объяснять логику принятия решений.
Обвязка должна обеспечивать соблюдение инвариантов.
Каждая повторяющаяся ошибка должна спускаться на ступеньку ниже по этой лестнице.
В итоге модели больше не нужно помнить урок.
Среда помнит его за неё.
11. Записывайте ход выполнения
Идеальный финальный артефакт может скрывать ужасный путь выполнения.
Возможно, агент обратился не к тому источнику.
Возможно, он проигнорировал упавшую команду.
Возможно, он дважды выполнил внешнее действие.
Возможно, он потратил в десять раз больше ожидаемого бюджета.
Возможно, он получил правильный ответ по неправильной причине.
Сохраняйте достаточно информации, чтобы восстановить ход событий.
109:14 создан контракт задачи209:15 загружен architecture.md309:17 отредактирован checkout.ts409:18 целевой тест упал509:21 реализация исправлена609:22 целевой тест пройден709:24 интеграционный тест пройден809:25 деплой заблокирован: требуется одобрение
Полезные трассировки включают источники контекста, вызовы инструментов, изменения состояния, результаты проверок, причины повторных попыток, решения об одобрении, стоимость и задержки.
Смысл не в том, чтобы собирать логи ради развлечения.
Смысл в том, чтобы локализовать сбой.
Если ломается шаг 18, вы должны иметь возможность починить именно шаг 18.
Вам не должно требоваться прогонять весь запуск заново.
12. Выдавайте квитанцию на каждый запуск
Не заставляйте человека читать лог из сорока сообщений.
Соберите результат в короткую квитанцию.
1ЦЕЛЬ23Исправить двойное применение купона.45ИЗМЕНЕНО67валидация чекаута8регрессионный тест910ПРОВЕРЕНО1112lint пройден13юнит-тесты пройдены14интеграционный тест пройден1516НЕ ПРОВЕРЕНО1718продакшен-провайдер платежей1920РИСКИ2122старый мобильный клиент недоступен2324ТРЕБУЕТСЯ ОДОБРЕНИЕ2526деплой на staging
Это не краткое изложение того, что, по словам модели, произошло.
Это сводка того, что обвязка может доказать.
Именно это различие делает квитанцию полезной для ревью, передачи дел и будущих сессий агента.
13. Пусть каждый сбой улучшает обвязку
Большинство команд чинят неудачный результат.
Лучший подход — чинить систему, которая допустила сбой.
1НЕХВАТКА КОНТЕКСТА2-> улучшить карту проекта34НЕ ТОТ ИНСТРУМЕНТ5-> улучшить маршрутизацию или контракт инструмента67ПЛОХОЙ РЕЗУЛЬТАТ8-> добавить валидатор910ЗАЦИКЛИВАНИЕ11-> добавить лимит повторных попыток1213НЕБЕЗОПАСНОЕ ДЕЙСТВИЕ14-> добавить шлюз прав доступа1516ПОТЕРЯНО РЕШЕНИЕ17-> сохранять состояние1819НЕИЗВЕСТНЫЙ СБОЙ20-> улучшить трассировку
Именно здесь инженерия обвязок начинает давать накопительный эффект.
Один исправленный результат помогает одному запуску.
Одна исправленная обвязка улучшает все последующие запуски.
Лучшие системы агентов становятся надежнее, потому что ошибки оставляют после себя инфраструктуру.
14. Начните с минимально полезной обвязки
Чтобы начать, вам не нужна огромная платформа оркестрации.
Стройте слоями.
1УРОВЕНЬ 023промпт4модель56УРОВЕНЬ 178контракт задачи9карта проекта10инструменты1112УРОВЕНЬ 21314структурированное состояние15верификация16ограниченный цикл1718УРОВЕНЬ 31920права доступа21трассировки22восстановление23шлюзы с участием человека
Короткой исследовательской задаче может хватить промпта и одного ревью.
Шестичасовой задаче по написанию кода с доступом к файлам, сети и возможностью деплоя нужно гораздо больше.
Добавляйте сложность тогда, когда поверхность отказов этого требует.
А не потому, что архитектура агентов выглядит круто.
Чек-лист Harness Engineering
Прежде чем давать агенту значимую автономию, спросите себя:
1[ ] Определен ли успех до начала выполнения?23[ ] Может ли агент найти нужный контекст,4 не загружая вообще всё?56[ ] Есть ли у каждого инструмента четкая цель,7 схема и состояние ошибки?89[ ] Хранятся ли важные решения10 за пределами диалога?1112[ ] Требуются ли доказательства для завершения?1314[ ] Защищены ли рискованные действия политикой?1516[ ] Есть ли у каждого цикла лимит повторных попыток?1718[ ] Может ли запуск продолжиться после прерывания?1920[ ] Можете ли вы восстановить каждое важное действие?2122[ ] Улучшает ли сбой какое-либо правило, инструмент,23 тест, карту или право доступа?2425[ ] Можно ли откатить итоговое изменение?
Если на несколько вопросов ответ «нет», более мощная модель автоматически не сделает агента надежным.
Она просто сделает сбой быстрее и дороже.
Настоящий сдвиг парадигмы
Prompt engineering спрашивает:
Что я должен сказать модели?
Context engineering спрашивает:
Что модель должна знать прямо сейчас?
Harness engineering спрашивает:
Какая система позволит модели действовать, проверять свою работу, восстанавливаться после сбоев и работать безопасно?
1ПРОМПТ2-> инструкция34КОНТЕКСТ5-> рабочая картина67ОБВЯЗКА8-> операционная среда910ЦИКЛ11-> локальная корректировка1213ГРАФ14-> координация
Модели будут продолжать меняться.
Долгосрочное преимущество живет вокруг них.
Ваши контракты становятся лучше.
Ваши инструменты становятся лучше.
Ваши тесты становятся лучше.
Ваше состояние становится чище.
Ваши права доступа становятся безопаснее.
Ваша логика восстановления становится умнее.
Ваши сбои превращаются в инфраструктуру.
Именно так способные модели становятся надежными агентами.
Это и есть Harness Engineering.
Если вы дочитали до этого места
Добавьте это руководство в закладки.
Подписывайтесь на меня в X: x.com/0xjmori
Подписывайтесь на мой Substack: substack.com/@lunarresearcher
Отправьте эту статью тому, кто до сих пор пытается лечить любой сбой агента более длинным промптом.



![[Извинения] Я больше не рекомендую фриланс ради независимости.](/cdn-cgi/image/width=1920,quality=90,format=auto,metadata=none/https%3A%2F%2Fcms-assets.youmind.com%2Fmedia%2F1790615558140_ndvona_HTQ9s6laYAAX4J7.jpg)

