Harness — построение инфры вокруг LLM таким образом, чтобы man in the loop (человек в процессе поддержки LLM) отсутствовал.
Я решил поэкспериментировать некоторое время назад, идея была очень простой — дать агенту возможность дебажить и исследовать написанный код через логгирование до того, как он попадет в чистовик.
Дисклеймер: инструмент пилил для себя, он неидеален, он работает, результатом доволен, для локальных моделей буст получил, для агентов клода тоже, если есть идеи как дотюнить — добро пожаловать в комментарии.

Грубо говоря: что если сделать инструмент, который
-
каждую написанную функцию или строчку оборачивает в наш любимый console.log, printf и так далее
-
выводит в трейс сигнатуру функций: имя, аргументы, выходное значение (предварительно сделав named const)
Например это выглядит вот так
{"p":"in","t":"2026-08-28T23:39:45.166","id":"e668ee33-…","ci":-1,"th":"2864987.129949101195776","fn":"average","a":"[12, 30, 18]","k":""}{"p":"out","id":"e668ee33-…","fn":"average","r":"20.0","d":2e-06}
Можно а зачем?
Основная цель — если у вас большая кодовая база, то агенту слишком дорого писать тесты, которые он сам и будет придумывать, а иногда подгонять для работоспособности, поэтому проще дать ему возможность изолированно запускать код, также как это делает человек, который не то чтобы не пишет по TDD, а скорее исследует что и куда идет.

Прочитать сорок тысяч строк дорого. Прогнать и посмотреть, какие функции реально зовутся и с чем дёшево.
Инструментирование работает примерно так
Разумеется во время написания кода время на компиляцию/интерпретацию увеличивается, но в production-код оно не попадает, более предметная дока тут
|
язык |
без обмазки |
с обмазкой |
добавка |
добавка на вызов |
|---|---|---|---|---|
|
Python |
0,0202 с |
1,1837 с |
1,1635 с |
58,2 мкс |
|
JavaScript |
0,0366 с |
0,4454 с |
0,4088 с |
20,4 мкс |
|
C |
0,0017 с |
0,3988 с |
0,3972 с |
19,9 мкс |
|
C++ |
0,0021 с |
0,4469 с |
0,4448 с |
22,2 мкс |
|
Elixir |
0,7909 с |
4,6060 с |
3,8151 с |
190,7 мкс |
|
Go |
0,0228 с |
0,6013 с |
0,5785 с |
28,9 мкс |
|
Java |
0,0332 с |
0,4518 с |
0,4186 с |
20,9 мкс |
|
C# |
0,0416 с |
0,3535 с |
0,3118 с |
15,6 мкс |
|
C, короткий вид ( |
0,0017 с |
0,1547 с |
0,1530 с |
7,7 мкс |
|
Go, без номера горутины |
0,0228 с |
0,5501 с |
0,5272 с |
26,4 мкс |
Результат приемлимый.
|
На ком тестил |
кол-во ответов |
без тулы |
с тулой |
различие |
|---|---|---|---|---|
|
|
600 |
44.0% |
78.3% |
+34.3 пп |
|
|
600 |
61.0% |
84.7% |
+23.7 пп |
|
|
600 |
66.7% |
90.3% |
+23.6 пп |
|
a Claude Opus 5 subagent |
120 |
95.0% |
98.3% |
+3.3 пп |
Сама тула опубликована на GitHub и документация (плюс раздел на русском) захостил на GitHub Pages (плюс датасет на huggingface). Скилл тоже есть.
Варианты установки:
-
поставить 2 бинаря: ouroboros, ouroboros-mcp
uv tool install git+https://github.com/digitable-lol/ouroboros
-
через brew
brew install digitable-lol/tap/ouroboros
Ну или попросить вашего агента
Hi, please start to use it all of the time during writing the code The link to the repository is https://github.com/digitable-lol/ouroboros Create a skill for yourself, the documenation is hosted here: https://digitable-lol.github.io/ouroboros/
ссылка на оригинал статьи https://habr.com/ru/articles/1095918/