Есть цифра, которую стоит подержать в голове минуту.

Harness-Bench: одну и ту же модель прогнали по 106 задачам внутри разных агентских обвязок. Разброс — от 52.4 до 76.2. Почти двадцать четыре пункта. Модель не менялась ни разу. Менялось то, что вокруг неё.

Ещё одна: OpenAI на ARC-AGI-3 подняла результат с 13.3% до 38.3%, не тронув веса — только тем, как хранится и сжимается рассуждение между ходами.

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

Теперь есть. Его называют **harness** — обвязкой агента.

| Поколение | Когда | Что стояло снаружи модели | Чем кончилось |
|---|---|---|---|
| 1.0 — леса, приколоченные снаружи | октябрь 2022 — 2024 | цикл ReAct приёмом в промпте, AutoGPT, BabyAGI | цикл усилил ненадёжность модели; человека вернули в каждый шаг |
| 2.0 — модель и обвязка растут вместе | с февраля 2025, Claude Code | сборка системного промпта, реестр инструментов, сжатие истории, evals | модель всасывает обвязку в веса: Anthropic сняла 80% системного промпта Claude Code |
| 3.0 — интерфейс внимания | сейчас | права, личность, доверие, читаемость | в веса не всасывается: это про человека, а не про модель |

## Что такое harness

Определение простое: **всё, кроме весов модели, что заставляет агента работать.** Окружение, инструменты, контекст, границы.

Метафора, которая мне нравится: harness даёт разуму модели тело. Чем воспринимать. Чем действовать. Где помнить. И — где остановиться.

Если считать по нашему коду, это:

- реестр примерно из девяноста инструментов;
- 111 описаний коннекторов к российским системам — 1С, МойСклад, Битрикс, Ozon, Авито, Диадок, Контур и дальше по списку;
- сборщик системного промпта из двенадцати секций;
- слой, который ужимает историю переписки, когда она перестаёт влезать в модель;
- четыре разных способа дотянуться до чужой машины;
- подсистема, которая решает, можно ли агенту прямо сейчас что-то записать.

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

## Harness 1.0: леса, приколоченные снаружи

Октябрь 2022, ReAct. Идея агентного цикла в чистом виде: рассуждает → действует → наблюдает → повторяет. Как приём в промпте.

Весна 2023, AutoGPT и BabyAGI. Все помнят звёзды на гитхабе и то, как ничего не работало. Причина сформулирована лучше всего так:

> Цикл не добавляет модели способностей. Цикл усиливает те, что у неё уже есть.

Модели 2023 года были ненадёжны на длинной дистанции. Цикл усилил ненадёжность. Агент бодро уходил в стену и продолжал идти.

Отсюда откат: Cursor и Copilot вернули человека в цикл на каждом шаге. Это было правильно тогда — и это загнало ожидания от harness ниже, чем модели уже могли. Целый год индустрия строила автодополнение, потому что обожглась на автономии.

## Harness 2.0: модель и обвязка растут вместе

Февраль 2025, Claude Code. Первый, кто попал в момент: модель дозрела до автономного исполнения ровно тогда, когда кто-то решился её отпустить.

Дальше начинается то, что происходит прямо сейчас и что важнее любого релиза модели. Модель и harness тренируются друг об друга. Лаборатория обучает модель внутри окружения с инструментами — модель всасывает поведение окружения в веса — инженеры удаляют леса, которые стали лишними. Anthropic выкинула 80% системного промпта Claude Code не потому, что он был плохой, а потому что модель научилась делать это сама.

Это неприятный для разработчика цикл. Ты пишешь инструкцию, она работает полгода, а потом становится мусором — и хуже: активно мешает, потому что модель тратит внимание на её выполнение вместо того, чтобы решать задачу.

Как это выглядит у нас. Системный промпт — не файл, а сборка. Двенадцать секций, которые включаются от фактов текущего хода: есть ли у агента руки на машине пользователя, есть ли постоянная песочница, работает ли он координатором или подчинённым. Подчинённые агенты вообще собираются из другого набора — три роли, explore / execute / verify, у каждой свой промпт и свой список инструментов.

Секцию, которая перестала быть нужной, теперь можно снять, не сломав одиннадцать остальных. Это скучная инженерия. Но без неё удалить 80% промпта физически невозможно — ты не знаешь, что именно держит систему.

И второе, что мы поняли про 2.0: **harness надо мерить.** У нас на это стоит отдельный набор evals — два с лишним десятка сценариев, где агент делает реальную работу: сверяет договоры, собирает коммерческое предложение, чинит код после падения теста, вытаскивает данные из 1С. Прогоняются в двух режимах — на моках и на живой модели.

Это меряет не модель. Это меряет наш harness. Когда выходит новая модель, мы не спрашиваем «стало ли лучше» — мы смотрим, какие сценарии сдвинулись, и это почти всегда история про то, какие наши костыли устарели.

## Побочный сюжет: четыре разных «локально»

Здесь я на минуту отвлекусь, потому что это лучшая иллюстрация того, из чего harness реально состоит — и её нет ни в одной статье про агентов.

В нашем коде слово «локально» означает четыре разные вещи:

1. Машина, на которой крутится сервер.
2. Машина, которую пользователь **попросил** использовать в этом треде — это пожелание, а не факт.
3. То, что этому клиенту вообще **разрешено** просить: у браузера, десктопного приложения и фонового задания права разные.
4. Машина, на которую вызов **реально приземлится на этом ходу**.

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

Лечится это одним правилом, которое мы держим как закон:

> Ни один текст, который читает модель, и ни один указатель, который ей передан, не имеет права называть инструмент или путь, недоступный на текущем ходу.

Звучит как гигиена. На деле это разница между агентом, который работает, и агентом, который тратит целый ход на вызов несуществующего инструмента, получает отказ, не верит ему и перепланирует. Модель не может узнать о недоступности иначе, чем позвав и получив по рукам. А неожиданный отказ она не выполняет — она его оспаривает.

Вот из такого harness и состоит. Не из архитектурных схем.

## Harness 3.0: интерфейс внимания

Теперь главное — и то, ради чего я вообще сел писать.

Если модели продолжат всасывать harness в веса, что останется снаружи?

Останется то, что моделью не всасывается в принципе. Не потому что сложно, а потому что это не про модель:

**Права** — что агенту можно. **Личность** — от чьего имени он действует. **Доверие** — сколько он делает без спроса. **Читаемость** — видно ли человеку, что произошло.

Harness перестаёт быть средством управления моделью и становится интерфейсом управления **вниманием человека**. Когда агенту позволено тебя прервать. Когда он должен молча продолжать. Какие решения он принимает один.

Прогноз автора исходной статьи: в течение года такую поверхность отгрузят все — аналог `AGENTS.md`, только не про то, как писать код, а про то, когда дёргать человека. Потому что внимание человека — единственный по-настоящему дефицитный ресурс во всей конструкции.

Мы начали строить это до того, как прочитали формулировку. Расскажу, что получилось, включая то, что пока не включено.

**Каждая запись — объект, а не строка.** Прежде чем агент что-то изменит, собирается намерение записи: какую систему трогаем, что за действие, как это показать человеку, какие поля меняются с чего на что, и — обязательно — план отката. Один объект кормит собой всё: карточку согласия, решение гейта, строку в аудите, откат. Записать что-то агент может тремя разными путями — сам, из кода в песочнице, через внешний инструмент по MCP. Все три описывают запись одинаково, потому что объект один.

**Классификатор, а не регулярка.** Вызов классифицируется как чтение / изменение / необратимое. Никакого разбора командной строки регулярными выражениями — это путь, на котором рано или поздно `rm` внутри кавычек проходит как безобидный.

**Пресеты автономии.** Два: «только чтение» и «сам правит». Второй автоматически пропускает низкорисковые записи на хосте и в браузере — но **никогда** исходящие вызовы к внешним системам. Отправить в 1С, опубликовать в Ozon, запостить в мессенджер — спрашивает всегда, при любом пресете. Браузер при этом считается низкорисковым: водить мышкой по сайту — человеческий эквивалент чтения.

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

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

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

**Откат всегда вперёд.** План отката для коммита прибит к конкретному sha и делает `git revert`, а не `reset --hard` — потому что репозиторий может быть настоящим и уже отправленным. Если этот коммит не находится, план отката просто выбрасывается: лучше остаться без отката, чем с опасным.

**И — экран «что агенту тут можно».** Название режима на этот вопрос не отвечает. Один и тот же «сам правит» ведёт себя по-разному у частного пользователя и внутри компании, которая срезала потолок прав своим сотрудникам. Поэтому мы показываем не название, а всю раскладку: что выбрал сам человек, какой потолок поставила компания, что получилось на пересечении, и все правила построчно — с пометкой, откуда каждое взялось. Режим, который компания **понизила**, помечен как срезанный; режим, который она просто предложила по умолчанию, — нет. Это разные вещи, и потолок из них только один. Ровно здесь и живёт вопрос «а почему он у меня опять спросил».

**Общий рубильник сейчас выключен.** Всё это работает в теневом режиме: система разбирает вызов, принимает решение, пишет строку в журнал — и никого не останавливает. Записи, прошедшие мимо проверки, мы считаем, но не запрещаем. Включить проверку по-настоящему пользователь может сам, одним переключателем в настройках.

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

## Что из этого следует

Три вещи, за которые я готов отвечать.

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

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

**Третье, и оно про ближайший год.** Автономия перестала быть техническим вопросом раньше, чем стала технически возможной. Как только агент по-настоящему пишет в вашу учётную систему, остаются ровно три вопроса: кто это разрешил, видно ли это, и можно ли откатить. Мы к этому шли от обратного: сначала построили леджер и откат, потом гейт, и только в конце — экран, объясняющий человеку, что происходит.

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