by VinvAI (open source) Claude Desktop, Claude Code, OpenCode, macOS, Linux, Python
Запускает, тестирует и находит проблемы в ваших сервисах — без изменений кода.
Официальный MCP-сервер от Microsoft для управления браузером через Playwright. Использует accessibility tree вместо скриншотов — быстрее, …
Официальный MCP-сервер от GitHub: управление репозиториями, issues, pull requests, code search и Actions прямо из AI-агента.
MCP-сервер для Amazon Web Services. Управляет EC2, S3, Lambda, RDS и другими сервисами AWS через LLM. …
Коллекция официальных MCP-серверов от AWS Labs: CDK, Lambda, S3, Cost Explorer, Nova Canvas и другие AWS-сервисы …
code --install-extension VinvAI.VinvAI cursor --install-extension VinvAI.VinvAI pip install vinv uvx --from vinv exerciser campaign <repo> --budget 20 claude mcp add vinv -- npx -y vinv-mcp git clone https://github.com/VinvAI/VinvAI ~/.vinv/engines && cd ~/.vinv/engines && ./install.sh # Windows (PowerShell): git clone https://github.com/VinvAI/VinvAI $HOME\.vinv\engines; cd $HOME\.vinv\engines; .\install.ps1
Vinv (Vibe Inverse) запускает ваши сервисы, находит проблемы и проверяет исправления — без изменений кода.
Он связывает трассировки выполнения с исходным кодом, который их породил, передает эти доказательства вашему агенту, затем снова запускает код, чтобы убедиться, что исправление действительно работает. Он даже использует семплирование Томпсона, чтобы решить, сколько контекста выполнения дать агенту — потому что больше не всегда лучше.
Сначала Python — сервисы и API. Далее TS и Go.
Без аккаунта. Без API-ключей. Без телеметрии. Все работает на вашей машине. Открытый исходный код, Apache-2.0.
Vinv работает тремя способами — как расширение редактора, CLI или MCP-сервер для любого агента. Они используют одни и те же движки.
Один клик — установка с vinv.ai, которая открывает расширение непосредственно в выбранном вами редакторе — или установите прямо из CLI вашего редактора:
| Редактор | Команда |
|---|---|
| VS Code | code --install-extension VinvAI.VinvAI |
| Cursor | cursor --install-extension VinvAI.VinvAI |
| Windsurf | windsurf --install-extension VinvAI.VinvAI |
| VSCodium | codium --install-extension VinvAI.VinvAI |
| Trae | trae --install-extension VinvAI.VinvAI |
| VS Code Insiders | code-insiders --install-extension VinvAI.VinvAI |
Первый запуск собирает движки — около 4 минут: он компилирует индекс Rust и загружает одноразовую локальную модель встраивания ~500 МБ (требуются uv и Rust). Первый трейс появляется примерно через минуту после этого; все последующее — секунды.
pip install vinv # every engine as a console script
# or run one with zero install:
uvx --from vinv exerciser campaign <repo> --budget 20
Предоставьте Claude Code, Cursor или любому MCP-клиенту инструменты Vinv. Установите движки выше, затем зарегистрируйте единый сервер — одна глобальная конфигурация; он автоматически находит ваше открытое рабочее пространство через корни MCP:
claude mcp add vinv -- npx -y vinv-mcp
Другие клиенты: добавьте { "command": "npx", "args": ["-y", "vinv-mcp"] } в mcpServers.vinv в MCP-конфигурации клиента. См. vinv-mcp — 16 инструментов: семантический поиск, мертвый код, локализация ошибок, значения/срезы/покрытие времени выполнения и цикл проверки/оптимизации.
Из исходников — для контрибьюторов или чтобы собрать движки самостоятельно
git clone https://github.com/VinvAI/VinvAI ~/.vinv/engines && cd ~/.vinv/engines && ./install.sh
Windows (PowerShell):
git clone https://github.com/VinvAI/VinvAI $HOME\.vinv\engines; cd $HOME\.vinv\engines; .\install.ps1
Запуск · Тест · Поиск — затем Доказательство. Укажите Vinv на Python-репозиторий; он сделает остальное — без изменений кода, без API-ключей.
Ваш агент — единственная LLM — без новых счетов, без выбора модели, без ключей провайдера. Все работает на вашей машине.
▶ Смотреть 2-минутное демо — от пустого репозитория до проверенного исправления
84% разработчиков сейчас используют или планируют использовать ИИ-инструменты для написания кода. Больше из них активно не доверяют результату (46%), чем доверяют (33%) — и недоверие почти удвоилось за год (Stack Overflow 2025, 49k разработчиков). Вы знаете почему: агент редактирует не тот обработчик, выдумывает формы возвращаемых значений, а затем сам оценивает свою работу, в то время как сервер даже не запускается.
Или он застревает — тест не проходит, агент редактирует ту же функцию, тест снова не проходит, агент снова редактирует, сжигая ваш контекстное окно на «дай-ка я проверю». Собственное исследование Anthropic документирует агентов, «застревающих в циклах, повторяющих один и тот же неудачный подход», когда им не хватает контекста кодовой базы.
Обе неудачи имеют одну корневую причину: агент никогда не видел, как ваш код работает. Он рассуждает на основе статического текста.
Индустрия автоматизировала написание и оставила доказательство полностью ручным. Vinv автоматизирует доказательство — и только затем поиск и исправление.
Сначала результаты — затем как цикл их производит.
Vinv нашёл четыре ошибки и одну проблему производительности в fastapi/full-stack-fastapi-template (~44k★). Те же пять проблем, те же промпты, Vinv оценивает каждый запуск:
| Конфигурация | Исправлено |
|---|---|
| Дешёвая модель + доказательства Vinv | 4 ошибки + 1 оптимизация |
| Фронтирная модель, работающая вслепую | 1 ошибка |
| Дешёвая модель, работающая вслепую | ничего |
По одному испытанию на условие — демонстрация, а не бенчмарк. Вслепую дешёвая модель получила ноль. Дайте ей кадр сбоя, цепочку вызовов и реальные значения аргументов — и она побьёт более сильную модель, угадывающую по статическому коду. Доказательства — вот что имело значение, а не веса.
На том же чистом шаблоне цикл оптимизации позже обнаружил — только по живым трассам — что пул соединений базы данных по умолчанию заставляет запросы стоять в очереди за проверкой соединений при параллельной нагрузке, отправил исправление размера пула и доказал его: медиана при постоянной нагрузке 75.6 мс → 41.2 мс, на 45.4% быстрее (95% ДИ [36.3%, 45.8%]), ответы байт-в-байт идентичны. Две предыдущие попытки, чьи окна измерений не могли подтвердить выигрыш, были автоматически откачены — принятие произошло только тогда, когда появились доказательства.

Направленный на huggingface/smolagents (~28.5k★) — публичный Apache-2.0 агентный фреймворк, без аффилиации — цикл аллокации нашёл и доказал быстрый путь в sanitize_for_rich. Протестировано с tracemalloc на реалистичной строке журнала размером 4 КБ: временное выделение на вызов 36.27 КБ → 0.00 КБ (~37,137× меньше); сквозное на log_task, ~615.7 КБ → ~125 Б за 3 вызова; вывод байт-в-байт идентичен для 2,015 входных данных. Апстрим как PR #2572.
huggingface/smolagents#2572 · протестированное улучшение выделения памяти · воспроизводимое доказательство в PR
Вот как это происходит: оракулы находят отходы, ваш агент предлагает правку, парный бутстрап + побайтово идентичный повторный прогон решают принять или откатить, и только потом что-то уходит вверх по потоку. Остальная часть этого README — механизмы, стоящие за этими квитанциями.
Этап Тест выше — это не один тестер, а набор оракулов, каждый из которых охотится за своим классом дефектов, и все они пишут в одни и те же находки и один и тот же путь отправки исправлений. Вам никогда не нужно думать о них, чтобы использовать Vinv; откройте это, если хотите полный список и как расходуется бюджет.
Полный список оракулов, диспетчер бюджета и песочница
| Оракул | Что он находит | Виды находок |
|---|---|---|
| HTTP-упражнёр | Сам управляет каждым обнаруженным конечным точкой — схемно-валидные, граничные, негативные, значения, извлечённые из реальных трасс, многошаговые сценарии аутентификации | server-error · crash · invariant-violation |
| Дифференциальный оракул | Сравнивает обработчик сервиса или оценщик с эталонной реализацией. Для оценщика или парсера эталоном является сам CPython — разногласие и есть отчёт об ошибке | differential-mismatch |
| Инъекция отказов | Противоборствующие, но допустимые формы на границе зависимостей (None, "", одинокий суррогат, переупорядоченный список), плюс проход по каждой точке разделения чанков в потоке |
fault-crash · fault-divergence |
| Оракул параллелизма | Детерминированные перемежения и инъекция таймаутов — общее состояние, которое портится при параллельных вызовах, и порядки блокировок, которые приводят к взаимоблокировке | concurrency-divergence · concurrency-hang |
| Оракул окружения | Матрица разрешения зависимостей и вышестоящие символы, чья сигнатура изменилась под вами | signature-drift (сообщается, никогда не отправляется — никакая правка здесь это не исправит) |
| Золотые базовые линии ввода/вывода | «Более быстрое» изменение, которое незаметно удалило поле ответа или изменило класс статуса | baseline-degraded |
| Мёртвый код | Неотслеживаемые острова — связанные секции, которые ничего не выполняли ни в одном записанном запуске, — с активными вызывающими, которые всё ещё ссылаются на них | мёртвые секции |
| Анализ времени выполнения | Горячие точки задержки из живых спанов, подозреваемые в утечках памяти (наклон Тейла–Сена), дублирующиеся пересчёты, которые стоит кэшировать, потолок пропускной способности (подгонка USL) | hotspots · leaks · cache candidates · throughput-ceiling |
Диспетчер реален, и это бандит. exerciser campaign выделяет один бюджет на каждого вооружённого оракула через выборку Томпсона по (target × technique × oracle) — а не гоняет каждого исчерпывающе. Стоимость измеряется (настенное время, нормализованное до эквивалентов проб плюс порождённые подпроцессы), так что оракул, которому нужно сорок секунд, чтобы найти то, что другой находит за одну, проигрывает. Кредит выплачивается один раз на сигнал дефекта, в рамках одного запуска и между запусками, поэтому детерминированный оракул не может вечно зарабатывать кредит за одну и ту же ошибку. Апостериорные распределения сохраняются в campaign.json — какая техника окупается в вашем репозитории — это выучено.
Кампания запускает шесть оракулов (default_runners): crash/function, differential, fault, concurrency, HTTP и environment — каждый вооружается только тогда, когда он применим к вашему репозиторию (нет --base-url — и HTTP-оракул остаётся тёмным; нет границ — и fault-оракул тоже). Семейства мёртвого кода и анализа времени выполнения (утечки, горячие точки, кандидаты на кэш) и золотые базовые линии ввода/вывода из таблицы ниже запускаются из редактора и пути регрессии, а не из этого бюджетного цикла.
Непроверенный код выполняется за лестницей изоляции: песочница ОС, обеспечиваемая ядром (sandbox-exec / bwrap / unshare), если хост её предоставляет, в противном случае — процессный шим — всегда с одноразовой копией репозитория, перенаправленными HOME/TMPDIR, заблокированными сетью и порождением подпроцессов. Уровень определяется пробой, которая проверяет, что запись за пределами корня действительно не удалась, а не наличием бинарника в PATH. Postgres, Redis и S3 подменяются внутри тюрьмы, чтобы код, которому они нужны, работал, а не падал при подключении.
Статические инструменты (Vulture, deadcode, Knip, ts-prune) могут доказать только «ничто статически не ссылается на это». Они не видят динамическую диспетчеризацию, флаги функций, реестры или дрейф окружения — поэтому они выдают кандидатов, которых человек должен оценивать, из-за чего очистка никогда не происходит.
Vinv может сказать то, что они не могут:
«Ни один захват никогда не выполнял это. Вот что всё ещё ссылается на это, вот прослеженное окружение, в которое оно бы встроилось, и вот что ваш агент думает об этом.»
Единицей является секция — связный остров непрослеженных символов — а не строка линтера, потому что мёртвый код почти никогда не является одной функцией. Каждая секция получает:
ДОСТИГНУТО ИЗ ЖИВОГО КОДА (исполняющийся код ссылается на него; путь никогда не выполнялся — обычно это защита или невыпущенная функция) против НЕТ ССЫЛОК вообще. Противоположные вердикты, и отфильтрованное полотно не может сказать вам, какой из них.интегрировать · переосмыслить · удалить · сохранить · неясно, каждый с описанием того, что он делает, почему ничто не достигает его, и что сломается, если его удалить. Секции отправляются по пять на промпт, чтобы агент мог сказать «это более старая копия секции ниже» — суждение, которое структурно недостижимо при запуске по одной секции.Две вещи, которые он отказывается делать: называть что-либо мёртвым без следа на диске (при нулевом количестве захватов каждый символ непрослежен, так что список был бы вашей кодовой базой), и молча отбрасывать что-либо — оба ограничения записываются в историю, так что «12 секций» можно отличить от «12 — это предел, и 300 были отброшены».
И причина второго порядка, по которой это важно: мёртвый код делает вашего агента кодирования хуже. Каждый неиспользуемый модуль конкурирует за окно контекста, сжигает токены и предлагает неправильные шаблоны для копирования.
Статические сканеры угадывают. Vinv записывает реальный запуск и ранжирует, что не удалось, что никогда не выполнялось, а что было медленным. Никаких «возможных проблем» — каждая находка называет символ, строку и трассировку за ней.
# with a service up — Auto-Pilot's path: plan every endpoint, then drive them
exerciser plan <repo> --base-url http://127.0.0.1:PORT && exerciser run <repo> --base-url http://127.0.0.1:PORT
# allocate budget across armed oracles (HTTP + the rest that apply to that run)
exerciser campaign <repo> --budget 20
Находки становятся пакетами доказательств и отправляются вашему собственному агенту — Claude Code, Codex, Cursor, Gemini CLI, Copilot Chat, Windsurf Cascade. Ваш агент — единственная LLM Vinv. Никаких новых счетов, никакого выбора модели, никаких ключей провайдера.
Пакет составляется из контекстного графа: ваш код, ваши трассировки и метрики, полученные из них, объединённые по точной функции, которая обработала каждый запрос. Артефакты — это товары; объединение — нет.
Воспроизведённый старт. Живой порт. Приёмочные тесты, созданные до исправления, хранящиеся вне рабочей области под непрозрачным токеном и обязанные детерминированно провалиться дважды на коде до исправления — дисциплина «fail-to-pass» из SWE-bench. Тест, который проходит на сломанном коде, отбрасывается.
Вокруг этого: статический предварительный шлюз (каждый изменённый .py должен пройти ast.parse до того, как будет потрачен бюджет тестирования), детерминированная античит-проверка диффа по снапшоту и неотслеживаемым файлам (правки тестов, проглатывание except, теневые модули интерпретатора, вмешательство в .vinv — жёсткие флаги полностью блокируют возможность), ограниченный LLM-судья, который может способствовать более тщательной проверке, но никогда не может спасти проваленный шлюз, и рекомендательный мутационный дым, выжившие которого никогда не раскрываются исправляющему агенту — защита от Гудхарта.
Один клик откатывает всё, к чему прикоснулся эпизод, включая неотслеживаемые файлы.
Два реестра, оба локальные, ни один не загружается.
Состав контекст-пакета — это факторная сетка рук 2² (глубина среза графа × включение данных времени выполнения). Выбор — это семплирование Томпсона со смесью с ε-полом, и точная склонность смеси регистрируется с каждым решением — требование для несмещённых IPS/SNIPS/DR позже. ε-пол затухает, но никогда не достигает нуля, поэтому веса важности остаются ограниченными. Апостериорные вероятности учитывают только объективные эпизоды — прерывание пользователем или клик «подтвердить как выполненное» не являются свидетельством о качестве руки. Атрибуция — это контрфактический анализ в стиле COMA для каждого признака по сетке апостериорных средних: «помогли ли данные времени выполнения» — это вычисленное число, а не утверждение.
Retrieval serving — это отдельный ε-жадный бандит (над top-k множеством действий) с собственным реестром. Кандидатная конфигурация может быть продвинута только при выполнении всех условий: ESS ≥ 25, n ≥ 40 объединённых выборок, ≥ 8 зарегистрированных pull'ов на каждое сравниваемое действие, BCa-бутстрап 95% нижняя граница дважды-устойчивой дельты ≥ 0, нулевые обрезанные веса, и отсутствие эпохи, противоречащей объединённой дельте (защита от артефакта Симпсона). Продвинутая политика затем обслуживается только на 5% канарейке, и три последовательных отрицательных канареечных вознаграждения автоматически откатывают её.
Измерено на собственном реестре этого репозитория (800 зарегистрированных решений, 770 объединённых, 12 индексных эпох — docs/learning.md):
| кандидат | DR дельта | 95% BCa CI | ESS | продвинут |
|---|---|---|---|---|
| top-k 10 | +0.173 | [+0.081, +0.317] | 577 | да |
| top-k 3 | +0.081 | [−0.057, +0.226] | 68 | нет — LCB < 0, защита эпох не пройдена |
| top-k 20 | +0.148 | [+0.062, +0.283] | 0 | нет — нулевая поддержка, никогда не логировался |
Ворота пропустили ровно измеренного победителя и заблокировали как неопределённого, так и неподдержанного кандидата. Именно это здесь означает «замкнутый цикл» — а части, которые не являются онлайн-обучением (пороги рефери, каталог оракулов, формы отказов), являются фиксированной политикой, намеренно.
| Симптом | Какой оракул отвечает |
|---|---|
| «claude code говорит готово, но тесты падают» | рефери: воспроизведённый старт, живой порт, приёмочные тесты, которые агент никогда не видит |
| «cursor agent застрял в цикле» | защита от цикла гибели — самоподобие набора токенов ловит повторяющегося агента и заставляет применить другой подход |
| «как найти мёртвый код в python по реальному использованию» | секции мёртвого кода: никогда не выполнялся ни в одном захвате, с живыми вызывающими и вердиктом агента |
| «как тестировать fastapi эндпоинты автоматически» | HTTP-упражнитель — схемные/граничные/негативные/аутентификационные входы, каждый ответ сохраняется как регрессионный случай |
| «python deadlock только под нагрузкой» | оракул конкурентности — детерминированные расписания и инъекция таймаутов |
| «мой парсер принимает вход, который CPython отклоняет» | дифференциальный оракул — разногласие с эталоном и есть баг-репорт |
| «ИИ сломал работающий код» | побайтовое воспроизведение поведения гейтит каждое изменение; откат в один клик всего, что затронул эпизод |
| «найди утечку памяти в python без профайлера» | наклон Тейла–Сена по удержанию на сессию — называет функции, удерживающие память, на основе реальных запусков |
| «почему мой api медленный» | пламенные графики на каждый вызов из живого трафика, горячие точки Парето и подгонка USL, которая называет предел пропускной способности |
| «моя зависимость изменилась, и никто не сказал» | оракул окружения — матрица разрешения плюс дрейф сигнатур вышестоящих зависимостей |
Дайте вашему кодирующему агенту контекст выполнения — один цикл, эти возможности:
def и номерами строк, встроенные локальной моделью (без облачных ключей).







findings.json, который ваш агент может потреблять напрямую.
Честная область применения: Python в первую очередь — сервисы и API. Auto-Pilot обнаруживает запускаемые сервисы, поднимает их под tracelens и тестирует их HTTP (и связанные) точки входа. Для других языков доступны индекс, граф и обоснованные ответы на вопросы, но пока нет доказательств на основе рантайма. TypeScript и Go — следующие.
Vinv связывает каждый след рантайма с точным сегментом кода, который его породил, и передаёт вашему агенту контекстный граф, построенный на этом соединении, — поэтому агент аргументирует на основе доказательств, а не ощущений. И когда агент заявляет о победе, Vinv не верит ему на слово:
nonlocal, соблюдает документированное ограничение, а не падает.differential-mismatch, fault-divergence, concurrency-divergence, invariant-violation и baseline-degraded утверждение «эти вызовы больше не вызывают исключений» было бы пустым, поскольку цель никогда не вызывала исключений. Критерий — это значение.Трафик показывает только те пути кода, которые пользователи случайно затрагивают. Тренажер поведения прорабатывает остальное — тот же fastapi/full-stack-fastapi-template, один запуск:
| Метрика | Только трафик | С прогоном |
|---|---|---|
| Выполнено конечных точек | 0 / 23 | 23 / 23 |
| Конечные точки с покрытием символов | — | 6 → 16 / 23 (авторизованный прогон) |
| Покрыто символов | — | 18 → 37 / 44 |
| Сохранено регрессионных тестов | 0 | 125 (воспроизводимы всегда) |
Авторизованный прогон (каждая конечная точка повторно вызывается с учетными данными, захваченными сценарием входа, а свежесозданные идентификаторы ресурсов передаются в конечные точки по идентификатору) выявил четыре реальные ошибки, которые анонимный трафик никогда не может достичь:
GET /api/v1/users/ → HTTP 500 — недопустимый email, сохраненный непроверенной частной конечной точкой, отравляет сериализацию ответа.POST /api/v1/private/users/ → IntegrityError выходит как 500 — email: str вместо EmailStr, нет защиты от дубликатов.POST /api/v1/utils/test-email/ → HTTP 500 — assert settings.emails_enabled вызывает сбой вместо деградации.POST /api/v1/password-recovery-html-content/{email} → соединение убито — несанитизированный рендеринг заголовка.Затем тестовый стенд исправил все четыре, и набор регрессионных тестов теперь отличает регрессию вашего кода от изменения мира из-за остаточных данных самого тестового движка (реестр состояний) — так что повторный запуск не поднимает ложную тревогу. Фантомные регрессии производительности тоже исчезли: разница в задержке должна пережить медиану из 5 повторных запусков, прежде чем будет сообщена.
Одна конечная точка после запуска: дерево вызовов с реальным временем выполнения, граф пламени задержки и каждый вход, который Vinv использовал, с полученным выходом.
Vinv — это MCP-сервер для Claude Code и Cursor — и для любого другого MCP-клиента, который вы уже используете. Одна команда (Зарегистрировать Vinv MCP в инструментах агента) записывает серверы в каждого агента, которого он обнаруживает:
| Агент | Отправка исправлений | MCP-инструменты |
|---|---|---|
| Claude Code | ✅ | ✅ авто |
| Cursor (CLI + чат) | ✅ | ✅ авто |
| Codex CLI | ✅ | ✅ авто |
| Gemini CLI | ✅ | ✅ вручную |
| Copilot Chat (VS Code) | ✅ | ✅ авто |
| Windsurf Cascade | ✅ | ✅ авто |
Где сохраняется конфигурация для каждого клиента — и как проверить
Регистрация идемпотентна и никогда не фиксирует секреты. Серверы (vinv-index, vinv-runtime, vinv-exercise) запускаются через stdio с использованием собственной среды выполнения редактора.
~/.claude.json, область действия проекта (без запроса доверия). Проверка: claude mcp list показывает серверы Vinv.<repo>/.cursor/mcp.json. Проверка: Настройки → MCP показывает их зеленым.~/.codex/config.toml в разделах [mcp_servers.vinv-index] / [mcp_servers.vinv-runtime]..vscode/mcp.json в старых сборках.~/.codeium/windsurf/mcp_config.json.~/.gemini/settings.json.Ваш агент также является единственной LLM для Vinv — каждый шаг анализа проходит через CLI кодирующего агента, за который вы уже платите. Никаких ключей провайдера, никакого выбора модели.
| Агент в одиночку | Агент + Vinv | |
|---|---|---|
| Поиск кода | ищет через grep и угадывает файлы | ранжированные символы с номерами строк, по смыслу |
| «Готово» | заявляет, что готово, оценивает свою собственную работу | повторный запуск, живой порт, невидимые приемочные тесты |
| Память | забывает каждую сессию | постоянный индекс + граф, обновляется при сохранении |
| Выполнение | не может видеть | реальные трассы, значения, графы пламени для каждого вызова |
| Отладка | читает исходники, строит догадки | подозреваемые, ранжированные по ошибкам, с реальными сообщениями об ошибках |
| Мертвый код | не может отличить используемое от неиспользуемого | никогда не выполняемые островки с живыми вызывающими и вердиктом «оставить или вырезать» |
| Плохое исправление | вы делаете diff и молитесь | откат в один клик всего, что затронул эпизод |
| Тестирование API | пишет тесты, которые затем сам оценивает | прогоняет каждую конечную точку сервиса, сохраняет каждый ответ как невидимый регрессионный тест |
| Заявления о производительности | «должно быть быстрее» | парный бутстрэп 95% ДИ должен исключать ноль, поведение побайтово идентично, или автозамена |
| Тестовые данные | загрязняет вашу БД разработки и забывает | реестр состояний: созданные ресурсы отслеживаются, удаляются через ваш собственный API, расхождения помечаются |
| Стоимость | сжигает токены на повторное исследование | пакет доказательств собирается один раз, локально; бандит узнает, какая композиция пакета окупается |
| ## Проверено на себе |
Ворота релиза Vinv — это сам Vinv: эти цифры получены при выполнении цикла на этом репозитории:
| Метрика | Результат |
|---|---|
| Индекс | 4 036 символов |
| Поиск | попадание по файлу@10 0.90 · MRR по символам 0.51 · p50 81 мс |
| Восстановление после сбоя | индексатор, эмбеддер и трассируемый сервис — все протестированы на убийство в середине работы |
| Самообнаруженные потери | найдено 83% дублирующихся вычислений → теперь кэшируются |
| Настройка поиска | оценка вне политики (двойно-устойчивая, BCa-бутстрэп) по 800 зарегистрированным решениям продвинула top-k 10 (+0,173, 95% ДИ [+0,081, +0,317]) и заблокировала оба других кандидата — один из-за неопределённой нижней границы, другой из-за нулевой поддержки |
| Тестовый набор | 2 376 тестов — 1 575 Python · 801 расширение |
Одна команда запускает всё. Vinv управляет остальными восемью стадиями — каждая стрелка — это доказательство, а не догадка.
flowchart LR
T[Trace] --> I[Index] --> S[Serve MCP] --> V[Verify] --> L[Learn] --> T
🧠 Алгоритмы, названные по именам (для скептиков)
Никаких чёрных ящиков — каждое решение Vinv имеет опубликованный метод, и каждый из них существует, чтобы цикл оставался честным, а не хитрым:
| Решение | Алгоритм | Почему |
|---|---|---|
| На какой оракул потратить следующую единицу бюджета | Семплирование Томпсона по (цель × техника × оракул), стоимость измеряется в эквивалентах проб, кредит платится один раз на сигнатуру дефекта |
какая техника окупается — свойство вашего репозитория, изучаемое между запусками, а не фиксированный порядок выполнения |
| Какую стратегию ввода попробовать следующей для каждой конечной точки | Семплирование Томпсона по бета-апостериорным; награда = нарушения оракула, новое покрытие стоит бонус 0,25, чтобы исследование оставалось подчинённым поиску; апостериорные сохраняются с распадом свидетельств 50% | исследует граничные/негативные/аутентификационные вводы там, где они окупаются — цикл нельзя захватить дешёвой беговой дорожкой покрытия, а старые уроки истекают, а не окостеневают |
| Какому живому коду принадлежит мёртвый участок | Персонализированный PageRank, посеянный на символах участка, с учётом трассированных соседей (шаг извлечения HippoRAG по графу кода) | одношаговая схожесть упускает ассоциативное окружение, которое интеграция бы подключила |
| Принять или откатить оптимизацию | Парный бутстрэп 95% ДИ на относительное улучшение и побайтово идентичное воспроизведение поведения | «быстрее» должно быть статистически реальным и наблюдаемо безвредным |
| Потолок пропускной способности | Универсальный закон масштабируемости (Гюнтер) по ограниченному прогону с изменением конкурентности — контенция σ и когерентность κ | называет почему перестаёт масштабироваться, а не только то, что перестало |
| Поведенческие инварианты | динамические инварианты в стиле Дайкона, поддержка ≥ 5, ноль контрпримеров, Лаплас (s+1)/(n+2) уверенность |
свойства зарабатывают свою уверенность на доказательствах, а не на утверждениях |
| Подозреваемые в утечке памяти | наклон Теила–Сена по удержанию на сессию (устойчиво к 29% выбросов) | один шумный сеанс не может сфабриковать или скрыть утечку |
| Возможности кэширования | различимость хэша аргументов × доля времени, относительно Парето — без абсолютных порогов | «дорого» определяется трассой вашего приложения: сервис на 5 мс или пакетная задача на 5 с |
| Обнаружение зависшего харнесса | адаптивный сторож тишины — тайм-аут, относительный к ритму, с льготным периодом запуска | медленный запуск не убивается; мёртвый не крутится |
| Прерывание тупика | единогласие по Нэшу: продолжать, только если позиции исследователя и аудитора оба превосходят эскалацию | автономия ровно тогда, когда она оправдана; человеческая панель — когда нет |
| Составление контекстного пакета | Семплирование Томпсона с ε-полом по сетке рук 2², точная склонность логируется, контрфактическая атрибуция в стиле COMA |
«помогли ли свидетельства времени выполнения» вычисляется, а не утверждается |
| Продвижение конфигурации поиска | Оценка вне политики (кросс-подогнанные DM/IPS/SNIPS/DR) за защитами ESS, поддержки, BCa-LCB и Симпсона; 5% канарейка, автооткат | обучающийся не может оценивать и свою домашнюю работу |
| Локализация ошибок | ранжирование подозреваемых на основе спектра по реальным запросам «прошло/не прошло» | подозреваемые приходят из выполнений, а не из эмбеддингов |
Полное обучающее прохождение — награда, склонность, математика гейтинга, с file:line для каждого утверждения — находится в docs/learning.md. Тестовая онтология — в docs/testing-ontology.md. |
Глубже: контекстный граф, Auto-Pilot и структура репозитория
Vinv индексирует код и генерирует — на основе вашего собственного запуска — трассы и метрики, полученные из них, затем связывает все три с точной функцией, обработавшей каждый запрос. Артефакты — это товары; связывание — нет. Auto-Pilot ведет весь цикл без посторонней помощи: обнаружение сервисов → настройка через вашего агента → запуск под трассировкой → выполнение упражнений → исправление → повторная проверка, пока не станет зеленым или не закончится бюджет. Структура: extension/ (редакторный UI + MCP-серверы), index/ (семантический индекс на Rust), embedder/ (локальный сайдкар CodeRankEmbed), tracelens/ (трассировщик без правок), exerciser/ (рой оракулов + бандит кампаний), identification/ (связывание трасс с исходниками), handbook/ · bringup/ · goal/ (обнаружение и эпизоды), tests/e2e/ (золотой тест с внедрёнными ошибками). Python-движки — это одно рабочее пространство uv.
exerciser campaign <repo> --budget 20. Никакого сервиса, никакого --base-url: работают функциональный, дифференциальный, оракулы ошибок, конкурентности и окружения, а бандит сообщает, какая техника окупилась.exerciser plan <repo> && exerciser run <repo> --base-url http://127.0.0.1:PORT (или позвольте фазе exercise в Auto-Pilot сделать это). Канарейка окружения сначала прогоняет ваши цепочки входа в систему и громко сообщает, если база данных была сброшена или учётные данные не засеяны — больше никаких молчаливых запусков с ошибкой 401.Next/→ по каждой конечной точке: дерево вызовов с реальным временем выполнения, флеймграф и точные входы → выходы. Наведите курсор на что-то непонятное — каждый маркер объясняет себя сам..vinv/reports/findings.json содержит те же данные в машиночитаемом формате — укажите на него вашему агенту.exerciser regress <repo> --base-url … воспроизводит все сохранённые случаи (самостоятельно перехватывая свежие учётные данные) и сообщает о различиях поведение / контракт / производительность / окружение отдельно, так что дрейф окружения никогда не маскируется под регрессию кода.pip install vinv поставляет каждый движок как консольный скрипт — или используйте любой из них отдельно:
| Движок | Команда | Что делает |
|---|---|---|
| exerciser | exerciser campaign <repo> --budget N |
Начните здесь. Управляемый покрытием API-экзерсизер + рой оракулов — генерирует валидные/граничные/негативные/аутентифицированные/ошибочные/конкурентные запросы, сохраняет постоянный регрессионный набор и сообщает, какая техника окупилась. |
| tracelens | tracelens run -- <cmd> |
Трассировщик времени выполнения без правок — тайминги, аргументы, возвращаемые значения и деревья вызовов из реального запуска. |
| index | index query <repo> · index deadcode <repo> |
Семантический индекс кода на Rust — поиск кода по смыслу, плюс отчёт о мёртвом коде только по исходникам. |
| identification | identification consolidate <repo> |
Связывает трассы с исходниками — строит карту API-поверхности и графа вызовов, привязывая данные времени выполнения к точной функции. |
| bringup | bringup list/start <repo> |
Поднимает сервисы под трассировкой — перечисляет каждый сервис, затем запускает один инструментированный. |
| handbook | handbook generate <repo> |
Формирует задачу по обнаружению кодовой базы, которую выполняет ваш агент для картирования репозитория. Только промпты — без собственных вызовов LLM. |
| goal | goal create <context> |
Сжимает рабочий контекст в одну постоянную цель для эпизодов исправления/оптимизации. Только промпты. |
| embedder | vinv-embedder serve |
Локальный сайдкар эмбеддингов (CodeRankEmbed) для семантического поиска — без облачных ключей. |
| contracts | (библиотека) | lens_contracts — общий контракт данных, который читает и пишет каждый движок. |
| ## Справочник по CLI движка |
exerciser — рой оракулов, запускаемый отдельно
| Команда | Что делает |
|---|---|
exerciser campaign <repo> [--base-url URL] [--budget N] |
Начните здесь. Один бюджет на всех вооружённых оракулов с помощью выборки Томпсона; сообщает, какая техника окупилась |
exerciser plan <repo> [--base-url URL] |
План входных данных для каждой конечной точки (схема + наблюдаемые + семантические слои) |
exerciser run <repo> --base-url URL |
Выполняет план против живого трассируемого сервиса, управляемый покрытием |
exerciser functions <repo> [--require-tier os-sandbox] |
Запускает точки входа и экспортированные функции в процессе, изолированно |
exerciser differential <repo> [--target M:f --reference cpython-exec] |
Сравнивает функцию с эталонной реализацией |
exerciser faults <repo> [--auto-target M:f] |
Легальные, но враждебные формы на границе зависимостей |
exerciser concurrency <repo> --target M:f |
Детерминированные расписания + внедрение тайм-аутов |
exerciser environment <repo> |
Матрица разрешения зависимостей + дрейф сигнатур вышестоящих модулей |
exerciser containment |
Какой уровень изоляции этот хост может реально предоставить и почему — определяется пробой |
exerciser throughput-sweep <repo> --base-url URL |
Сканирование конкурентности + подгонка USL → возможности throughput-ceiling |
exerciser profile <repo> |
Поведенческий профиль + изученные инварианты |
exerciser regress <repo> --base-url URL |
Воспроизводит накопленный набор поведений, сообщает различия по типу |
exerciser scorecard <repo> |
Оценка по каждому сервису: покрытие до→после, инварианты, проблемы, задержка |
Требуется сначала identification consolidate для apis.json, а для реального покрытия — сервис, работающий под tracelens.
Немного названий инструментов намеренно — агенты лучше выбирают из коротких меню; инструмент сеанса мультиплексирует
vinv-index — код ваших сервисов и сеанс:
| Инструмент | Возвращает |
|---|---|
vinv_query |
Ранжированные символы с путями + идентификатор решения — любой поиск по смыслу, перед grep |
vinv_feedback |
подтверждение — вознаграждение −1..1 после действий по результатам; обучает поиск |
vinv_session |
10 действий в одном инструменте — чтение: траектория · статус · проблемы · горячие точки · тренды памяти · кандидаты в кэш; действие: fix (отправить эпизод с посевом улик) · run_sweep · set_goal · set_budget — ваш агент может управлять всем циклом проверки/оптимизации из чата |
vinv-runtime — захваченные запуски (только чтение, с отметкой происхождения):
| Инструмент | Возвращает |
|---|---|
rank_suspects |
Ранжированные по ошибкам символы по запросам pass/fail, прикреплены реальные ошибки — сначала при любом сбое |
values_of |
Наблюдаемые типы аргументов/возвратов, частота null, диапазоны |
slice |
Наблюдаемая цепочка вызовов от корня запроса, значения на каждом кадре |
coverage_of |
Что выполнялось, как часто, ok/error, время |
callers_of / blast_radius / why_did_this_run |
Наблюдаемые вызывающие · транзитивное влияние · пути точек входа |
vinv-exercise — замыкает цикл тестирования конечных точек: ваш агент запускает ваш сервис и сообщает о выполнении, а Vinv оценивает полученное.
Нужны ли мне собственные ключи API?
Нет. Vinv запускает всё локально. Семантический индекс и эмбеддер кода работают на вашей машине без каких-либо ключей провайдера. Ваш CLI-агент (например, Claude Code или Cursor) обрабатывает собственное общение с LLM, используя уже настроенную вами аутентификацию.
Есть ли телеметрия или сбор данных?
Никакой телеметрии, никакой аналитики, никаких пингов об использовании, никаких отчетов о сбоях. Vinv хранит состояние для каждого репозитория в .vinv/ и состояние для каждой машины в ~/.vinv/, а конфиденциальные данные в трассах редактируются и никогда никуда не отправляются. Расширение делает ровно один исходящий запрос: GET статического файла на notices.vinv.ai при активации, чтобы релиз, который ломает вашу установку, мог сообщить вам об этом. Ни строки запроса, ни идентификаторов, ни версии, ничего не загружается — вся фильтрация происходит на вашей машине, не чаще одного раза в 12 часов. Отключите это с помощью vinv.notices.enabled.
Что Auto-Pilot запускает сегодня?
Сервисы и API. Auto-Pilot обнаруживает запускаемые Python-сервисы, поднимает их под tracelens и управляет их HTTP- (и связанными) точками входа. Обычное управление библиотеками / функциями внутри процесса сейчас не входит в область Auto-Pilot — продуктовый путь — это сервисы, которые вы можете запускать и вызывать.
Изолирован ли непроверенный код упражнений в песочнице?
Да. Цели, которые защита чистоты не может проверить, направляются через лестницу изоляции: песочница ОС на уровне ядра (sandbox-exec, bwrap, unshare), если хост её предоставляет, в противном случае — обёртка процесса Python — всегда с одноразовой копией репозитория, перенаправленными HOME/TMPDIR/XDG_*, заблокированной сетью и порождением подпроцессов, а также POSIX-ограничениями rlimits. Какой уровень вам достался, определяется пробой, которая проверяет, что запись за пределы корня действительно не удалась, и об этом сообщается честно. --no-sandbox оставляет этот набор отказанным и неуправляемым; он никогда не запускает их свободно. exerciser containment сообщает, что может предоставить ваш хост.
Почему первый запуск медленный? (Время сборки)
Первый запуск занимает около 4 минут, потому что Vinv необходимо скомпилировать индекс Rust и загрузить локальную модель эмбеддингов (~500 МБ). Последующие запуски и трассировки будут начинаться за секунды.
Изменяет ли Vinv мой код?
Нет. Vinv использует трассировщик с нулевым редактированием. Он инструментирует ваш Python-бэкенд во время выполнения без необходимости интеграции SDK, декораторов или изменений в вашем исходном коде.
Какие языки поддерживаются?
Сейчас доказательства времени выполнения — трассировка, рой оракулов, проверенные исправления — доступны для Python, для сервисов и API. Другие стеки по-прежнему получают семантический индекс, граф кода и обоснованные ответы на вопросы. TypeScript и Go — следующие.
Как он узнает, что исправление сработало?
Приёмочные тесты создаются до исправления, хранятся вне вашего рабочего пространства под непрозрачным токеном и должны детерминированно падать дважды на сломанном коде — тест, который проходит до исправления, отбрасывается. Затем исправление должно пройти их с повторным запуском, живым портом и каждым другим наблюдаемым поведением, байт-в-байт идентичным. Детерминированный аудит против читерства по диффу блокирует правки тестов, проглоченные исключения и теневые модули.
Какие редакторы и агенты кодирования работают?
Редакторы: VS Code, Cursor, Windsurf, VSCodium, Trae, VS Code Insiders. Агенты, которыми он управляет: Claude Code, Cursor CLI, Codex CLI, Gemini CLI, Copilot Chat, Windsurf Cascade. См. Работает с вашим агентом.
Действительно ли это бесплатно и с открытым исходным кодом?
Да — Apache 2.0, каждый движок собирается из исходников в этом репозитории.
.vinv/ (автоматически в .gitignore), для каждой машины в ~/.vinv/. Никакой учётной записи, никаких ключей API, никакой телеметрии — вообще.notices.vinv.ai при активации, только для уведомлений о сломанных релизах и проблемах безопасности. Никакой строки запроса, никаких идентификаторов, никакой версии, ничего не загружается; максимум один раз за 12 часов; URL — константа, которую нельзя перенаправить; отключается через vinv.notices.enabled.password, token, api_key, …) редактируются и никогда не захватываются.См. CONTRIBUTING.md — uv sync, cargo build в index/, npm install && npm run check в extension/, держите tests/e2e/planted_bug_golden/run.py зелёным. Хорошие первые задачи помечены. Участвуя, вы соглашаетесь с нашим Кодексом поведения; чтобы сообщить об уязвимости, см. SECURITY.md. Лицензия Apache 2.0 © 2026 VinvAI.
Ваш агент говорит, что готово. Vinv говорит: докажи. Если Vinv заметил то, что пропустил ваш агент — оставьте отзыв на Open VSX и ⭐ поставьте звезду этому репозиторию.
vinv.ai · Open VSX · LinkedIn · support@vinv.ai · Python в приоритете, затем TS и Go · Контекст важнее размера модели.