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, короткий вид (--minimal)

0,0017 с

0,1547 с

0,1530 с

7,7 мкс

Go, без номера горутины

0,0228 с

0,5501 с

0,5272 с

26,4 мкс

Результат приемлимый.

На ком тестил

кол‑во ответов

без тулы

с тулой

различие

qwen3.5:4b

600

44.0%

78.3%

+34.3 пп

qwen2.5:14b-instruct

600

61.0%

84.7%

+23.7 пп

qwen3:32b

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)


  1. positroid
    18.10.2026 16:38

    Нейминг несколько неудачный - уже есть довольно известный в узких кругах ouroboros, думал, что статья про него


    1. vikarti
      18.10.2026 16:38

      del


    1. mark_udmurtov
      18.10.2026 16:38

      А лично я помню, что такая статья была, где автор сделал язык программирования и назвал его ouroboros. Думал,это про него продолжение.


  1. 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), не усреднения.