Ouroboros, очередной инструмент для вашего harness

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/
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.