Harness — это и есть продукт
На Terminal-Bench одна и та же модель набирает результаты, различающиеся почти на 30 пунктов, в зависимости от агента, который её запускает. Что говорят опубликованные данные и что с этим делает Cusp.
· The Cusp team
Когда сравнивают агентов для программирования, обычно сравнивают модели. Какая умнее, какая дешевле, какая на этой неделе возглавляет рейтинг. Это разумный инстинкт, но на многих задачах это не та переменная.
За последний год накопилось достаточно публичных результатов, чтобы выделить влияние harness — обвязки вокруг модели: цикла, инструментов, промптов и всей инфраструктуры вокруг неё. Зафиксируйте модель, поменяйте harness — и результат сдвинется. На задачах, где много работы в терминале, — на десятки пунктов.
В этой статье мы разберём эти данные, а затем расскажем, что из-за них встроили в Cusp.
Та же модель, другой harness
Terminal-Bench оценивает агентов на реальных задачах в терминале: собери это, исправь то, запусти этот сервис. Несколько групп прогнали одну и ту же модель через разные harness и опубликовали результаты. В таблице — их числа, а названия harness даны так, как в источниках.
| Модель | Бенчмарк | Результаты по harness | Разброс |
|---|---|---|---|
| GPT-5.4 | Terminal-Bench 2 | OpenCode 47,2, Terminus-2 62,9, NexAU0 bash-only seed 69,7, Codex 71,9, AHE 77,0 | 29,8 пункта |
| GPT-5.4-mini | Terminal-Bench 2.1 | Terminus-2 36,9, Codex CLI 66,1 | 29,2 пункта |
| Opus 4.6 | Terminal-Bench 2 | Claude Code 58,0, Terminus-2 62,9, Terminus-KIRA 74,7, Meta-Harness 76,4 | 18,4 пункта |
| Haiku 4.5 | Terminal-Bench 2 | Claude Code 27,5, Terminus-2 28,3, KIRA 33,7, Goose 35,5, Meta-Harness 37,6 | 10,1 пункта |
Источники: GPT-5.4 — из статьи об AHE; GPT-5.4-mini — из анонса Terminal-Bench 2.1; Opus 4.6 и Haiku 4.5 — из arXiv 2603.28052.
Это разброс в 29,8 пункта при одной и той же модели. Изменилось только то, как её попросили работать.
Сильнее всего выигрывают слабые модели
Самое важное для нас число — сравнение внутри статьи об AHE. Её авторы искали лучший harness, зафиксировали его и применили к другим моделям. Зафиксированный harness дал DeepSeek-v4-flash +10,1 пункта, а GPT-5.4 — только +2,3 (источник).
Эта закономерность повторяется. Передовые модели сглаживают посредственный harness: они сами справляются с неудобными инструментами и недостающим контекстом. Небольшие и открытые модели так не могут, поэтому им больше всего помогает harness, который идёт им навстречу.
Ещё два наблюдения за пределами Terminal-Bench указывают в ту же сторону. Оба — от проектов, которые ведут эти бенчмарки:
- Рейтинг правок кода Aider оценивает каждую модель отдельно для каждого формата правок и считает, какая доля её правок корректна по форме; у одной и той же модели результат меняется вместе с форматом (рейтинг).
- Правки строк с привязкой к хешу подняли Grok Code Fast с 6,7 до 68,3 % на бенчмарке правок oh-my-pi, по данным самого проекта (источник).
А один результат говорит о другом: хороший нейтральный harness выравнивает модели. Terminus-KIRA сообщает почти одинаковые результаты на Terminal-Bench у моделей трёх разных вендоров: GPT-5.3-Codex — 75,5 %, Opus 4.6 — 75,7 %, Gemini 3.1 Pro — 74,8 % (источник). При достаточно хорошем harness выбор модели всё больше становится вопросом цены и предпочтений, а не только возможностей.
На эту ставку и сделан Cusp.
Где разброс небольшой
Справедливости ради: на задачах в стиле патчей, таких как SWE-bench, разброс гораздо меньше. Агент на 100 строк, работающий только через bash, — mini-swe-agent — в опубликованных сравнениях не отстаёт от собственных harness лабораторий, и именно его используют рейтинги SWE-bench Pro и DeepSWE. Когда задача звучит как «прочитай эти файлы и напиши дифф», передовым моделям почти не нужна помощь.
Но у открытых моделей, доступных через шлюз, даже похожие доли решённых задач скрывают разницу в стоимости.
Исследование Qwen 3.6 Plus и MiniMax M2.5 показало, что доли решённых задач в Goose, OpenCode и OpenHands различаются не более чем на 0–8 пунктов, а число токенов на решённую задачу отличается в 40 раз — примерно от 30k до 1,3M (источник).
Счёт определил harness.
Что на самом деле помогает
Не каждое изменение harness помогает. В работе об AHE переписанный системный промпт на 79 строк про «дисциплину» снизил результат на 2,3 пункта (источник). Авторы Meta-Harness сообщают, что все шесть их предыдущих итераций промпта и потока завершения ухудшили результат (источник). Шлифовка формулировок промпта — наименее надёжный рычаг.
Помогает в основном механика. Примерно в порядке того, насколько это подтверждают данные:
- Давайте модели те форматы инструментов, на которых она обучалась, через нативный вызов инструментов.
- Передавайте состояние рассуждений туда и обратно. Потеря следов рассуждений стоила GPT-5-Codex 30 % на внутреннем бенчмарке одного из разработчиков инструментов (источник). У некоторых провайдеров пропущенный блок рассуждений — это HTTP 400.
- Сделайте так, чтобы оболочка работала как настоящий терминал: неинтерактивное окружение, PTY для интерактивных программ, фоновые процессы, тайм-ауты, которые не убивают долгие сборки, ограниченный вывод.
- Подготовьте окружение до первого хода. «Не установлено» и «нет в PATH» — это 24,1 % сбоев команд на Terminal-Bench 2 (источник). В работе о Meta-Harness сбор базовых сведений заранее экономил от двух до четырёх ходов (источник).
- Требуйте проверки перед остановкой. Хук завершения, который принудительно запускает проверку, дал +2,2 пункта в AHE (источник).
- Держите план ближе к концу контекста, где модель обращает на него внимание.
- Держите контекст стабильным для кеша и обрезайте старый вывод инструментов перед суммаризацией.
- Сохраняйте выводы между сессиями.
Что делает Cusp
Вот как этот список ложится на Cusp 0.1, включая то, что ещё не готово.
Форматы правок для каждого семейства. Cusp хранит профиль для каждого семейства моделей и выбирает инструмент правки в соответствии с ним. Модели семейства GPT получают apply_patch в формате V4A, на котором они обучались, — там, где это возможно, как нативный инструмент OpenAI. Claude и Gemini получают Edit и MultiEdit в стиле str_replace с лестницей нечёткого сопоставления, которая сообщает, когда ей пришлось сделать поблажку. Более слабые и локальные модели получают EditLines: каждая строка в выводе Read несёт короткий хеш содержимого, и модель правит по якорю, а не воспроизводит точный текст. Канонические названия инструментов для хуков и правил разрешений остаются прежними, так что вашей конфигурации всё равно, на каком диалекте говорит модель.
Состояние рассуждений туда и обратно. Подписи thinking от Anthropic, зашифрованные рассуждения OpenAI, подписи мыслей Gemini и поля рассуждений, которых ожидают DeepSeek, Kimi и GLM, хранятся непрозрачно вместе с каждым сообщением и воспроизводятся байт в байт для той же модели. При смене модели посреди сессии отправляется безопасная проекция, и это фиксируется.
Оболочка, которая работает. Каждая команда выполняется с закрытым stdin и отключёнными пейджерами, поэтому команды не зависают в ожидании ввода. Рабочий каталог сохраняется внутри рабочей области. Команда, превысившая тайм-аут, уходит в фон, а не завершается, и агенту сообщают, когда она закончится. Process запускает dev-серверы и ждёт, пока откроется порт. Terminal управляет REPL, отладчиками и всем остальным, чему нужен настоящий PTY. Вывод длиннее примерно 30 000 символов обрезается до начала и конца, а полный текст сохраняется как артефакт, по которому агент может искать.
Терпимость к неидеальным моделям. Прежде чем ход будет признан неудачным, некорректный JSON исправляется, типы приводятся по схеме, а вызовы инструментов, которые открытые модели встраивают в текст, извлекаются. Детектор циклов следит за повторяющимися циклами инструментов и повторяющимися ошибками.
Диагностика после каждой правки. После правки Cusp запускает проверку типов или языковой сервер и добавляет новые ошибки к результату инструмента. Агент видит, что сломал, на том же шаге.
Контекст, стабильный для кеша. Системный промпт и список инструментов остаются побайтово одинаковыми от хода к ходу. Редко используемые инструменты и все инструменты MCP откладываются и загружаются по запросу — их добавляют после основного набора, так что кешированный префикс остаётся прежним. Cusp сам задаёт ключ кеша для каждого провайдера и расставляет точки кеширования Anthropic.
Ещё в работе. Подготовка окружения на нулевом ходу и встроенная проверка перед остановкой агента сейчас в разработке. А пока хук Stop, который запускает ваши тесты, даёт ту же проверку уже сегодня; пример есть в документации по хукам.
Как мы это измеряем
Утверждения о качестве harness должны подкрепляться прогонами, а не эпитетами. Мы интегрируем Cusp с Harbor — фреймворком, на котором построен Terminal-Bench, — чтобы его можно было запускать так же, как любого другого агента в рейтинге. Мы опубликуем наши прогоны в Harbor с полными конфигурациями и траекториями, на передовых и открытых моделях, включая те, где мы проигрываем.
Две оговорки, которых мы будем придерживаться. Одна только инфраструктура сдвигает результаты Terminal-Bench 2 примерно на 6 пунктов (источник), поэтому разницу меньше 3 пунктов мы будем считать шумом. А прогоны бенчмарков будут идти на чистом каркасе, без файлов инструкций проекта, через которые могли бы утечь ответы.
Пока этих прогонов нет, мы не называем никаких чисел для Cusp. Данные выше — чужие, и именно из-за них мы построили Cusp так, как построили.