Как применить open-source модель №1 для фронтенда: руководство по harness для Kimi K3
Prompt, context, loop и graph engineering оказываются частями одной машины. Harness — рамка, где они наконец живут вместе.
Оригинал опубликован Mr. Buzzoni в X. Перевод полной X Article.
Prompt, context, loop и graph engineering оказались частями одной и той же машины. Harness — место, где они наконец живут вместе.
Каждый этап работы с AI получал собственную должность. Сначала был prompt engineering, когда всё ремесло сводилось к поиску правильного предложения.
Затем пришёл context engineering, когда стало очевидно: предложение значит меньше, чем всё, что загружено вокруг него. Этим летом настала очередь loops, а через несколько недель — graphs.
Теперь распространяется название harness engineering, и это первое название, которое объясняет все остальные.

Harness — это всё вокруг модели: инструменты, которые она может вызывать; файлы, которые она читает перед началом; директории, куда ей можно писать; проверка, которую должен пройти её результат; расписание, которое её будит; и правило, которое завершает запуск.
Каждая дисциплина до него оказывается отдельным компонентом этой рамки, построенным отдельно и получившим собственное имя.
Я начал обращать на это внимание по практической причине. Модель под капотом продолжает меняться, иногда на семнадцать мест в leaderboard за одно обновление, а harness — единственная часть системы, которая остаётся вашей.
1/ Семь engineerings, одна машина
| Дисциплина | На какой вопрос отвечает | Где живёт в harness |
|---|---|---|
| Prompt engineering | Что именно я прошу | SKILL.md, task spec, загружаемый первым |
| Context engineering | Что модель видит на каждом шаге | Context assembler: constraints, schemas, retrieved pages |
| Tool engineering | К чему она может прикасаться и в какой форме | Tool definitions с typed inputs и outputs |
| Loop engineering | Что запускает run и что его завершает | Runner: triggers, stop conditions, budgets |
| Graph engineering | Что она помнит и как всё связано | Memory layer: nodes, typed edges, aliases |
| Eval engineering | Как результат отклоняется | Verifier, вне контроля агента |
| Harness engineering | Что удерживает всё перечисленное вместе | Frame, permissions и hooks |
Читайте таблицу сверху вниз — это история. Читайте снизу вверх — это архитектура: harness engineering решает, где живёт каждая из остальных шести частей, чтобы ни одна из них не пряталась в prompt.
Этот последний пункт несёт основную нагрузку. Prompt — самое простое место, куда можно положить что угодно, поэтому туда постепенно сползает всё: output format, stopping rule, исправления прошлой недели, список вещей, к которым агент никогда не должен прикасаться. Это прекрасно работает на модели, для которой вы это написали, а затем следующая модель читает тот же абзац иначе.
2/ Анатомия harness
Самая полезная привычка, которую я приобрёл, — записывать весь harness как один config file, чтобы ничего важного не оставалось implicit:
# harness.yaml
model: kimi-k3 # one line. everything below survives a swap
tools: [browser, fs, shell, search]
permissions:
write: [./10-returns, ./20-graph, ./40-runs]
ask_first: [send, publish, pay, delete]
context:
always: [SKILL.md, CONSTRAINTS.md, SCHEMA.md]
per_agent: return_schema
runner:
trigger: cron "0 2 * * *" # nightly, while you sleep
stop: 40 verified nodes OR 3 passes with nothing new
budget: { agents: 300, minutes: 45, retries: 2 }
memory:
graph: ./20-graph
aliases: ./aliases.csv
verify:
- script: checks/schema.py
- agent: reviewer, fresh context
hooks:
pre_tool: hooks/pre_tool.sh
post_run: append 40-runs/
Три строки в этом файле делают большую часть работы.
model: — одна строка намеренно. Всё остальное написано так, чтобы ему было всё равно, что сказано в этой строке. В этом вся история portability.
permissions: важнее, чем tools:, хотя находится ниже в файле. Явно записать, что агент может менять и о чём он должен сначала спросить, — это то, что отделяет систему, которую можно оставить работать на ночь, от системы, за которой нужно сидеть и смотреть.
verify: содержит два пункта не случайно. Скрипт почти ничего не стоит и ловит всё механическое. Reviewer — второй агент, который не видел работу первого, потому что агент, оценивающий собственный output, найдёт любую причину его одобрить.
На диске harness — это одна папка, и у каждого engineering из таблицы есть собственный адрес внутри неё.

3/ Почему Kimi K3 — engine, который я бы туда поставил
| Что нужно harness | Что даёт Kimi K3 |
|---|---|
| Runner, который умеет fan out | Agent Swarm: до 300 агентов над одной задачей одновременно, без написания orchestrator |
| Код достаточно сильный, чтобы писать собственные проверки | №1 в Frontend Code Arena с 1 679, впереди Fable 5 (1 631) и GPT-5.6 Sol (1 618), лидер в 6 из 7 domains |
| Engine, который улучшается под вами | С #18 до #1 за одно июльское обновление |
Первая строка важнее, чем кажется. Почти каждый самодельный harness в какой-то момент выращивает hand-built orchestrator, и обычно это самый хрупкий файл в папке. Со swarm fan-out становится budget line — agents: 300, а harness должен только обработать то, что вернётся.
Вторая строка важна, потому что harness — это в основном код, который модель пишет для вас: hook scripts, schema checks, небольшой dashboard, читающий 40-runs. Engine, лидирующий во frontend arena, гораздо чаще делает это правильно с первой попытки.
Третья строка — аргумент в пользу harness engineering в одной цифре. Когда модель за ночь поднимается на семнадцать мест, harness позволяет использовать этот рост в тот же день, потому что поменять нужно только строку model.
4/ Hooks: рефлексы
Hook — короткий скрипт, который harness запускает в фиксированный момент, независимо от того, что решит сделать модель. Hooks — это место, где harness перестаёт быть раскладкой папок и начинает вести себя как safety system.
| Hook | Когда срабатывает | Что делает |
|---|---|---|
| pre_tool | Перед любым tool call | Блокирует запись вне permission list |
| post_tool | После каждого return | Запускает schema check и сразу отклоняет malformed output |
| pre_send | Перед всем, что покидает машину | Удерживает это в queue, пока вы не разрешите |
| on_fail | После отклонённого результата | Прикрепляет failure reason к retry |
| post_run | Когда достигнуто stop condition | Добавляет run record в 40-runs и делает diff graph |
pre_tool hook из первой строки помещается в пять строк:
# hooks/pre_tool.sh
case "$TARGET" in
./10-returns/*|./20-graph/*|./40-runs/*) exit 0 ;;
*) echo "blocked: $TARGET is outside the write list"; exit 1 ;;
esacОдин только on_fail hook меняет экономику loop. Retry, который несёт причину провала прошлой попытки, — это correction. Без этой причины loop платит за ту же ошибку второй раз.
5/ Как выглядит ночь
Если собрать все части вместе, harness ведёт себя как ночная смена, которая следует правилам. В 02:00 срабатывает trigger, и launch query выбирает каждый node, которому нужна работа. Swarm расходится веером: один agent на node.
Returns, не попавшие в schema, отклоняются post_tool до того, как попадут в graph, и каждый rejected node повторяется один раз с приложенной failure reason. Когда агент пытается писать вне своей папки, pre_tool останавливает его, не будя никого.
Merged nodes и typed edges попадают в 20-graph. Drafted email доходит до pre_send и ждёт. post_run добавляет record, и loop останавливается по собственному condition, спокойно укладываясь в 45-minute budget из config.
В 07:30 вы читаете один файл и принимаете два решения. Это вся утренняя стоимость запуска loop engineering и graph engineering таким образом, и в этом весь смысл harness: всё, что могло работать без вас, сработало, а немногое, что требовало вас, ждёт в одном месте.

6/ Swap Test
Самый быстрый аудит любой agent setup: поменяйте строку модели и запустите снова. Всё, что сломалось, было harness, живущим не там.
| Что ломается после swap | Где это пряталось | Где должно жить |
|---|---|---|
| Output format плывёт | «Всегда отвечай JSON» в prompt | Return schema плюс script, который отклоняет всё остальное |
| Runs перестают завершаться сами | «Продолжай, пока не будет thorough» | Stop condition из counts |
| Исправления прошлой недели исчезли | Chat history | CONSTRAINTS.md, загружаемый каждый run |
| Одна и та же company появляется три раза | Judgment модели | aliases.csv, проверяемый перед merge |
| Она пишет туда, куда не должна | Вежливое предложение в prompt | Permission list и pre_tool hook |
Setup, проходящий swap test, portable, а portable — это то, что стоит денег.

Что это стоит и что приносит
Компании вкладывают целые кварталы во внутренние agent platforms. Рабочий harness — это одна папка, один config file и пять коротких scripts, и он работает на подписке Kimi. В этом разрыве и есть opportunity.
| Канал | За что платят | Что нужно сначала |
|---|---|---|
| Harness setup для маленькой команды | One-time fee в four figures за config, hooks и verifier вокруг их workflow | Собственный harness, running on a schedule |
| Release-day retainer | Monthly fee за запуск swap test на каждом major model release и перевод команды на то, что лидирует | Клиент, чьи runs уже log to 40-runs |
| Niche harness template | Папка и yaml, упакованные для одной industry: research, recruiting, compliance | Тот же harness, доказанный в двух разных markets |
Второй канал — тот, который я бы строил первым. Каждый major release перетасовывает leaderboard, один только K3 поднялся на семнадцать мест за одно обновление, и каждой команде с harness нужен человек, чья работа — запускать swap test в день релиза.
Короткая версия
Prompt, context, tool, loop, graph и eval engineering оказываются компонентами одной машины, а harness engineering — это решение, где каждый из них живёт.
Поставьте модель за одну строку, permissions перед tools, а verifier вне агента. Тогда следующий скачок в leaderboard станет изменением config, а не rebuild.

И если это было полезно:
- Сохраните статью в закладки. Links меняются, новые repos появляются еженедельно, и она понадобится как reference.
- Для еженедельных deep dives в AI architecture, quant trading и agent economy следите за мной: @polydao.
- Присоединяйтесь к TG Channel: Buzzoni Notes — там я делюсь raw prompts, custom skills и alpha, которой ещё слишком рано для X.