VibeVM

org.vibevm.ai-native · rust · typescript · go

Код, который по-настоящему понятен AI-агентам.

Каждая строка кода имеет смысл — и этот смысл можно отследить машиной. AI-Native Code Discipline — набор правил и работающих гейтов для Rust, TypeScript и Go: код пишется так, как агентам будет удобно, надёжно и дёшево его сопровождать, а не так, как людям привычно его читать. Сам код остаётся обычным идиоматичным кодом под обычным компилятором; добавленная строгость живёт вокруг — в машинно-проверяемой форме: ячейки (cells) и швы (seams), трассируемость «спецификация ↔ код», показания об отклонениях (deviation), детерминированная проверка соответствия. Дисциплина построена для кодовой базы, чей следующий сопровождающий — нередко более слабая модель, чем автор.

ЭссеБольшой Вижен →Мировоззрение за этой дисциплиной: два источника намерения, дорогой вероятностный слой над дешёвым детерминированным — и трассируемые рёбра между ними.

Проблема

Сборка зелёная, изменение нечитаемо

Ваш toolchain доказывает компиляцию, типы и стиль. Он не доказывает того, от чего реально зависит безопасная правка: в каком модуле живёт требование, где проходят швы, правдив ли ещё вот этот комментарий, какой контракт только что нарушила ошибка, что вообще разрешено было трогать этим диффом. Фронтирные модели уже хорошо генерируют код; нерешённая часть — остальной жизненный цикл: другая, зачастую более слабая модель позже читает и меняет этот код. Люди на каждом ревью заново выводят недостающую архитектуру. Агенты — угадывают её.

  • Крейт компилируется, clippy молчит — а ревьюер всё равно не видит, какие инварианты дифф поставил под удар.
  • Архитектура описана в документе, который перестал быть правдой два рефакторинга назад, — и ничто никогда не сверяет его с кодом.
  • Ошибка говорит, что́ сломалось, но не какой контракт нарушен, — и каждая отладка начинается с нуля.

Центральный закон

Держи поверхность кода внутри обучающего распределения. Всю строгость выноси в систему типов, контракты, метаданные и цикл верификации — вокруг кода, а не в его синтаксис.

Модели проваливаются на непривычном поверхностном синтаксисе — и восстанавливаются через циклы верификации и исполняемые помощники: два датированных сторонних результата, на которых стоит дисциплина и которые её манифест цитирует. Поэтому AI-Native Rust — не диалект: на уровне токенов это обычный идиоматичный Rust, и то же верно для TypeScript и Go. Меняется конверт — и каждое правило в нём поставляется с чекером, потому что правило, которое модель должна помнить, распадается, а правило, которое проверяет машина, держится.

Манифест помечает собственные утверждения тегами [E-strong], [E-mid], [E-hyp] — подтверждено бенчмарками, смежными свидетельствами или гипотеза, которую обязан проверить пилот. Дисциплина, называющая свои режимы отказа, надёжнее той, что их прячет.

Spec-Driven — честно

«Настоящий» Spec-Driven Development — когда на каждое изменение весь код перегенерируется из спецификации — недостижимая мечта: ни у кого нет столько денег. Эта дисциплина устроена наоборот. Спецификация задаёт контракт, код — его техническая реализация, и на детали низкоуровневой реализации нет контракта лучше, чем сам код. Поэтому спека и код связаны трассируемыми, проверяемыми рёбрами — а не перегенерацией.

Архитектура

Одно нейтральное ядро, спроецированное на языки

Языконезависимое ядро поставляет манифест, формат карточек-паттернов, каталог девяти классов исполняемых scaffold’ов, операционные плейбуки и нейтральные движки: проверку соответствия, трассируемость, инертный тег-макрос. Каждый языковой стек проецирует ядро через собственный экстрактор фактов и четыре бинаря-гейта, добавляет тайп-оракул времени генерации, языковой гайд, девять карточек в форме языка и два агентских скилла. Политика остаётся у вашего проекта — какие ячейки под гейтом, какие исключены и почему. Пакеты поставляют движки, но никогда — политику.

Каждый стек поставляется и как MCP-сервер (*-ai-native-mcp) — та же командная поверхность плюс тайп-оракул для любого MCP-совместимого агента; один только Rust-сервер отдаёт восемнадцать инструментов. Дистрибуция — vibe: пакет-агрегатор на язык закрепляет стек, сервер и ядро одним разрешённым набором версий.

Линия раздела

Что доказывает ваш toolchain — и что добавляет гейт

Дисциплина ничего не удаляет. Floor каждого языка сначала прогоняет ваши привычные инструменты в фиксированном порядке, а затем добавляет три собственных гейта: conform — структура, specmap — трассируемость, test-gate — базлайн. Одна команда, один код выхода.

Rust

уже у вас

  1. fmt
  2. test
  3. clippy
  4. conform
  5. specmap
  6. test-gate

добавляет гейт

  • Изоляция ячеек: cell импортирует швы и ядро, но никогда — соседние cells.
  • Без unwrap в доменной логике: паникующий путь требует контракта ошибки или записанного отклонения.
  • Enum ошибок цитирует требование, которое защищает, — прямо в тексте ошибки.
  • Бюджет файла; инварианты не тонут в средней трети файла.

TypeScript

уже у вас

  1. prettier
  2. tsc
  3. tests
  4. eslint
  5. conform
  6. specmap
  7. test-gate

добавляет гейт

  • Перепись unsafe-набора: as, any, non-null !, @ts-ignore становятся findings, если не несут записанного отклонения.
  • Изоляция ячеек по import-спецификаторам.
  • Чтение окружения легально только в composition root.
  • Типы ошибок на швах цитируют своё spec://-требование.

Go

уже у вас

  1. gofmt
  2. vet
  3. tests
  4. staticcheck + exhaustive
  5. conform
  6. specmap
  7. test-gate

добавляет гейт

  • Изоляция ячеек на грануле пакета плюс перепись банов с показаниями об отклонениях.
  • Директивы //spec: питают коммитимый индекс с orphan-ratchet’ом на грануле пакета.
  • Исчерпываемость закрытых множеств несёт exhaustive: в Go нет sum-типов, и гейт опирается на носителя из экосистемы.
  • test-gate работает в режиме xfail-strict поверх go test -json.

Механизмы

Пять вещей, которые можно потрогать

  1. Трассируемость, переживающая рефакторинги

    Код несёт инертные теги — не более трёх рёбер на элемент, с типами implements | verifies | documents | deviates | informs. Движок specmap компилирует их в коммитимый детерминированный индекс: с одной стороны — единицы спецификации, с другой — элементы кода. Инвалидация асимметрична по замыслу: поднимите ревизию спец-единицы — её рёбра станут подозрительными; правьте код — рёбра держатся. Элемент, потерявший якорь, — сирота, которую ratchet отказывается принимать. В этом разница между архитектурой, которую выводят заново, и архитектурой, которой задают вопросы.

    до
    #[derive(Debug, Error)]
    pub enum Error {
        #[error("invalid package reference `{input}`")]
        InvalidRef { input: String },
    }
    под дисциплиной
    #[derive(Debug, Error)]
    #[spec(implements = "spec://…#package-identity")]
    pub enum Error {
        #[error(
            "invalid package reference `{input}`: \
             {reason} \
             (violates spec://…#pkgref; \
              fix: `[kind:][group/]name[@version]`)"
        )]
        InvalidRef { input: String, reason: String },
    }

    Сокращено из vibe-core самого пилота. Отказ теперь называет нарушенный контракт и поверхность исправления — и для ревьюера, и для следующего агента; гейт error-enum-cites-req держит это в силе.

    То же ребро в каждом языке:

    #[spec(implements = "spec://…#anchor")]
    /** @implements spec://…#anchor */
    //spec:implements spec://…#anchor r=1
  2. Floor: одна команда, один код выхода

    rust-ai-native floor, typescript-ai-native floor, go-ai-native floor. Сначала форматтеры, компиляторы, линтеры и тесты; затем, в той же панели, — гейты дисциплины. Каждая строка политики печатает своё происхождение, а политика по умолчанию объявляет себя сама: не доверяйте зелёному, которого не настраивали. Проверка детерминирована: одинаковые входы — байт-в-байт идентичный SARIF, и никакой модели в контуре проверки.

  3. Ratchet, или как живой репозиторий это внедряет

    init записывает позу до внедрения: каждый крейт или cell исключён — с записанной причиной; единственное жёсткое требование — workspace компилируется. Дальше движение одностороннее: осушите юнит до нуля findings, переведите его в список gated — и перевод никогда не расширяет базлайн. Существовавшие findings замораживаются в conform-baseline.json; новые валят гейт; базлайн только уменьшается. Тестовый гейт строг в духе xfail: он падает и на новом падении, и на неожиданном проходе, который никто не повысил, — так базлайн уменьшается честно.

    {
      "findings": [],
      "schema": 1
    }
    Собственный conform-baseline.json проекта vibevm — сегодня и целиком: каждый крейт вошёл под гейт с нулём findings.
  4. Баны несут аварийные люки

    Запрещённые по умолчанию конструкции остаются легальными — с машинерией и записанной причиной. Совпавшее отклонение понижает finding до deviation-acknowledged: видимо, посчитано, доступно ревью — вместо замалчивания. Дисциплина сама формулирует симметрию: бан без люка — баг дисциплины; отклонение без причины — баг кода.

    #[spec(deviates, reason = "platform ctor runs single-threaded, pre-main")]
    Реальная форма отклонения из пилота: причина едет вместе с кодом, и гейт её читает.
  5. Тайп-оракул во время генерации

    Перед нетривиальной правкой агент может проверить гипотетическое содержимое файла — несохранённое, поверх оверлеев в памяти — у собственного анализатора языка: rust-analyzer, typescript вашего проекта, gopls. Оракул подмешивает в ответы правила conform того же гейта (validate / scope / complete / type), и нарушение дисциплины всплывает раньше, чем существует дифф. Честность прописана в брифе: анализатор — не компилятор; чистый validate сокращает путь до зелёного, но истиной остаётся floor.

    vibe bin exec rust-ai-native-tcg -- validate src/cells/edit.rs --content-from -
    Отдаётся и по MCP: tcg_validate / tcg_scope / tcg_complete / tcg_type.

Семейство

Три проекции, одна планка

Паритет — закон дисциплины, а не пожелание: ни одна языковая проекция не вправе применять дисциплину слабее другой без записанной причины. Там, где в языке действительно нет аналога идиомы, пробел фиксируется — причина и есть аварийный люк, и никогда — молчание.

пилот

AI-Native Rust

Borrow checker — уже верификатор, и проекция опирается на него: typestate и newtypes на швах, доменная логика без паник, компилируемые доктесты на каждый публичный шов. Дальше всех — эталонная планка, по которой меряют остальные проекции.

вторая проекция

AI-Native TypeScript

У TypeScript есть опасность, которой нет у Rust: систему типов можно победить двумя словами. Поэтому гейт берёт под перепись сами лазейки — as, any, !, @ts-ignore, — а нетипизированные данные входят как unknown и сужаются рантайм-валидаторами на границе стирания типов. Взамен — самая зрелая экосистема codemod’ов и Compiler API среди мейнстрим-языков.

третья, новейшая

AI-Native Go

Sum-типов нет, поэтому исчерпываемость закрытых множеств несёт собственный носитель экосистемы — рядом с gofmt, vet и staticcheck. Экстрактор фактов — чистая stdlib Go: единственный внешний процесс на критическом пути — официальный инструментарий самого языка. Рабочий пилот — миниатюрный reconciler с зелёной цепочкой целиком.

За пределами этих трёх: C++ и Python существуют в спецификации движка как строки, явно помеченные «specified, not built». Они станут стеками по продуктовому решению — не тихо.

Dogfood

Обкатано на коде, который это и поставляет

Дисциплина — самостоятельный продукт, а VibeVM — её первый пилот, но не граница применения. CLI vibe — Rust-workspace в несколько десятков крейтов — прогоняет гейты на себе: большинство крейтов под гейтом, остальные исключены с записанными причинами, а ratchet-базлайн сегодня пуст. Его коммитимый индекс трассируемости несёт тысячи спец-единиц и рёбер. В той же семье под теми же гейтами живут Rust-движок Zap и его TypeScript-клиент — один только клиент держит под гейтом десятки cells при шестизначном числе строк. Lock-файл закрепляет точную версию дисциплины, которую гоняет пилот, а бумажный след кампании внедрения — базлайн, журнал, отчёт — лежит в дереве.

  • Sweep-идиомы в Rust-гайде — tests-out split, restructure-beats-testify, flip-only-after-drain — извлечены из собственных кампаний пилота, у каждой записаны свои грабли.
  • Корпус спецификаций аудирует сам себя: утверждения, обогнавшие код, аннотированы «specified, not built» прямо на месте, вплоть до файла и строки. Именно машинерия трассируемости делает такую проверку возможной.
  • Чего мы не утверждаем: ни цифр производительности, ни статистики внедрения, ни измеренной дельты продуктивности. Доказательная база дисциплины процитирована и промаркирована в манифесте; собственные метрики пилота — впереди.

Статус, прямо

Исследовательская бета, называющая свои режимы отказа

Проверено сегодня

  • Нейтральные движки, три языковых стека и MCP-серверы поставляются и работают.
  • Гейты держатся на трёх реальных кодовых базах — CLI vibe, движок Zap, клиент Zap.
  • Рабочие демо-проекты всех трёх языков лежат в дереве пилота; Go-демо документирует всю цепочку зелёной.
  • Brownfield-реестры — долг с закатами, xfail-strict базлайны тестов, намерения с гарантией переноса — в работе на пилоте.

Исследуется

  • Перенос — центральный открытый вопрос: свидетельства про исполняемые scaffold’ы касаются генерации; переносится ли преимущество на модификацию — ровно то, что пилот обязан фальсифицировать.
  • Доставка карточек — boot-инструкция, которой следует сессия, а не вычисляемое сопоставление триггеров.
  • Более глубокие семантические правила ждут — по записанному решению — второй проверки, которой нужны типы.

Не обещано

  • Стабильность. Это бета: правила, имена и набор проверок будут меняться.
  • Языки за пределами Rust, TypeScript и Go.
  • Собственные бенчмарки — каждая карточка несёт фальсифицируемое предсказание вместо измерения, и чтение тегов зрелости — часть пользования дисциплиной.

Приглашение — попробовать дисциплину, прочитать манифест и поспорить с ним, а не поверить обещанию стабильности.

Старт

Внедряйте так, как велит протокол: постепенно

  1. $vibe install org.vibevm.ai-native/rust-ai-native

    Один агрегатор на язык — рядом typescript-ai-native и go-ai-native — закрепляет стек, его MCP-сервер и нейтральное ядро одним разрешённым набором версий. Нет vibe? Установите VibeVM →

  2. $rust-ai-native init

    Записывает в репозиторий позу до внедрения: conform.toml, где каждый крейт исключён-с-причиной, specmap.toml с резолюцией внешних спецификаций, реестры долга и намерений. Ничего ещё не под гейтом — а каждый инструмент уже полезен при нуле процентов внедрения.

  3. $rust-ai-native floor

    Сначала ваши привычные инструменты, затем гейты дисциплины, один код выхода. Зелёный значит: нет регресса относительно инвентаря — честное определение для репозитория на полном ходу.

  4. Осушите одну ячейку — переведите под гейт

    Выберите один крейт или cell, осушите его findings до нуля, переведите в список gated — базлайн только уменьшается. Скиллы terraform и sweep несут процедуры как slash-команды ваших агентов.

Одним абзацем

AI-Native Rust, TypeScript и Go — одна инженерная дисциплина, спроецированная на обычные языки: код остаётся идиоматичным и внутри распределения, а ячейки, контракты, трассируемость «спецификация ↔ код» и показания об отклонениях живут в машинно-проверяемом конверте — под детерминированными гейтами рядом с вашим форматтером, компилятором и линтером, и внедряются покрейтово под ratchet, который только уменьшается. Исследовательская бета, обкатанная на самом VibeVM: vibe install org.vibevm.ai-native/rust-ai-native.