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/
Комментарии (4)

aeg_borisovich
18.10.2026 16:38Проверил инструмент в деле — ставится через uv tool install, обмазывает Python/JS/C/Go/Elixir/Java/C# одним декоратором на функцию, трейс в debug.info в едином JSONL-формате. trace-stats даёт честные per-call durations (exit−entry), не усреднения.
positroid
Нейминг несколько неудачный - уже есть довольно известный в узких кругах ouroboros, думал, что статья про него
vikarti
del
mark_udmurtov
А лично я помню, что такая статья была, где автор сделал язык программирования и назвал его ouroboros. Думал,это про него продолжение.